Skip to content
ENG/02 · Application SecurityNovember 20265 min read

Cutting security scanner noise with CISA KEV, EPSS, and call-graph reachability

How engineering teams move from thousands of unranked CVE tickets to a short, verifiable list of vulnerabilities that are actually exploitable.

Executive Summary & Key Takeaways

  • CVSS 'High/Critical' volume overwhelms engineering sprints because most flagged transitive packages are never invoked by application code.
  • Overlaying CISA Known Exploited Vulnerabilities (KEV) and EPSS probability scores highlights CVEs under active real-world attack.
  • Static AST call-graph reachability checks verify whether the vulnerable function is actually imported and reachable from an entry point.

1. Why CVSS severity alone breaks DevSecOps trust

Modern container and dependency scanners routinely flag hundreds of 'Critical' and 'High' CVEs on a single microservice image. When developers spend two days upgrading a dependency only to discover the vulnerable function was in an unused CLI helper module, trust between security and engineering erodes.

Treating every CVSS 8.0+ alert as an emergency slows product delivery while leaving genuinely exposed attack surfaces buried in the backlog.

2. Three-layer filtering: Threat Telemetry + Call-Graph Reachability

An effective triage pipeline evaluates three signals before paging an engineer. First, unify findings across SAST (Opengrep), containers/SCA (Trivy), secrets (Gitleaks), templates (Nuclei), and network ports (Nmap) into a single asset graph.

Second, enrich every CVE with CISA KEV (is it actively exploited in the wild?) and EPSS (what is the 30-day probability of exploitation?). Third, parse the application's Abstract Syntax Tree (AST) and import graph to verify whether the vulnerable symbol is reachable from a live route or worker.

3. Plain-English remediation briefs for faster fixes

Once unreachable noise is filtered out, each priority finding should be handed to developers as a concise brief: which file imports the vulnerable package, how an attacker could reach it, and the exact version bump or configuration change required to close it.