Exposure Validation

Reachability Analysis

Determines whether a vulnerability can actually be reached in a specific environment — over the network, in code, or by attacker-controlled data. It's the filter that makes exposure management tractable by ruling out findings that don't matter.

What is reachability analysis?

Reachability analysis determines whether a vulnerability can actually be reached in a specific environment, over the network, in the code, and by attacker-controlled data. It is the filter that makes exposure management tractable, because most flagged vulnerabilities cannot be reached in a way that matters.

Key takeaways

  • Present and reachable are different claims. A vulnerable library in a dependency tree is a presence finding. Reachability asks whether anything calls it.
  • Loaded is not callable, and callable is not attacker-reachable. Three distinct thresholds, routinely conflated in reporting.
  • Four layers matter. Network path, function reachability, data flow and active exploitation status, each answering a different question.
  • Assets and code need different mechanisms. File-path and port analysis on one side, call-graph and taint analysis on the other.
  • It reduces volume substantially, and is not a verdict. A reachable function still has to be exploitable in context.

Why it matters

Log4Shell is the clearest illustration. Every Java installation that shipped the Log4j library registered as vulnerable, and the flaw scored at the top of the severity scale. But if the application was not using that logging engine, the vulnerable code was never callable: loaded, and zero exposure. Severity said critical; the environment said there was nothing there to reach.

Multiply that across an estate and the consequence is straightforward. A backlog ranked by severity concentrates effort on findings no attacker could use, while genuinely exploitable exposures wait behind them. Reachability analysis turns an inventory of what is present into a shortlist of what is relevant.

The layers of reachability

  • Network reachability. Can an attacker route to the affected asset through firewalls, load balancers and segmentation? It has two real limits: complete network knowledge realistically only exists in cloud environments, and it models only the network path. Insiders, stolen credentials and attackers already inside never touch a firewall.
  • Runtime presence. Is the vulnerable component loaded and running? A presence signal, not a verdict.
  • Function reachability. Is the vulnerable function actually called from application code, directly or transitively? This is where most findings drop out.
  • Data reachability, or taint analysis. Can attacker-controlled data reach the vulnerable parameter? A function called only with trusted internal values is a different risk.
  • Active exploitation. Is the vulnerability being used in the wild, as recorded in the CISA Known Exploited Vulnerabilities catalog?

Reachability in code compared with reachability on assets

In code the mechanism is the call graph. Static analysis builds the set of functions the application can invoke, follows the edges into dependencies and their transitive dependencies, and checks whether the vulnerable function appears on any path from an entry point. Taint analysis then adds the question of whether untrusted input can flow to it.

On assets the mechanism is more physical. File-path analysis rules out vulnerable components sitting in trash bins, backup folders or patch staging directories, because they are not in a runtime path. Port analysis establishes whether the host is listening on the port an exploit requires. Neither needs a runtime agent, which matters: agent-based instrumentation gives a strong signal where live traffic exercises a path and no finding at all where it does not.

A worked example of the three thresholds

Take one dependency reported as vulnerable across three services. In the first the library is listed in the manifest but the build strips it, so it is not present at runtime. In the second it is loaded on startup but the application uses a different logging implementation, so the vulnerable function is never called: loaded, not callable. In the third the function is called, but only with a constant string assembled internally, so no attacker-controlled data reaches the vulnerable parameter.

One CVE, one severity score, three different answers. Only the third case is close to exploitable, and even it requires checking whether any request path can influence that string. This is why a count of vulnerable components is a poor proxy for risk.

How to evaluate reachability analysis

  • Ask which layers are covered. A claim of reachability that does not say which layer it refers to is ambiguous.
  • Check transitive depth. Most vulnerable code arrives through indirect dependencies. Analysis that stops at direct dependencies misses the common case.
  • Look at language and ecosystem coverage. Call-graph quality varies sharply between compiled and dynamic languages, and reflection or dynamic dispatch defeats naive analysis.
  • Ask how unreachable findings are handled. They should be retained with the reasoning attached rather than deleted, because a control removed or a service exposed can change the answer.
  • Understand the failure mode. A false negative in reachability hides a real exposure. Ask where the analysis is conservative and where it is optimistic.

Common misconceptions

  • That reachability equals exploitability. Reachability is a large part of establishing exploitability and not all of it. A reachable function still has to be exploitable in context.
  • That an SBOM answers the question. A software bill of materials records what is present. It says nothing about whether any of it is called.
  • That runtime instrumentation is definitive. It observes exercised paths. Silence means the traffic did not occur, not that the path is unreachable.
  • That unreachable means safe permanently. Reachability is a property of a configuration. Change the configuration and the answer can change.

Standards and sources

Vulnerability identifiers come from the CVE Program, with Log4Shell tracked as CVE-2021-44228. Component inventories are normally expressed in CycloneDX or SPDX format. Confirmed real-world exploitation is published by CISA in the Known Exploited Vulnerabilities catalog, and probability estimates come from the FIRST Exploit Prediction Scoring System.

FAQ

Is reachability analysis the same as exploitability? Reachability is a large part of establishing exploitability, and not all of it. A reachable function still has to be exploitable in context.

Does reachability analysis need a runtime agent? Not necessarily. Static call-graph analysis on code, and file-path and port analysis on assets, both work without instrumentation.

Can a finding become reachable later? Yes. A control removed or a service newly exposed can change the answer, which is why findings that fail reachability should be retained rather than deleted.

How much does reachability reduce a backlog? It varies widely with the environment, language ecosystem and scanner mix. In dependency-heavy codebases most reported vulnerable components are never called.

Sources

  • CVE Program, CVE-2021-44228 (Log4Shell) Record, 2021.
  • CISA, Known Exploited Vulnerabilities Catalog, 2026.
  • OWASP, CycloneDX Bill of Materials Standard v1.6, 2024.
  • Linux Foundation, SPDX Specification v3.0, 2024.
  • FIRST, Exploit Prediction Scoring System (EPSS) Model, 2024.
  • Verizon, 2026 Data Breach Investigations Report.