Skip to main content
48,185 CVEs in One Year: A Failure to TriageIncident
5 min readFor Security Engineers

48,185 CVEs in One Year: A Failure to Triage

In 2025, security teams faced 48,185 newly published CVEs, a 20.6% increase over 2024. That's 130 vulnerabilities disclosed every day. If your team tried to patch everything, you'd never ship code again.

The real problem is that most teams treat vulnerability management as a static analysis issue. They scan their code, generate a massive list of findings, and then argue with developers about what needs fixing first. This approach guarantees failure when you're drowning in alerts.

The incident I'm breaking down isn't a single breach. It's a systemic failure happening across hundreds of organizations right now, teams buried under vulnerability backlogs, unable to distinguish signal from noise, and ultimately leaving critical exposures unpatched while they chase theoretical risks.

What Happened

Security teams implemented comprehensive static analysis scanning across their codebases and dependencies. The tools did exactly what they were designed to do: they found vulnerabilities. Thousands of them.

Without runtime context to show which vulnerabilities existed in actively executing code paths, teams couldn't effectively prioritize. They patched based on CVSS scores, published exploit availability, or worst case, whoever complained loudest. Meanwhile, the vulnerabilities that actually mattered, the 2% that get exploited in the wild, sat in backlogs alongside thousands of findings in dead code, unused dependencies, and unexposed endpoints.

The outcome wasn't a dramatic breach. It was something worse: continuous partial failure. Teams spent months patching vulnerabilities that would never be exploited while real threats went unaddressed. Developer relationships deteriorated. Security became a bottleneck instead of an enabler.

Timeline

This isn't a single incident with a clear timeline. It's a pattern that repeats weekly:

Day 1: Static scanner identifies 300 new vulnerabilities in dependencies after a routine update.

Day 2-3: Security team triages based on CVSS scores. Twenty findings are marked "Critical."

Day 4-10: Developers push back. Half the critical findings are in test dependencies. Another quarter are in code paths that never execute in production.

Day 11-20: Meetings. Escalations. Security argues for patching everything. Development argues for shipping features.

Day 21: A compromise. The team patches five vulnerabilities. The other fifteen remain open while everyone moves on to next week's scan results.

Day 22: Repeat.

The critical vulnerability that actually matters? It's in that backlog somewhere, indistinguishable from the hundreds of other "high priority" findings.

Which Controls Failed

The failure wasn't in detection, it was in prioritization and response. Multiple control gaps created this situation:

No runtime visibility: Static analysis identified vulnerabilities in code, but couldn't answer the essential question: "Is this code actually running in production?" Without runtime intelligence, every finding carried equal theoretical weight.

Missing context for risk assessment: CVSS scores measure theoretical severity, not actual risk to your environment. A critical vulnerability in a function that never executes poses zero real threat. Teams lacked the data to make this distinction.

Ineffective security-development collaboration: When security couldn't explain why one critical finding mattered more than another, developers stopped trusting the prioritization. Every request became a negotiation instead of a clear directive.

No continuous validation: Even when teams patched vulnerabilities, they had no runtime confirmation that the fix worked or that the vulnerable code path was truly eliminated.

What Standards Require

Multiple frameworks address vulnerability management, but they all share a common thread: prioritization based on actual risk.

PCI DSS v4.0.1 Requirement 6.3.2 mandates that security vulnerabilities are identified using reputable sources and that risk rankings are assigned based on industry practices. The key phrase is "risk rankings", not just severity scores. PCI DSS expects you to consider your specific environment when prioritizing remediation.

ISO 27001 Control 8.8 (Management of technical vulnerabilities) requires organizations to obtain information about technical vulnerabilities, evaluate exposure, and take appropriate measures. "Evaluate exposure" means understanding whether a vulnerability is actually exploitable in your environment, exactly what runtime context provides.

NIST CSF v2.0 function PR.IP-12 (A vulnerability management plan is developed and implemented) emphasizes risk-based prioritization. The framework explicitly calls for considering "the potential impact of vulnerabilities" in your specific context.

OWASP ASVS v4.0.3 V1.14.6 states that all components are protected from known vulnerabilities. The operative word is "protected", not just "scanned." Protection requires understanding which vulnerabilities actually threaten your running application.

The standards don't just want you to find vulnerabilities. They want you to fix the ones that matter.

Lessons and Action Items

Here's what you can implement this quarter:

Deploy runtime instrumentation: Tools like Falco provide runtime threat detection and show which code paths actually execute. You don't need to instrument everything immediately, start with your most critical applications. Focus on answering: "Which of our dependencies are actively called at runtime?"

Redefine your severity model: Stop using CVSS as your only prioritization input. Build a scoring system that includes: CVSS base score, runtime reachability, data exposure, and network accessibility. A "critical" vulnerability in unreachable code gets deprioritized. A "medium" vulnerability in a function that processes customer data gets elevated.

Create a runtime-validated remediation workflow: When developers patch a vulnerability, require runtime confirmation that the vulnerable code path no longer executes or that the patch is effective. This closes the loop and builds trust.

Establish clear SLAs based on runtime context: Set different response windows for vulnerabilities based on runtime reachability. For example: vulnerabilities in actively executing code with external network exposure get 48 hours; vulnerabilities in code that doesn't run get 90 days or next major release.

Build a feedback loop with development: Share runtime data with your development teams. When you can show them exactly which five vulnerabilities are in live execution paths versus the 295 that aren't, they'll prioritize differently. This isn't about reducing their workload, it's about focusing it.

You can't patch 48,185 vulnerabilities. You shouldn't try. The goal isn't zero vulnerabilities; it's zero exploited vulnerabilities. Runtime intelligence tells you which vulnerabilities actually create risk in your environment. Everything else is noise.

Start with one critical application. Instrument it. Compare your static findings to runtime reachability. You'll immediately see which 90% of your backlog can wait. That's not cutting corners, that's effective risk management.

CVSS Scoring System

Topics:Incident

You Might Also Like