Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse varius enim in eros elementum tristique. Duis cursus, mi quis viverra ornare, eros dolor interdum nulla, ut commodo diam libero vitae erat. Aenean faucibus nibh et justo cursus id rutrum lorem imperdiet. Nunc ut sem vitae risus tristique posuere.
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse varius enim in eros elementum tristique. Duis cursus, mi quis viverra ornare, eros dolor interdum nulla, ut commodo diam libero vitae erat. Aenean faucibus nibh et justo cursus id rutrum lorem imperdiet. Nunc ut sem vitae risus tristique posuere.
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse varius enim in eros elementum tristique. Duis cursus, mi quis viverra ornare, eros dolor interdum nulla, ut commodo diam libero vitae erat. Aenean faucibus nibh et justo cursus id rutrum lorem imperdiet. Nunc ut sem vitae risus tristique posuere.
Vulnerability prioritization is the process of deciding which security findings to fix first, based on how likely each one is to be exploited in your environment and what an attacker would gain if it were. A severity score alone can't make that decision.
Good prioritization combines four signals: severity (CVSS), threat (EPSS and the CISA KEV catalog), reachability and exposure in your own code and cloud, and business impact.
This guide explains each method, compares the main frameworks side by side, gives a step-by-step process for how to prioritize vulnerabilities, and walks through real examples of findings that moved up or down once context was added.
Vulnerability prioritization ranks open findings so a team with limited time fixes the riskiest ones first. Its output is an order, not a score: the list of things to work on this week, and the things that can wait.
It helps to separate two ideas that most scanners blur:
Two teams can see the same CVE at the same severity and correctly give it very different priorities. That gap is why risk-based vulnerability prioritization exists.
Scanners find far more than any team can fix, and much of what they find doesn't matter. Across five Nullify production tenants, 57% of 14,847 SAST findings triaged over 90 days were ultimately classified as false positives. Ranking by severity alone puts those findings in the same queue as the real ones.
The problem gets worse with dependency and container findings, where severity is often inherited from the worst case:
The other side of the problem is real exploitation. CISA's Known Exploited Vulnerabilities catalog listed 1,766 entries when we checked it on November 1, 2026, and CISA asks organizations to use it as an input to their prioritization framework.
In June 2026, CISA's BOD 26-04 moved federal agencies from fixed deadlines to risk-based remediation timelines. Prioritization is now the expected way to run a vulnerability program, not an optimization.
Most programs combine several of these methods. Each answers a different question.
Rank by the CVSS base score or the severity label the scanner assigns. It's simple and universal, and every scanner supports it.
It's also the method that causes most queue noise, because a base score describes the vulnerability anywhere in the world, not in your deployment.
Use it for: a first sort, and a tiebreaker. Don't use it alone.
Rank by evidence that attackers are using a vulnerability, or are likely to. The two common inputs are:
Threat data tells you what attackers are doing in general. It doesn't tell you whether the vulnerable code runs in your application.
Rank by whether the vulnerable code can actually be reached. That ranges from "is the package imported at all" to "does untrusted input flow into the vulnerable function." Reachability is the single biggest noise filter for dependency findings, and it also catches SAST findings in dead code, test fixtures and disabled features.
Rank by whether the affected workload is deployed and reachable from the internet. This needs cloud context: which image runs where, and what sits in front of it. An internet-facing service behind a public load balancer outranks the same code in an internal batch job.
Rank by what the affected system does: the data it handles, the customers who depend on it, and the trust boundaries around it. The same vulnerability in a customer-facing authentication flow and an internal reporting tool has the same severity and a very different priority.
Risk-based prioritization combines the signals above into one score or tier. Most commercial tools do this, and the good ones show which inputs moved the score.
A composite score is only as trustworthy as its explanation: if you can't see why a finding ranked where it did, the team will rescore it by hand.
These are the public frameworks most programs build on. None of them is a complete vulnerability prioritization framework on its own, so most teams layer two or three.
| Framework | Maintained by | Question it answers | Output | Main gap |
|---|---|---|---|---|
| CVSS v4.0 | FIRST | How bad is this vulnerability in the worst case? | 0–10 score; labeled CVSS-B, -BT, -BE or -BTE by the metric groups used | Base scores ignore threat and your environment |
| EPSS | FIRST | How likely is exploitation in the next 30 days? | 0–1 probability plus percentile, daily | Says nothing about your deployment |
| CISA KEV | CISA | Is this being exploited in the wild today? | Yes or no, with required actions | Lags new exploitation; binary |
| SSVC | CISA and CMU SEI | What should we do about it? | Track, Track\*, Attend or Act | Needs your own inputs for mission and impact |
| BOD 26-04 factors | CISA | How fast must this be fixed? | Risk-based remediation timelines | Written for federal systems; adapt the factors |
CVSS v4.0 has four metric groups: Base, Threat, Environmental and Supplemental. The specification asks that scores be labeled by the groups used, so a score built only from Base metrics is "CVSS-B."
FIRST says Threat and Environmental assessment is not required but "highly recommended for more meaningful results." The scores scanners pass through are usually Base-only, which is why raw CVSS overstates so much.
EPSS is a probability, not a severity. A CVE with a CVSS of 9.8 can have a very low EPSS, and a Medium can have a high one. Use EPSS to pull likely-exploited findings forward and to push down findings with no exploitation signal. See the EPSS glossary entry for how the score is built.
KEV is the strongest single threat signal because it's confirmed, not predicted.
Treat a KEV listing as a floor: it can still be deprioritized if the vulnerable code genuinely isn't deployed, but it shouldn't disappear from view because of a static analysis "no."
SSVC replaces a number with a decision. CISA's tree walks five decision points (exploitation status, technical impact, automatable, mission prevalence and public well-being impact) and ends in one of four actions:
SSVC is useful because it makes the decision explicit. Its weakness is that "mission prevalence" and "impact" need context most scanners don't have.
BOD 26-04 sets urgency from four factors: whether the asset is publicly exposed, whether the CVE is in the KEV catalog, whether exploitation can be fully automated, and how much control exploitation gives an attacker. It's a good template for any team's SLA tiers, even outside government.
To prioritize vulnerabilities, start from severity, then let threat, reachability, exposure and business context reorder the list. Each step answers one question about a finding. Run them in this order and recompute whenever the inputs change.
These examples come from findings Nullify triaged and wrote up on its blog. Each shows a priority that a severity score got wrong.
On a customer-facing UI repository at a financial-services company, an axios finding was labeled Critical. The app is a React single-page app served through a CDN, so the code runs in the browser, not in a Node server where the vulnerable path applies.
The finding was downgraded to Negligible. A Babel helpers package also dropped, because it's only used at build time.
The same review kept form-data and follow-redirects elevated, because they really do ship in the browser bundle behind a document-upload flow that handles identity documents and bank statements. Priority moved in both directions on the same repository.
The Go 1.24.1 finding above bundled 32 CVEs. With per-CVE reachability, 21 were provably unreached and dropped out of the severity rollup, 6 were unreached with only medium confidence and moved down one band, 2 were unknown and kept their severity, and 3 were confirmed reachable. The finding correctly landed at Medium instead of Critical.
At a workforce platform, source-code findings were re-triaged against the full infrastructure path: load balancer, target group, ECS service, image, code. About a third of the noise was cut and several false positives were confirmed.
A handful of findings were escalated to Urgent, because tracing the path proved they were reachable through internal load balancers serving production traffic.
The lesson from all three: context isn't a discount. A prioritization method that only ever lowers scores is just a filter. One that also raises them is tracking real risk.
Use this to check your current process, whatever tools you run:
Nullify keeps one prioritized backlog across code vulnerabilities, leaked secrets, cloud misconfigurations, supply-chain risks and validated pentest findings. Each item is scored 0 to 100 on severity, exploitability, reachability and business impact, not raw CVSS.
Actively exploited vulnerabilities and zero-days that affect technologies you use move up the backlog automatically, and findings are re-triaged when code, dependencies or threat intel change. Your team's overrides persist through re-triage.
From there, prioritized findings turn into work: campaigns built from real findings, owners assigned from CODEOWNERS and commit history, and stalled fixes escalated in Slack with the SLA stated. See how the backlog is built on the security program management page.
No single framework is enough. Use CVSS for worst-case severity, EPSS and the CISA KEV catalog for threat, and your own reachability, exposure and business context for priority. SSVC is a useful way to turn those inputs into a clear decision: track, attend or act.
CVSS describes how severe a vulnerability would be if exploited. EPSS estimates the probability that it will be exploited in the wild in the next 30 days. A high CVSS with a low EPSS is serious but rarely targeted. A high EPSS means attackers are likely to use it, whatever its severity.
Ask four questions about each critical finding: can untrusted input reach the vulnerable code, is the workload deployed and exposed, is the CVE known or likely to be exploited, and what does the affected system handle? Findings that pass all four go first. Most "criticals" fail at least one.
No. Reachability should lower a finding's priority, not delete it. Static analysis can miss reflection, dynamic imports and framework wiring, so a "not reachable" verdict needs a confidence level. Keep the finding on record and re-check it when the code changes.