Safeguard
Supply Chain•

VEX and reachability analysis: how the two fit together

Reachability analysis finds whether vulnerable code can be called. VEX records the conclusion. How the evidence feeds vulnerable_code_not_in_execute_path.

Safeguard Security Team
3 min read

Reachability analysis is a way to produce evidence. VEX is a way to communicate a conclusion. When analysis shows that vulnerable code in a dependency is never called by your application, the matching VEX claim is not_affected with the justification vulnerable_code_not_in_execute_path.

Two different jobs

Reachability analysis looks at how your code uses a dependency and asks whether a path exists from your entry points to the vulnerable function. It produces a result for a finding.

VEX is a document format. OpenVEX defines the justification as: the vulnerable code, likely in a subcomponent, cannot be executed because the product does not call it. CISA's wording is nearly identical.

So reachability is the method, and the justification is the label.

What the evidence should include

If you publish the claim, a consumer will want to know how you decided. Useful details:

  • The vulnerable function or module, by name.
  • The product version analysed.
  • The method: static call graph, tests, runtime traces, or a mix.
  • The date of the analysis.

Put a short version into the impact statement, and keep the full result in your records.

Limits to state honestly

Static analysis can miss dynamic calls, reflection or plugins. A runtime trace only covers the paths exercised. If the product loads code by configuration, the claim may hold only for one configuration.

State the configuration. If the answer changes when an optional module is enabled, the safer statement is a narrower one, or an impact statement that names the condition.

When not to use this justification

If the vulnerable code is not even built, the better value is vulnerable_code_not_present. If the component is not shipped at all, use component_not_present. Those claims are stronger because they can be checked from the artifact. Use the execute path value only when the code is present and the argument is about calls.

Re-check on change

A reachability result belongs to a code version. When your code adds a call, or a dependency update changes its internals, the earlier claim may no longer hold. Re-run the analysis on release, and bump the VEX statement version if the answer changes.

A workflow

  1. Scan and list findings.
  2. Run reachability on each.
  3. For unreachable findings, draft not_affected statements with the execute path justification and a short impact note.
  4. Review a sample by hand.
  5. Publish or store the VEX, with versions.

You can see the effect on a finding list in the reachability demo. Safeguard offers reachability analysis for dependency findings, and a free scan is at https://gold.safeguard.sh/scan.

What a consumer should ask for

When a supplier cites the execute path justification, ask two questions. Which method produced the result, and for which configuration? If the answer is a call graph for the default configuration, you can check whether your deployment changes it. If you cannot get an answer, treat the claim as under investigation on your side until you have run your own analysis.

Quick check

Is reachability proof that a vulnerability is not exploitable?

No. It is evidence that the vulnerable code is not called in the analysed configuration. State the limits in the statement.

Sources

Last reviewed: 19 October 2026.

Never miss an update

Weekly insights on software supply chain security, delivered to your inbox.

Self-healing security runs on Safeguard.

Your first fix PR is minutes away.

No sales call required, even your agent can complete the purchase over MCP.