Nullify

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: Methods, Frameworks, and Examples

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.

What is vulnerability prioritization?

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:

  • Severity is the worst-case impact of a vulnerability, assuming it's real and reachable. It's a property of the vulnerability.
  • Priority is how urgently you should act on it. It's a property of the vulnerability in your environment, so it folds in exploitability, reachability, exposure and what the affected system does.

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.

Why vulnerability prioritization matters

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:

  • One finding, 32 CVEs. A Go 1.24.1 standard library finding bundled 32 CVEs and was labeled Critical because the label was the maximum across all of them. Checked CVE by CVE, the code the application actually reached put the finding at Medium.
  • A thousand criticals that never shipped. A scan of a Debian build-stage image flagged well over a thousand CVEs as Critical. None of them crossed into the runtime image, because the multi-stage Dockerfile never copied those packages forward.

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.

Vulnerability prioritization methods

Most programs combine several of these methods. Each answers a different question.

Severity-based prioritization

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.

Threat-based prioritization

Rank by evidence that attackers are using a vulnerability, or are likely to. The two common inputs are:

  • EPSS, which estimates the probability that a CVE will be exploited in the wild in the next 30 days. FIRST publishes EPSS scores daily for every published CVE.
  • The KEV catalog, which lists vulnerabilities CISA has confirmed are exploited in the wild.

Threat data tells you what attackers are doing in general. It doesn't tell you whether the vulnerable code runs in your application.

Reachability-based prioritization

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.

Exposure-based prioritization

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.

Business-impact prioritization

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 vulnerability prioritization

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.

Vulnerability prioritization frameworks compared

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.

FrameworkMaintained byQuestion it answersOutputMain gap
CVSS v4.0FIRSTHow bad is this vulnerability in the worst case?0–10 score; labeled CVSS-B, -BT, -BE or -BTE by the metric groups usedBase scores ignore threat and your environment
EPSSFIRSTHow likely is exploitation in the next 30 days?0–1 probability plus percentile, dailySays nothing about your deployment
CISA KEVCISAIs this being exploited in the wild today?Yes or no, with required actionsLags new exploitation; binary
SSVCCISA and CMU SEIWhat should we do about it?Track, Track\*, Attend or ActNeeds your own inputs for mission and impact
BOD 26-04 factorsCISAHow fast must this be fixed?Risk-based remediation timelinesWritten for federal systems; adapt the factors

CVSS v4.0

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

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.

CISA KEV

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

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:

  • Track: no action now; fix within standard timelines.
  • Track\*: watch closely for changes; fix within standard timelines.
  • Attend: escalate to supervisors; fix sooner than standard timelines.
  • Act: involve leadership; fix as soon as possible.

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 factors

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.

How to prioritize vulnerabilities

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.

  1. Separate severity from priority. Keep the scanner's severity as its own field and give every finding a separate priority.
  2. Rank CVEs, not bundles. Split grouped dependency and container findings into individual CVEs before you score them.
  3. Attach threat data. Add EPSS and KEV status to every CVE-based finding and pull likely or known exploits forward.
  4. Check reachability. Ask whether untrusted input can reach the vulnerable function, and record a confidence level with the answer.
  5. Check exposure. Confirm the workload is deployed, and whether it's internet-facing or behind internal load balancers serving production traffic.
  6. Weigh business impact. Raise findings in systems that handle customer data, authentication or payments.
  7. Decide and set the SLA. Map the result to an action, such as SSVC's Track, Attend or Act, and to an SLA tier based on priority, not severity.
  8. Re-triage on change. Recompute when code, dependencies or threat intel change, and keep human overrides.

Vulnerability prioritization examples

These examples come from findings Nullify triaged and wrote up on its blog. Each shows a priority that a severity score got wrong.

Example 1: a Critical dependency that runs only in the browser

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.

Example 2: a bundled finding that was really a Medium

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.

Example 3: findings that moved up once the network path was traced

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.

Common vulnerability prioritization mistakes

  • Treating CVSS-B as risk. A base score is the worst case. Add threat and environment, or use a tool that does.
  • Taking the maximum across a bundle. When one finding groups many CVEs, rank by the CVEs your code actually reaches.
  • Letting "not reachable" mean "closed." Reachability should reorder findings, not delete them. Static analysis can miss reflection and dynamic dispatch, so a "no" needs a confidence level.
  • Ignoring known exploitation. A KEV listing or a high EPSS score should pull a finding forward even if its severity label is Medium.
  • Scoring without explaining. If engineers can't see why something ranked first, they'll rescore it themselves, and your framework becomes a suggestion.
  • Prioritizing once. Code, dependencies and threat intel change every day. A ranking that isn't recomputed goes stale within a sprint.

Vulnerability prioritization checklist

Use this to check your current process, whatever tools you run:

  • Severity and priority are tracked as separate fields.
  • CVSS scores are labeled by the metric groups used (CVSS-B vs. CVSS-BTE).
  • EPSS and KEV status are attached to every CVE-based finding and refreshed daily.
  • Dependency findings are ranked by the CVEs your code reaches, not the bundle maximum.
  • Each finding records whether the affected workload is deployed and internet-facing.
  • Business impact comes from a maintained list of critical services and data types.
  • "Unknown" reachability is treated as reachable.
  • KEV-listed findings can't be dropped by reachability alone.
  • Every ranking shows the evidence behind it, and human overrides persist.
  • SLA tiers map to priority, not severity, and are recomputed when context changes.

How Nullify prioritizes vulnerabilities

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.

Frequently asked questions

What is the best framework for vulnerability prioritization?

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.

What is the difference between CVSS and EPSS?

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.

How do you prioritize vulnerabilities when everything is critical?

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.

Should reachability be used to close vulnerabilities?

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.