Dependency Vulnerability Management Beyond Automated CVE Alerts
Most CVE alerts never threaten your actual code.

48,244 CVE records got published in 2025, up from 40,077 in 2024. That's roughly 20% growth year over year, more than 130 new vulnerabilities a day, and no security team on earth can treat each one as equally urgent. This piece is about the gap between "your dependency has a CVE" and "your dependency can actually be exploited," and why closing that gap, not chasing alert counts, is the real job of dependency vulnerability management.
What practitioners at the S3C2 Summit 2025 actually said about dependency alert fatigue
At the S3C2 Summit in September 2025, ten practitioners from eight organizations sat down under the NSF-backed Secure Software Supply Chain Center and talked through what's breaking in their programs. Managing vulnerable dependencies came up as one of the most stubborn, repeat-offender problems across multiple years of these summits. Not new. Not solved either.
The complaints were pretty consistent. Too many alerts. Scanners disagreeing with each other. No clear way to tell which finding actually deserves attention today versus which one can sit in the backlog for a month. People running SCA tools said they're drowning in output, not starved for data.
What they actually asked for was more interesting than the complaints. Maintainer activity. How often a package gets updated. Package age. Whether the code shows signs of obfuscation. End-of-life status. None of that shows up in a CVE record, but all of it tells you something about whether a package is safe to trust going forward, separate from whatever CVE happens to be attached to it this week.
A few themes showed up for the first time at the September summit that hadn't come up before: worry about provenance and trust gaps in the supply chain, exposure sitting right in the developer's coding environment, and agentic AI tooling introducing vulnerability categories nobody's fully mapped yet. AI-mediated development is changing what "vulnerability" even means, and the practitioners in that room were still figuring out the vocabulary for it.
Transitive dependency exposure came up as well. Vulnerabilities that show up not because a team imported something risky directly, but because something further down the dependency tree did. The tree shifts faster than any human triage process can keep up with.
The scale of the problem shows up clearly in a VOC dataset analysis: 1,337,797 unique findings spread across 68,500 customer assets, 32,585 distinct CVEs, and 10,014 of those scored 8 or higher on CVSS. Tens of thousands of "critical" findings. Only a sliver of them ever get exploited in the real world. That gap is the whole problem in one dataset.
The Log4Shell case study: what happens when reachability and transitive depth go unexamined
CVE-2021-44228, better known as Log4Shell, is the clearest teaching example the industry has. A 2026 longitudinal study tracking exploitation of the flaw found attacks persisting from December 2021 all the way through October 2025, with attackers reusing infrastructure and refining payload obfuscation year after year. Four years later, people were still getting hit by it.
Three things made it stick around that long. First, the dependency chains were deep: most codebases running the vulnerable Log4j code didn't import it directly, they inherited it through transitive dependencies buried deep in the dependency tree. Second, patch adoption was uneven, and many organizations remained exposed long after fixes were available. Third, there was no central authority governing a library that had quietly become foundational infrastructure across a vast number of software projects.
The lesson here isn't "patch faster." Plenty of teams patched fast. Severity scores alone can't tell you whether a vulnerable library sits on a path attacker-controlled input can actually reach in a specific application. A CVSS score of 10 means nothing about your codebase specifically.
That's exactly what tripped teams up. Plenty of organizations scored Log4Shell as critical, patched every direct dependency they could find, and called it done. Many stayed exposed anyway, through transitive paths nobody had bothered to map.
Which sets up the question that matters more than any severity label: not "is this CVE serious," but "is this CVE exploitable in my specific codebase and environment, right now." Every section that follows is really just an answer to that one question.
The three-layer exploitability filter that separates signal from noise
Layer 1, reachability. Is the vulnerable function actually called anywhere in the application's live code paths? A dependency sitting in a package manifest but never invoked poses zero exploitable risk, no matter what its CVSS score says. Static analysis and call-graph tools can answer this question directly. Most SCA tools, though, report presence, not reachability, and that distinction matters enormously when you're deciding what to fix first. Transitive dependencies make this harder still: tracing the full call chain down through nested packages takes real work, not a quick manifest scan.
Layer 2, exploitability conditions. Say the vulnerable code is reachable. Does attacker-controlled input actually get to it? Is there an authentication wall in front of it? Network segmentation? Input validation that quietly neutralizes the exploit path before it starts? EPSS, the Exploit Prediction Scoring System maintained by FIRST, gives a probability score for whether a given CVE will actually see exploitation in the wild, a useful complement to CVSS because it reflects observed attacker behavior instead of theoretical worst-case severity. CISA's Known Exploited Vulnerabilities catalog goes a step further: KEV membership means a CVE isn't hypothetical, it's already being weaponized somewhere, and that should push a finding up the queue regardless of what EPSS alone says. Layer on environment-specific factors, cloud isolation, WAF rules, runtime protections, and the picture of "can this actually be exploited here" gets a lot sharper.
Layer 3, business impact. Suppose exploitation succeeds. What actually breaks? A stateless internal service getting popped is a different conversation than a data-tier system holding customer PII. Regulatory scope matters here too. Not every service carries the same blast radius, and asset criticality (production versus staging, internet-facing versus internal-only) needs to sit inside the prioritization model itself, not just get noted on the remediation ticket afterward.
A finding that fails any one of these three layers, unreachable code, blocked exploitation path, minimal impact, can get deferred or logged as an accepted risk with a name attached to the sign-off. A finding that clears all three needs attention now, not next sprint.
Where automated SCA tools stop and human-led analysis begins
SCA tools are good at one specific thing: telling you what vulnerable packages exist somewhere in your dependency manifest. That's presence detection, and it's genuinely useful. It's not reachability, and it's not exploitability under real conditions, and pretending otherwise is where a lot of programs go wrong.
The tools have gotten smarter over the past few years. Modern SCA platforms have added capabilities beyond raw CVSS sorting, incorporating additional signals to help teams prioritize and act on findings. That's a real step up from where the tooling started.
But there's a ceiling. Automated scanners are built around individual findings. Chaining a low-severity dependency flaw with a misconfigured permission and an authentication gap to build a real attack path is the kind of reasoning that skilled human testers bring. Machines mostly don't do that, not yet.
Penetration testing, specifically whitebox testing where the tester has full internal access to the application and its environment, is the method built to answer all three layers at once. A skilled tester can determine whether a vulnerable dependency is reachable, whether attacker input reaches it, and what actually happens if it does. That's the standard worth holding findings to: every exploitable dependency vulnerability should be verified under real conditions, not flagged on the basis of presence detection alone.
Human testers also catch categories of problems automated tools structurally can't see. Business logic flaws. Authentication bypasses that only make sense in the context of how a specific application is built. Attack chains that take a dependency CVE scored moderate on its own and combine it with a misconfiguration to produce something genuinely critical.
Building a risk-based remediation process that the team can actually execute
Every prioritized finding needs to land in one of four buckets, and defaulting everything to "open a ticket and hope" isn't one of them.
Remediate when a real fix exists and the finding clears all three exploitability layers: patch the library, bump the version, done. Mitigate when a full fix isn't available yet or would break something: segment the affected service, turn off the vulnerable feature, drop in a compensating WAF rule as a stopgap. Accept when the residual risk sits below your tolerance and someone with authority signs off on it in writing, which fits unreachable vulnerabilities sitting in isolated environments. Remove when the dependency just isn't worth the exposure anymore, so retire it.
Every finding that clears the bar for action needs an owner with a name and a deadline on the calendar. A vulnerability that belongs to "the team" belongs to nobody, and it sits there.
Verification closes the loop. Re-scan or retest to confirm the fix actually worked and didn't quietly introduce a regression somewhere else. A ticket moving to "done" in a project tracker doesn't mean the vulnerability is gone; only a retest confirms that.
SLAs should track exploitability tier, not just CVSS. Speed of remediation ought to follow real exploitation probability (EPSS scores, KEV listing) combined with business impact, rather than a blanket rule like "fix all criticals in 30 days" regardless of whether that finding is even reachable. Roughly half of organizations, according to Beyond Vulnerability Management research from The Hacker News, fix 15.5% or fewer of their known vulnerabilities in a given month. The goal of risk-based prioritization is to focus effort on what matters most, not to push that number up across the board. It's to make sure the handful that actually matter get fixed before an attacker finds them, even if the total patch count stays low.
Ownership needs to reach into transitive dependencies too. Knowing who's responsible for updating a nested package buried three layers deep inside somebody else's library is a process question a team has to answer explicitly. It won't answer itself just because a scanner flagged it.
Integrating dependency vulnerability management into the development workflow rather than bolting it on after
Scanning once a quarter, or once a year, recreates the exact same problem as chasing CVE alerts one by one: by the time the scan finishes, a vulnerable dependency may have been sitting in production for months already.
Pull-request-level scanning catches new vulnerable packages the moment they get introduced, before they ever reach production, while the developer who added the dependency still remembers why. Fixing something at PR time takes minutes. Fixing the same thing six months later, after three other services have started depending on it, takes a coordinated backport across a dependency graph nobody fully remembers anymore.
SCA tooling wired into CI/CD pipelines can flag or block pull requests that introduce dependencies with known, actively exploited CVEs, KEV-listed or high-EPSS, while letting low-risk additions through without friction. That's a tiered gate, not a blunt yes-or-no switch, and it matters because a gate that blocks everything just trains developers to route around it.
Something worth sitting with here: agentic tooling and automated code-generation aids are changing where the human review layer used to sit. When AI tooling mediates the introduction of a dependency, the traditional human review step may be compressed or bypassed. That's a process gap teams are still working through.
Package health signals, maintainer activity, update cadence, age, end-of-life status, presence of obfuscated code, belong inside the CI/CD gate logic itself, not just in a postmortem after something goes wrong. Continuous scanning and annual penetration testing aren't competing approaches, they're complementary: the pen test digs deep into exploitability on the current attack surface, and continuous scanning makes sure that surface doesn't quietly expand in the months between tests.
A lot of the actual bottleneck, honestly, comes down to something other than tooling. It's the handoff. A dedicated channel between security and engineering, something as simple as a shared Slack channel, cuts the time between a flagged dependency and the developer who can actually fix it. Process friction slows programs down more often than any tool's technical limits do.
What good dependency vulnerability evidence looks like to a SOC 2, HIPAA, or ISO 27001 auditor
SOC 2's Common Criteria ask for evidence that security controls actually function under real conditions. A log showing CVE alerts closed out by version bumps is thinner evidence than a pen test report showing a reachable vulnerability was found, proven exploitable, and then verified fixed. Auditors can tell the difference.
ISO/IEC 27001:2022, Annex A Control 8.8, "Management of Technical Vulnerabilities," requires a documented process for assessing and treating vulnerabilities. The transition deadline for the older 2013 version passed on October 31, 2025, so the 2022 standard is the only one that counts now, and programs still running documentation built around the old controls need to catch up.
HIPAA's Security Rule currently calls for periodic technical evaluations. A proposed rule update under consideration would make annual penetration testing explicitly mandatory for covered entities and business associates. That's not settled law yet, but it's close enough that programs planning ahead should treat it as coming.
Audit-ready evidence for dependency vulnerabilities generally includes an asset inventory showing what actually got scanned, a prioritization rationale that goes beyond a plain CVSS sort, documented sign-off for every accepted risk, records showing remediation got verified, and, for the higher-scrutiny audits, a signed pen test report from a qualified firm.
One scoped pen test can often satisfy several frameworks at once. Map each finding against every control it touches, SOC 2, ISO 27001, PCI DSS Requirement 11, and a single report can serve multiple audit cycles instead of paying for separate engagements for each certification. That's a real efficiency gain for growth-stage teams juggling more than one compliance framework at a time.
Per Secureframe's 2025 benchmark survey, achieving compliance is widely cited as a requirement to win or renew customer contracts. Dependency vulnerability evidence now serves as a genuine input to engineering decisions, beyond a regulatory checkbox. It's showing up directly in enterprise sales cycles, as part of the due diligence buyers run before signing.
Evaluating whether your current tooling and testing actually answer the exploitability question
The diagnostic question worth asking is simple: does the current program tell you which vulnerabilities are reachable and exploitable in this specific codebase, or does it just tell you which packages happen to contain a known CVE? Those are very different answers, and most teams, if they're honest, are still getting the second one.
Worth asking any SCA vendor directly: does the tool perform actual reachability analysis, tracing whether vulnerable functions get called in live code paths, or does it stop at reporting that a flagged package exists somewhere in the manifest? The answer changes how much weight that tool's output deserves in a prioritization decision.
Worth asking the same question of a penetration testing partner: does the engagement produce a working proof of exploitation for reachable dependency vulnerabilities, tracing input from an untrusted source all the way through to real impact, or does it hand back a list of CVEs cross-referenced against installed versions? The first is exploitability evidence. The second is a nicer-looking version of the CVE alert stream the whole industry is already drowning in.


