The Vulnerable-Dependency Triage: Fix Now, Schedule, or Accept
You will be able to score any single flagged dependency CVE and place it in one of four remediation tiers with a written justification that survives an audit.
An SCA scan just returned hundreds of vulnerable dependencies and you cannot fix all of them this quarter. This guide is for the AppSec engineer, engineering manager, or owning developer who has to decide which flagged findings to fix now, which to schedule, and which to accept, and defend that call to an auditor later. It gives you a graded rubric built from named public inputs so two engineers scoring the same finding reach the same tier.
Software composition analysis, or SCA, is the scan that inventories your open source dependencies and matches them against known vulnerabilities. Most guides tell you whether to adopt or update a whole library. This one does something narrower and more useful under fire: it scores a single already-flagged vulnerability, often buried deep in the transitive tree, and resolves it to one of four remediation tiers.
Why sorting by CVSS alone fails
CVSS severity is the wrong sort key because it does not know whether the vulnerable code runs in your application. A high CVSS score describes the vulnerability in the abstract; it says nothing about whether the vulnerable function is callable in your build, whether the affected service is exposed, or whether anyone has ever exploited the flaw in the wild.
The scale of the mismatch is the whole reason triage exists. Only about 6% of all published CVEs have ever been observed exploited in the wild. CISA's Known Exploited Vulnerabilities catalog, the authoritative list of flaws with reliable evidence of exploitation, holds roughly 1,300 entries against 355,000+ published CVEs, under 0.4%. Sort by CVSS and you spend your week on findings that were never exploitable while a genuinely reachable, exploited risk waits in the same queue behind them.
From every CVE to the ones that matter
- 355,000+All published CVEs
the raw universe
- ~6%Ever exploited in the wild
the population worth escalating
- ~1,300On CISA KEV
proven exploitation, under 0.4%
The rubric that follows inverts the naive order. It applies threat-based filtering first, using KEV membership and the EPSS threshold, then reachability and exposure, and only then uses severity to break ties or justify deprioritization.
The dimensions that decide the tier
Score every finding on the same six dimensions, in this order. Each dimension proves something specific, and each has a failure mode where the signal lies to you. Say what the signal proves, and know what it looks like when it is wrong.
| Dimension | What it proves | What it looks like when it lies |
|---|---|---|
| KEV membership | Reliable evidence the flaw is exploited in the wild | A KEV item with no bearing on your stack, over-escalated |
| EPSS score | 30-day forecast probability of exploitation | A stale Accept tag whose EPSS has since crossed 0.088 |
| Reachability | Whether the vulnerable function is actually callable | An "unreachable" verdict on dynamically-invoked code |
| Asset exposure | Whether the service is internet-facing and critical | A crown-jewel rating on a service no attacker can reach |
| Fix availability | Whether a real fixed version exists | A version bump that silently breaks the build |
| Upgrade distance | How much work the fix costs | A "simple" transitive fix that forces a fragile override |
Two of these dimensions carry more weight than the rest, and it helps to understand why.
KEV is an override, EPSS is a filter
KEV and EPSS operate at very different scales, which is exactly why the order matters. KEV covers under 0.4% of all CVEs, so treat it as an absolute override: any open KEV finding is Fix-Now before you look at anything else. The published EPSS v3 remediation threshold of 0.088 flags a much larger slice, about 7.3% of CVEs, so treat it as a volume filter for everything KEV did not already catch.
The payoff of that ordering is measurable. At the 0.088 threshold, EPSS v3 reaches about 82% coverage for 7.3% of the effort, versus the 58.1% of CVEs you would have to remediate to hit the same coverage by chasing volume without a threshold. Restated per thousand, the 0.088 gate flags 73 of every 1,000 vulnerabilities, at an efficiency of 45.5%.
Reachability is the highest-yield cut you have
Reachability is the single most powerful filter in this rubric, because most dependency code never runs. Commercial SCA products report that 70 to 80% of dependencies are never referenced in application code at all. Reachability analysis answers the exact question CVSS cannot: not whether a vulnerable library is present, but whether the vulnerable function is actually callable, analyzed at function level across direct and transitive dependencies.
The reduction is dramatic and documented. Function-level reachability cut SCA findings by 92% in one Endor Labs use case. A conservative automated check on 12 Go projects gave a 74.4% false-positive reduction, confirming 31 of 121 reported findings. That is a bigger cut than any severity threshold delivers.
Most of the code your scanner flags never runs, so reachability strips more noise than any severity gate.
One caution that belongs on the dimension itself: dependency-level reachability is not function-level reachability. Dependency-level analysis tells you the package is present; it cannot tell you the vulnerable code is used. Confirm your tool resolves to the function, or the filter is worth far less than the numbers above.
Most of your findings are transitive, and that sets your effort
Nearly all flagged vulnerabilities live in dependencies you never chose directly, which changes what a fix costs but not how urgent it is. The share depends on whose data you read, and that range matters because it silently sets your effort expectation.
| Source | Transitive share of vulnerabilities |
|---|---|
| Endor Labs | 95% |
| Snyk | 78% |
| Lineaje | 77% |
| OSSRA 2025 (components) | 64% |
A rubric that quotes the 95% figure but assumes every fix is a simple version bump understates the work badly. Patching transitive dependencies is documented as complicated, and few fixes are clean upgrades. This is why upgrade distance is a scored dimension: a finding in a direct dependency with a published patch is a Fix-Now you can close in an hour, while the same severity in a package four hops deep may force a version override that breaks the build.
A precise, published upgrade-distance metric, meaning the exact number of hops to a fixed version, is not established publicly as a single figure. So score it qualitatively: direct bump, forced transitive override, or no fix available. Do not push a blind transitive patch onto a developer without verifying a real fixed version and a path to it first.
The four tiers and what lands in each
Every finding resolves to one of four tiers. The tier is a function of the six dimensions, and the written justification names the inputs so the verdict survives an audit. This borrows its logic from CISA's SSVC model, whose four outcomes are Act, Attend, Track*, and Track, but keeps the language plain for a dependency queue.
Placing a finding in a tier
- Fix-Now. Open KEV finding, or EPSS at or above 0.088, and reachable or undetermined on an internet-facing or business-critical asset. Remediate ahead of the rest of the queue.
- Schedule. High exploitation signal but not currently reachable, or reachable on a low-exposure asset. Assign a fix window rather than dropping everything.
- Accept-with-monitoring. Reachable but low exploitation likelihood today, or a KEV item whose exposure and reachability are marginal. Accept for now, but book a dated re-review.
- Accept. Low EPSS, not on KEV, not reachable, low exposure. Document the rationale and close it.
Remember that exploited is not exploited at you. Fewer than 5% of exploited CVEs ever hit more than 1 in 10 organizations, so a KEV item on an unreachable, unexposed component is a legitimate Accept-with-monitoring, not an automatic fire drill. Pair the KEV flag with reachability and exposure before you escalate.
The triage procedure
Run these eight steps in order for each scan. The first three are cheap and fast; the expensive analysis comes only after threat-based filtering has already shrunk the queue.
Score and tier a flagged dependency finding
- Ingest and deduplicate the SCA outputExport the finding list with CVE ID, package, direct or transitive placement, and fixed version, then deduplicate so each vulnerability appears once with a resolved dependency path.
- Apply the KEV overrideCheck each CVE against the current CISA KEV catalog via API and tag every open KEV match as Fix-Now regardless of CVSS.
- Apply the EPSS thresholdFor non-KEV findings, pull current EPSS scores and flag those at or above 0.088 with a pass or fail flag.
- Run reachability analysisDetermine at function level whether the vulnerable code is callable, and mark each surviving finding reachable, unreachable, or undetermined.
- Score asset criticality and exposureRate whether the affected service is internet-facing and business-critical, mirroring BOD 26-04 asset exposure and SSVC mission prevalence.
- Assess fix availability and upgrade distanceConfirm a fixed version exists and estimate the upgrade cost, from a direct bump to a forced transitive override with no fix.
- Assign a tier and write the justificationPlace the finding in Fix-Now, Schedule, Accept-with-monitoring, or Accept, and record the KEV status, EPSS value, reachability verdict, exposure, and fix effort.
- Record and set review cadenceBook a dated re-review of Accept and Schedule items against KEV and EPSS, because exploitation status changes.
Note one open disagreement in the sources so you can settle it for your own shop. A published two-stage decision-tree model runs KEV and EPSS before CVSS. A pure SSVC implementation starts from the Exploitation decision point instead. The two approaches disagree on whether severity or exploitation status is evaluated first; both agree severity is never the leading key. Pick one and apply it consistently, so your tiers are reproducible.
Finding: <package>@<version> - <CVE ID> Placement: direct | transitive (hops: <n>) KEV: yes/no (checked <date>) EPSS: <value> (pulled <date>) - pass/fail vs 0.088 Reachability: reachable | unreachable | undetermined (tool: <name>, function-level: yes/no) Exposure: internet-facing? <y/n> business-critical? <y/n> Fix: version <x> available? <y/n> upgrade distance: direct bump | transitive override | none Tier: Fix-Now | Schedule | Accept-with-monitoring | Accept Justification: <one paragraph citing the five inputs above> Re-review due: <date>
Fill one per finding. This is the artifact an auditor reads, so leave nothing implicit.
How this goes wrong
The rubric fails in predictable ways, and every one of them produces a defensible-looking verdict that is actually wrong. This is the section to read twice, because a standard that misfires quietly is worse than no standard.
- EPSS treated as static. EPSS is a 30-day forecast, not a fixed label. An Accept item can cross 0.088 next week. Check by re-pulling EPSS on a cadence, not once at scan time.
- KEV checked only at scan time. The catalog is additive, so a finding accepted before its CVE was listed goes stale silently. Check by re-running all open findings against the current catalog, not just new additions.
- Reachability false negatives. When an application loads or invokes code dynamically, in Java, JavaScript, or Python, or uses dependency injection like Spring or .NET, reachability often cannot resolve call paths. An "unreachable" verdict on dynamically-invoked code is a false clear. Check by treating undetermined as reachable for internet-facing assets.
- CVSS used as the sort key. Teams that sort by CVSS alone chase findings that were never exploitable while reachable risks wait. Check by confirming KEV, EPSS, and reachability were applied before CVSS.
- Confusing exploited with exploited everywhere. Exploits hitting more than 1 in 10 organizations are rare, under 5%. Over-escalating a KEV item with no bearing on your stack burns the same hours a real Fix-Now needs. Check by pairing KEV status with reachability and exposure.
- Blind transitive fixes. Forcing a transitive override without a verified fixed version breaks builds. Check by confirming a real fixed version and upgrade path before assigning Fix-Now.
- Citing revoked deadlines. The flat 15-day internet-facing and 25-day other rule under BOD 22-01 was revoked on June 10, 2026, when CISA issued BOD 26-04, a four-criteria risk-scored model that can be as fast as three days. Reference BOD 26-04 for any federal-facing timeline claim.
- Dependency-level reachability sold as function-level. Dependency-level analysis cannot tell you whether the vulnerable code is actually used. Check that your tool resolves to the function, not the package.
Reported SCA false-positive rates run from 71 to 88% across tools, so most of what your scanner hands you is noise. The failure modes above are precisely the ways that noise sneaks past your rubric wearing a verdict.
Who runs this well, and why they are hard to find
The judgement this rubric teaches is a specialized skill, and the talent to run it is both scarce and unevenly distributed. Generic vulnerability-management experience is common; the specific competence in software composition analysis and reachability is rare.
| Segment | Count | Derived |
|---|---|---|
| AppSec/ProdSec engineers, US | 1,119 | baseline |
| AppSec/ProdSec engineers, Germany | 49 | US is about 22.8x Germany |
| US "Vulnerability Management" skill | 42,962 | 1,023x the SCA skill pool |
| US "Software Composition Analysis" skill | 42 | 0.1% of the Vuln-Mgmt pool |
In Refolk's index of professional profiles, 42,962 US profiles list Vulnerability Management as a skill but only 42 list Software Composition Analysis, a gap of more than 1,000x. The dedicated AppSec and product security pool is thin too: 1,119 engineers in the US against 49 in Germany. If you are hiring for the person who owns this triage, generic security titles will flood your pipeline while the specific skill stays invisible, so you have to search on the capability itself rather than the job title.
number: 42
label: US profiles listing "Software Composition Analysis" as a skill
note: Against 42,962 who list generic "Vulnerability Management" - the specific skill is roughly 1,000x rarer.
Questions practitioners ask
Should I fix by CVSS score or something else?
Not by CVSS alone. A high CVSS score does not know whether the vulnerable function runs in your application, and teams that sort by CVSS spend time on findings that were never exploitable while reachable risks wait. Apply KEV membership, then the EPSS 0.088 threshold, then reachability, and use CVSS only to break ties or deprioritize. Only about 6% of all published CVEs have ever been exploited in the wild.
What EPSS threshold should I use to decide fix-now?
The published EPSS v3 remediation threshold is 0.088. At that gate, roughly 73 of every 1,000 vulnerabilities are flagged, delivering about 82% coverage for 7.3% of the effort you would spend chasing equal coverage by volume. Treat EPSS as a 30-day forecast, not a static label: an Accept item can cross 0.088 next week, so re-pull scores on a cadence.
Are transitive dependency vulnerabilities lower priority than direct ones?
No, placement in the tree is an effort signal, not a risk signal. Most open source vulnerabilities live in transitive dependencies, with published estimates ranging from 64% to 95%. What changes with depth is remediation cost, since patching transitive findings is documented as complicated and few are simple version bumps. Score the risk first, then let upgrade distance influence the tier, not the urgency.
How much does reachability analysis actually reduce the queue?
A lot, because 70 to 80% of dependencies are never referenced in application code. Function-level reachability cut SCA findings by 92% in one Endor Labs use case, and a conservative check on 12 Go projects gave a 74.4% false-positive reduction. Confirm your tool resolves to the function, not just the package, and treat undetermined verdicts as reachable on internet-facing assets.
Are the old CISA KEV 15-day and 25-day deadlines still current?
No. BOD 22-01's flat 15-day internet-facing and 25-day other deadlines were revoked on June 10, 2026, when CISA issued BOD 26-04. The replacement uses a four-criteria, risk-scored remediation model that can be as fast as three days when all four criteria are met. Reference BOD 26-04 for any federal-facing claim about KEV timelines.
Try it on the search you came here for
Stop building boolean strings. Just describe the person.
Type one sentence. I plan the search, read GitHub, public LinkedIn and Crunchbase records, and the open web as it is right now, and hand back a ranked list with the reason next to every name.
01Describe them
One plain sentence. Role, city, stack, stage, whatever matters to you.
02I read the web live
GitHub, public LinkedIn and Crunchbase records, the open web. Not a database that went stale last quarter.
03You read the shortlist
Ranked, with the reasoning under every name. Open a profile, ask a follow-up, narrow it down.
- Staff backend engineers in NYC who shipped Rust in production
- Series A fintechs in SF under 50 people, growing headcount this year
- Maintainers of fast-growing Rust web frameworks on GitHub
- No boolean, no filters, no seat to buy. One box.
- Read at search time, so a profile updated yesterday counts today.
- Every step visible as it runs, every name with its reason.
500 free credits on sign-up. No card, no demo call. See real searches.