← All posts·Strategy

CVSS Score Is Not a Priority Queue

A CVSS 9.8 sitting dormant in a library nobody calls is less urgent than a CVSS 7.2 in your authentication flow. Here is how to build context-aware prioritization.

Outrightly Security ResearchApril 8, 20265 min read

Almost every vulnerability management workflow defaults to the same triage model: sort by CVSS score, highest first. It feels rigorous. It is quantitative. It is wrong. CVSS measures something real - the theoretical severity of a vulnerability under abstract conditions - but it does not measure what you actually need to know: how likely is this specific CVE to result in a breach of my specific system.

Prioritization model: CVSS-only vs context-aware

CVSS-only sort (misleading)

CVE-A9.8

internal config parser, never called remotely

CVE-B8.9

archived library, not deployed

CVE-C7.2

public auth endpoint, 10k req/min

Context-aware sort (accurate)

CVE-C
KEV7.2

public auth endpoint, 10k req/min

CVE-A
low exposure9.8

internal config parser, never called remotely

CVE-B
not running8.9

archived library, not deployed

What CVSS actually measures

The Common Vulnerability Scoring System (CVSS) rates vulnerabilities on three metric groups:

  • Base metrics: The intrinsic properties of the vulnerability - attack vector, attack complexity, required privileges, user interaction, scope, and impact (confidentiality, integrity, availability)
  • Temporal metrics: Properties that change over time - exploit code maturity, remediation level, report confidence
  • Environmental metrics: The impact as modified by your specific environment

Most tools and most teams use only the Base score. Temporal and environmental metrics require additional context that vendors rarely provide and teams rarely compute.

The Base score captures what is possible in ideal conditions. It does not capture whether those conditions exist in your environment, whether the code path is reachable, or whether anyone has actually written working exploit code.

The reachability problem

The most important factor CVSS Base score ignores is reachability: is the vulnerable code path actually executed in your application?

Consider a deserialization vulnerability in a Java library you use for configuration parsing. The library is on your classpath. The CVSS score is 9.8. But your application uses it only to parse a local config file on startup - a file controlled entirely by your infrastructure team. The attack vector that makes this a 9.8 (remote unauthenticated deserialization) does not exist in your deployment.

Contrast with a CVSS 7.2 injection vulnerability in the query builder your authentication endpoint uses to look up user credentials by username. Remote. Unauthenticated callers in the tens of thousands per day. Directly on your attack surface.

Sorting by CVSS score puts the 9.8 first. Context puts the 7.2 first. For most teams, computing precise reachability is too expensive - but several proxies can approximate it: is the vulnerable code in a network-facing service, is it on an internet-exposed endpoint, is it in code that processes untrusted input?

The three signals that should actually drive priority

A better prioritization model uses three signals in order:

1. CISA KEV status: Is this CVE being actively exploited? If yes, it is your highest-priority item regardless of CVSS score. Active exploitation is the only signal that proves theoretical risk has become actual risk.

2. Stack exposure: Is the vulnerable component in a service that is internet-exposed, or isolated in an internal tool? A 9.8 in your internal admin panel is lower priority than a 7.0 in your public-facing API.

3. CVSS Base score: After filtering by the above, use CVSS to prioritize within a tier. A KEV vulnerability with a higher CVSS score should be addressed before a KEV vulnerability with a lower score.

This model generates a priority list that looks very different from raw CVSS sorting - and in practice, correlates much more closely with the CVEs that are actually exploited in the wild.

Practical implementation

For most teams, implementing this model manually is impractical. But the architecture of your monitoring tool should implement it for you:

• KEV bypass: Any CVE that enters the CISA KEV catalog should generate an alert regardless of CVSS threshold settings. KEV status should never be filtered out by severity configuration.

• Stack-level scoping: Alerts should carry context about which stack and service the vulnerable package is in. A CVE in your 'public-api' stack is different from the same CVE in your 'internal-tools' stack.

• Exploit availability signals: Availability of public PoC code, Metasploit modules, or references in exploit databases correlates with real-world exploitation. These signals should surface in CVE alerts alongside CVSS score.

The goal is not to eliminate CVSS from your workflow - it is to position it correctly as one input into priority, not the priority itself.

Takeaway

CVSS score is a useful input. It is a terrible queue. The CVEs that matter most to your team are not the ones with the highest theoretical severity - they are the ones with confirmed exploitation, exposure through your specific attack surface, and reachable code paths. Build your alerting and triage workflow around that reality, and the signal-to-noise ratio of your security program improves immediately.