The Radar Score
How the Radar Score uses the EPSS score, the CISA KEV catalogue and CVSS to rank what to fix first — the published formula, worked examples, and the thresholds that matter.
Every vulnerability feed can tell you a flaw is severe. Almost none can tell you it is likely to matter: fewer than 5% of CVEs are ever exploited at all, and CVSS alone happily ranks a never-exploited 9.8 above the 5.3 attackers are using today. The Radar Score exists to fix that: one number per image, workload, release, cluster or organization, summed from per-finding contributions that weight severity by real-world exploitation. And unlike the proprietary risk numbers shipped by most platforms, its formula is published here in full — every input is a public fact with a URL.
Each finding's contribution: likelihood × consequence
Every finding contributes 0 to 100 points, computed from its advisory alone; a thing's Radar Score is the sum of its findings' contributions:
contribution = 100 × impact × exploitability # per finding, 0–100
Radar Score = Σ contributions # per image, workload, cluster, org
impact = CVSS base score / 10 # how bad, if exploited
exploitability = 1.0 if in CISA KEV # observed, not predicted
∛ EPSS probability if EPSS exists # cube root — see below
0.10 otherwise # ≈ a typical CVEThe three inputs, and where each comes from:
- CVSS — the advisory's severity score, from the matched OSV advisory. It answers "how bad would this be if exploited?" and nothing else.
- EPSS — the exploitation probability published daily by FIRST.org, a prediction of how likely the flaw is to be exploited in the next 30 days.
- CISA KEV — the Known Exploited Vulnerabilities catalogue: flaws that have been observed exploited in the wild.
The inversion that is the whole point
| Finding | CVSS | Exploitation | Contribution |
|---|---|---|---|
| A critical on paper | 9.8 | EPSS 0.0004, not in KEV | 7 |
| A medium under active attack | 5.3 | In CISA KEV | 53 |
The multiplication is what makes this a ranking rather than a restatement of CVSS: 100 × (9.8 / 10) × ∛0.0004 ≈ 7, while 100 × (5.3 / 10) × 1.0 = 53. Most findings contribute single digits, and that is correct rather than something to rescale away — a list where almost everything sits near zero and a handful of findings do not is the finding.
Why the cube root of EPSS
Raw EPSS probabilities are unusable as a weight: the distribution is extreme, with a median around 0.0005 and a long thin tail. Multiplied in linearly, every finding outside the top thousandth becomes arithmetically indistinguishable from zero and the score collapses to "the one CVE with a big EPSS number". The cube root spreads the range out:
| EPSS probability | Likelihood term (∛) |
|---|---|
| 0.001 | 0.10 |
| 0.01 | 0.22 |
| 0.1 | 0.46 |
| 0.5 | 0.79 |
| 0.97 | 0.99 |
The cube root is a monotone transform, so it never changes which of two findings ranks first — only how far apart they sit. It also uses the EPSS probability, not the percentile: percentile is uniform by construction, so using it would assert the median CVE is moderately likely to be exploited, when FIRST.org's own finding is that under 5% ever are.
When data is missing
Both obvious rules for missing data are wrong: treating it as zero buries a real vulnerability because nobody modelled it, and treating it as maximal floods the top of the list with the unmodellable. So each gap has a documented, deliberate rule:
- No EPSS score: EPSS covers CVEs, so this is advisories with no CVE alias — some
GHSA-andPYSEC-records (most carry one and get its EPSS score), and everyMAL-. The likelihood term is 0.10, the same value a typical EPSS score produces. The finding ranks on its CVSS alone. The UI showsEPSS —for these, neverEPSS 0.10— the number is our assumption, not FIRST.org's finding. - No CVSS score (about a fifth of advisories, mostly distro ones that publish a severity band instead): a representative score for the band is assigned when the advisory is ingested — critical 9.5, high 7.5, medium 5.5, low 2.0 — so the finding ranks by its band rather than dropping to zero impact. The scoring SQL keeps its own band-to-score mapping as a backstop for any row that reaches it with a band but no stored score.
- Neither score nor band: 4.0, the middle of the scale.
- An unscanned image shows no score at all, never zero — "we haven't looked" is not "it's clean".
Why exposure sits beside the score, not inside it
Pod count, init-vs-serving, how long a finding has been open — none of it is folded into the number. These columns render next to the score instead, and the reason is the product's core credibility rule: every input to the Radar Score is a public fact with a URL you can check. A 1.15 multiplier for "runs in twelve pods" is not, and it is the part a security engineer would argue with first. Sorting by score and reading the pod count in the next column loses nothing, and keeps the number defensible.
The Radar Score itself: an unbounded sum
Images, workloads, Helm releases, clusters, and your whole organization each carry a Radar Score: the plain sum of their findings' contributions. The score is deliberately unbounded, because it is a magnitude, not a ranking — it answers "how much vulnerability debt does this carry?", it visibly falls as findings are fixed, and it composes: a cluster's Radar Score really is the sum of its images' Radar Scores.
What a sum gives up is worst-domination — five hundred trivial findings can outscore one exploited critical. That question is answered by two things that are never derived from the total: the colour band, which is always the band of the worst single finding in the rollup, and the KEV badge, which marks active exploitation regardless of where the finding sorts.
| Single finding's contribution | Band |
|---|---|
| 70 – 100 | Critical |
| 40 – 69 | High |
| 15 – 39 | Medium |
| 1 – 14 | Low |
The boundaries sit lower than CVSS's because a contribution is a product of two fractions, which compresses the reachable range: a CVSS 9.8 with typical exploitation pressure lands near 10, and only measured exploitation lifts a finding above 40. Reusing the CVSS bands would label nearly everything "low" and hide the ordering the contribution exists to produce.
When scores change
Each contribution is stored as a database column generated from the advisory's CVSS, EPSS and KEV fields, so it can never drift from its inputs. EPSS and the KEV catalogue are each re-synced daily — KEV right after EPSS — and each sync is the recomputation — when a flaw's exploitation probability jumps or it lands in KEV, every affected contribution, and every Radar Score summing it, moves with it. No rescan needed. How findings are produced in the first place is covered in vulnerability matching.
Frequently asked questions
What is an EPSS score?
EPSS (Exploit Prediction Scoring System) is a daily probability, published by FIRST.org, that a given CVE will be exploited in the wild within the next 30 days. It ranges from 0 to 1 — an EPSS score of 0.05 means a 5% chance — and it comes with a percentile that says how the CVE ranks against every other scored CVE. It is a prediction built from real exploitation telemetry, not a severity rating: a CVE can be CVSS 9.8 and EPSS 0.002 at the same time, and most are.
What is the CISA KEV catalog?
The Known Exploited Vulnerabilities catalog is a list maintained by the US Cybersecurity and Infrastructure Security Agency of CVEs with reliable evidence of active exploitation. Each entry records the date it was added and a due date by which US federal agencies must remediate it. Unlike EPSS, KEV is an observation rather than a prediction, which is why the Radar Score treats KEV membership as certainty instead of blending it with a probability.
What EPSS threshold should I act on?
There is no universal cut-off, but two reference points are widely used: an EPSS score of 0.1 (10%) corresponds to roughly the top 5–7% of all CVEs and is a common trigger for "patch this cycle", while the top 1% of CVEs sit above about 0.5. StackRadar hides findings that have no severity score by default, unless they are in KEV or have an EPSS score of 0.1 or more — those are always shown. If you need one rule, start with "KEV first, then EPSS ≥ 0.1 by CVSS, then everything else by Radar Score contribution".
Is the Radar Score CVSS × EPSS × KEV?
No. Each finding contributes 100 × (CVSS ÷ 10) × exploitability, where exploitability is 1.0 if the CVE is in the CISA KEV catalog, the cube root of its EPSS score if it has one, and 0.10 if it has neither. KEV replaces the likelihood term rather than multiplying it, and the cube root stops the score from collapsing to zero for the majority of CVEs whose EPSS is below 1%. The Radar Score for an image, workload, cluster or organization is the plain sum of its findings’ contributions.
Why does a finding with CVSS 9.8 rank below one with CVSS 7.5?
Because the 7.5 is being exploited and the 9.8 is not. A CVSS 9.8 with a typical EPSS score contributes around 10 points; a CVSS 7.5 in the KEV catalog contributes 75. Roughly 5% of CVEs are ever exploited, so severity alone ranks the wrong things first. The colour band still reflects the worst single finding, so a critical is never hidden — it is just not necessarily at the top of the list.
How often are EPSS and KEV updated in StackRadar?
Both are re-synced daily from their sources, FIRST.org and CISA. Each finding’s contribution is a database column generated from those fields, so the sync is the recomputation: when a CVE’s EPSS score jumps or it is added to KEV, every Radar Score that includes it moves the same day, without rescanning any image.
Next steps
- Vulnerability matchingHow StackRadar matches SBOM components against 900K+ OSV.dev advisories: PURL matching, version-range evaluation from npm to Debian and RPM, and confidence.
- Plans, retention & deletionWhat each StackRadar plan’s history window keeps, what happens when you downgrade or cancel, and how to delete clusters, organizations, and all stored data.