- EPSS
- prioritisation
EPSS score explained for Kubernetes operators
EPSS score explained: what the 30-day exploitation probability means, how to read its percentile, which threshold to act on, and how it reorders a CVSS-sorted list.
StackRadar Team
8 min read
An EPSS score is the probability, from 0 to 1, that a CVE will be exploited in the wild in the next 30 days. CVSS says how bad a vulnerability would be; EPSS says how likely anyone is to use it. The difference matters because your vulnerability list is almost certainly sorted by CVSS, and that is how a team ends up patching a never-exploited 9.8 in an image library while the 8.1 in OpenSSH with public exploit code waits on the second screen.
EPSS is free, updated daily and covers every published CVE, and most scanners already show it. This post covers how to read the score and its percentile, which threshold to act on, what it does to a CVSS-sorted list, and where it falls short.
What an EPSS score measures
EPSS, the Exploit Prediction Scoring System run through FIRST.org, publishes one number per CVE per day: the probability of exploitation in the wild in the next 30 days. It is a model output, trained on exploitation activity reported by data partners and fed features such as the CVE's age, the affected vendor, whether exploit code is public, whether it appears on exploitation lists such as CISA KEV, its references, CWE and CVSS vector. The model is refit every year or two. The current version, EPSS v5 (model v2026.06.15), started publishing on 15 June 2026, replacing v4 from March 2025.
Three consequences are easy to miss:
- It is a probability, not a rating. 0.05 means five in a hundred. The median CVE scores below 0.01, so "high" starts far lower than intuition says.
- It is about the CVE, not about you. EPSS knows nothing about whether the package is in your images, whether the vulnerable code path is reachable, or whether the pod is exposed. It is one input to prioritisation, not a verdict.
- It moves. A CVE can sit at 0.004 on the day it is published and above 0.5 a week later once an exploit is public. A decision based on the score has to be re-evaluated daily.
Score versus percentile: read one, compute with the other
Every EPSS record carries two numbers, and they do different jobs:
{
"cve": "CVE-2023-45853",
"epss": "0.031790000",
"percentile": "0.875660000",
"date": "2026-09-27"
}The score is the probability: about a 3% chance of exploitation in the next 30 days. The percentile is the share of scored CVEs with a lower score: this one outranks about 88% of them. Read the percentile when a score looks small, because the distribution is so skewed that 3% puts a CVE near the top eighth.
Never compute with the percentile. It is uniform by construction, so a formula that multiplies by it treats the median CVE as having a 50% chance of exploitation, when its actual score is below 1%.
Which EPSS threshold to act on
FIRST publishes no threshold. Its FAQ calls 0.1 "commonly cited in the field but carries no special authority", and the right cut-off depends on how much your team can fix. This is where the common thresholds fall in the full daily file:
| EPSS | Share of scored CVEs (27 Sept 2026) | Common use |
|---|---|---|
| ≥ 0.5 | ~1% | Treat like KEV: this week |
| ≥ 0.1 | ~4.5% | "Patch this cycle"; the usual SLA trigger |
| ≥ 0.01 | ~39% | Scheduled maintenance |
| < 0.01 | ~61% (median ≈ 0.007) | Closed by base-image rebuilds, not one by one |
These shares drift daily and jump when a new model version ships, so treat them as bands. A workable policy for a platform team:
- Everything in CISA KEV, regardless of EPSS. KEV is an observation of exploitation; EPSS is a prediction.
- EPSS ≥ 0.1, sorted by CVSS.
- Everything else, closed in bulk by moving to newer base images and chart versions rather than one ticket per CVE.
A worked example: five CVEs, re-sorted
Take five CVEs that turn up in many Debian-based images, the kind any cluster with an ingress controller and a few Python or Node services produces. Sorted by CVSS, they look like this. The EPSS values are illustrative, rounded to keep the arithmetic readable, and are not a snapshot of any one cluster or day. The KEV column is fact.
| # | CVE | Package | CVSS | EPSS | KEV |
|---|---|---|---|---|---|
| 1 | CVE-2023-45853 | zlib (minizip) | 9.8 | 0.004 | — |
| 2 | CVE-2024-45491 | expat | 9.8 | 0.002 | — |
| 3 | CVE-2024-45492 | expat | 9.8 | 0.002 | — |
| 4 | CVE-2023-4863 | libwebp | 8.8 | ~0.6 | Yes |
| 5 | CVE-2024-6387 | openssh (regreSSHion) | 8.1 | ~0.4 | — |
The three 9.8s are real flaws in packages found in a great many images, and nothing says anyone is using them; the minizip one sits in a contrib component most software built on zlib never uses. Number four is the libwebp heap overflow that was exploited in the wild and has been in the KEV catalogue since September 2023. Number five is the OpenSSH regression that had proof-of-concept code circulating within days of disclosure.
Now sort by Radar Score contribution, which weights CVSS by exploitation likelihood and treats KEV as certainty (contribution = 100 × CVSS/10 × likelihood):
| # | CVE | CVSS | Likelihood | Contribution |
|---|---|---|---|---|
| 1 | CVE-2023-4863 (KEV) | 8.8 | 1.00 | 88 |
| 2 | CVE-2024-6387 | 8.1 | ∛0.4 ≈ 0.74 | 60 |
| 3 | CVE-2023-45853 | 9.8 | ∛0.004 = 0.16 | 16 |
| 4 | CVE-2024-45491 | 9.8 | ∛0.002 = 0.13 | 12 |
| 5 | CVE-2024-45492 | 9.8 | ∛0.002 = 0.13 | 12 |
The bottom two rows became the top two. Real scores make the gap wider, not narrower: on 27 September 2026, EPSS had the libwebp CVE at 0.9998 and regreSSHion at 0.995, and the three 9.8s between 0.011 and 0.032. Same order, with the openssh finding at 81.
Across a whole cluster the effect is larger than five rows suggest. Only about 4.5% of scored CVEs reach EPSS 0.1, and KEV lists fewer than 2,000 CVEs, so the findings that clear either bar are a small slice of a typical list, usually concentrated in a handful of images. The rest are not ignored. They are closed in bulk by the same chart bumps and base-image rebuilds, so nobody has to triage them one at a time.
Where EPSS is weak
- No CVE, no score. GHSA and PYSEC advisories without a CVE alias, and every
MAL-malware record, are unscored. A scanner has to pick a rule: "treat as zero" buries real findings and "treat as one" floods the top. StackRadar gives them a deliberately low default (the likelihood of an EPSS score of 0.001) and showsEPSS —. - It lags on brand-new CVEs. The model has few signals on day one, so a CVE with a working exploit on GitHub can sit low until the score catches up. KEV and vendor advisories are the day-one signal.
- Scores step when the model changes. Every new version shifts the whole distribution on the day it starts publishing. If your SLA is keyed to a fixed EPSS number, expect findings to cross it in bulk that day, in either direction.
- It knows nothing about reachability. A high-EPSS CVE in a library your binary never calls still shows up as a high-EPSS CVE. VEX statements are the tool for that, and they are a separate, slower conversation.
Using EPSS tomorrow
If your scanner shows EPSS, sort by it once and look at what moves. If it does not, the API takes a comma-separated list of CVE IDs, and the full daily file is one download:
# a few CVEs
curl -s "https://api.first.org/data/v1/epss?cve=CVE-2023-4863,CVE-2024-6387"
# every scored CVE (first line names the model version)
curl -sL https://epss.empiricalsecurity.com/epss_scores-current.csv.gz | gunzip | headIn StackRadar every finding carries its EPSS score and percentile, re-synced daily with KEV, and the contribution ranking above is the default order, so nobody has to do the join by hand.
You can see that order on a sample cluster in the live demo without signing up. To check your own cluster first, the free StackRadar CLI scans every running image from your laptop and flags the CVEs that are on the KEV list.
Frequently asked questions
What is an EPSS score?
An EPSS score is a probability, between 0 and 1, that a given CVE will be exploited in the wild within the next 30 days. FIRST.org’s Exploit Prediction Scoring System publishes one every day for every published CVE, with a percentile that says where the CVE ranks against all other scored CVEs. A score of 0.05 means a 5% chance; the median CVE scores below 0.01.
How is EPSS different from CVSS?
CVSS measures severity: how bad exploitation would be, judged from the vulnerability’s technical characteristics, and it rarely changes. EPSS measures likelihood: how probable exploitation is in the next 30 days, predicted from exploitation telemetry and many other signals, and it changes daily. A CVE can be CVSS 9.8 and EPSS 0.002 at the same time, and plenty of critical CVEs are.
What is a good EPSS threshold to act on?
FIRST publishes no official cut-off; its own FAQ calls 0.1 commonly cited but without special authority. As reference points: in September 2026 about 4.5% of scored CVEs sat at or above 0.1, and about 1% at or above 0.5. A common policy is "KEV first, then EPSS ≥ 0.1 sorted by CVSS, then the rest in bulk".
What does the EPSS percentile mean?
The percentile is the share of all scored CVEs with a lower EPSS score. A percentile of 0.95 means the CVE is more likely to be exploited than 95% of CVEs. Use it to read a score in context (0.03 sounds low but is around the 88th percentile), never to calculate with, because it is uniform by construction.
Where do I get EPSS scores?
Two free sources, no registration: a JSON API at api.first.org/data/v1/epss, queried by CVE ID, and the full daily CSV at epss.empiricalsecurity.com/epss_scores-current.csv.gz. Most scanners and vulnerability platforms, StackRadar included, sync the daily file and show the score and percentile beside each finding.
Does EPSS cover vulnerabilities without a CVE?
No. EPSS scores published CVEs only. A GHSA or PYSEC advisory with no CVE alias, and every malware (MAL-) record, has no EPSS score. A scanner has to decide how to rank those; StackRadar gives them a deliberately low default likelihood (what an EPSS score of 0.001 would produce), so they rank on CVSS alone, a little below a median CVE of the same severity, and shows "EPSS —" rather than an invented number.
More from the blog
All postsA new CVE should not need a new scan: how we keep 900,000 advisories current
Most scanners match an image once, when it is scanned. We mirror OSV.dev every hour, EPSS and KEV every day, and re-match every stored SBOM when the mirror changes. How, and what it does not solve.
10 min read
Most of your container vulnerabilities are not yours to fix
A container scan mixes three kinds of finding: your dependencies, the base image, and images someone else builds. How to separate them without hiding an exploited CVE.
7 min read
CISA KEV: which of your running Kubernetes images are on the list
What the CISA KEV catalogue is, why it should be your first filter, and a free kubectl + curl script that checks every image running in your cluster against it.
9 min read
StackRadar is open source: a self-hosted Kubernetes vulnerability dashboard under AGPL-3.0
The server, the dashboard and the Helm chart are on GitHub under AGPL-3.0, the scanner and CLI under Apache-2.0. One Helm command installs the lot in your cluster, with no telemetry and nothing leaving it. What is open, why these licences, and where the cloud fits.
8 min read