VEX Explained: What a "Not Affected" Statement Means and How to Read One

A VEX document is a supplier's signed-off claim about whether a specific product is affected by a specific vulnerability. Here is what the four statuses and five justifications mean in CISA's guidance, how OpenVEX and CSAF express them, and why a VEX claim is something to evaluate, not obey.

A black magnifying glass, a black spiral notebook with a blank white card, a pencil and an eraser on a white desk
Photo by Mediamodifier on Unsplash

VEX, short for Vulnerability Exploitability eXchange, is a way for a supplier (or another party) to say, in a structured document, whether a specific product is affected by a specific vulnerability. A VEX statement about a library you find in your scanner output answers the question the scanner cannot: “this component is present, but can the flaw actually be reached?” This article explains the vocabulary CISA defined, shows how two formats (OpenVEX and CSAF) express it, and sets out how to evaluate a “not affected” claim before you let it close a ticket.

We read CISA’s June 2022 status-justification guidance, the OpenVEX specification, the CSAF 2.0 standard and parts of Trivy’s documentation on October 13, 2026. We did not write or consume a VEX document in a live pipeline for this article, so it is research-based explanation, not hands-on testing.

The short answer

  • A VEX statement ties one product to one vulnerability and gives a status.
  • CISA’s guidance says the status must be one of NOT AFFECTED, AFFECTED, FIXED or UNDER INVESTIGATION.
  • A NOT AFFECTED status can carry a justification from a fixed list of five, so a tool can act on it.
  • It is a claim by whoever wrote the document. CISA says the consumer “may choose to accept it or not.”

What a VEX document must contain

CISA’s guidance states that VEX documents must contain four things: VEX metadata, product details, vulnerability details and product status. CISA also published a separate “Minimum Requirements for VEX” document (the CISA page is dated April 21, 2023). We could not download that PDF (CISA’s server returned “Access Denied” to our request), so we rely on the OpenVEX specification, which says it aims to meet those minimum requirements, and on the CISA status-justification guidance quoted above.

The four statuses

Status (CISA name)MeaningOpenVEX valueCSAF 2.0 field under product_status
NOT AFFECTEDNo remediation is required for this vulnerability in this productnot_affectedknown_not_affected
AFFECTEDThe product is affected; remediation or mitigation is recommendedaffectedknown_affected
FIXEDThese product versions contain a fixfixedfixed
UNDER INVESTIGATIONImpact is not yet knownunder_investigationunder_investigation

Sources: CISA, VEX Status Justifications (June 2022); OpenVEX specification; CSAF 2.0 standard. The column pairing is our mapping of equivalent concepts; each source defines its own values. CSAF defines further categories (for example first_affected and last_affected) that have no direct CISA counterpart.

The OpenVEX specification uses a hypothetical timeline to show why the statuses exist. A vendor learns of a new CVE and publishes under_investigation; later it finds the product affected and publishes affected with mitigation advice; when it ships a patch it publishes fixed. Without that sequence, the spec notes, a scanner user “will simply get a third party alert with no details on how the status is evolving,” and the alert becomes a false positive once the product is patched.

The five “not affected” justifications

A justification is the machine-readable reason behind a NOT AFFECTED claim. CISA lists five. The definitions below paraphrase CISA’s June 2022 document; the examples in the last column are CISA’s.

JustificationWhat the supplier is assertingCISA example
component_not_presentThe vulnerable component is not in the productA Python and Elixir product with no Java code cannot be affected by Log4j
vulnerable_code_not_presentThe component is present, but the specific vulnerable code is notThe compiler stripped the relevant function, or the vulnerable code was added in a later version than the one shipped
vulnerable_code_not_in_execute_pathThe vulnerable code is present but can never run in this productAn application that uses OpenSSL only for random-number generation is not exposed to Heartbleed, which was never called from that function
vulnerable_code_cannot_be_controlled_by_adversaryThe code runs, but an attacker cannot influence it enough to trigger the flaw without another vulnerabilityA hard-coded variable denies user input to the vulnerable function
inline_mitigations_already_existBuilt-in protections that an attacker or user cannot bypass or disable prevent exploitationInput is sanitized further upstream within the product

Two caveats from CISA’s own text are easy to miss:

  1. For vulnerable_code_not_in_execute_path, CISA warns that “a single path of execution should not be assumed since the attacker may be able to divert the path of execution.”
  2. For inline_mitigations_already_exist, CISA notes that mitigations are effective “only in the scenario where the threat model of the software allows it,” and a mitigation that works in one product may not in another. The OpenVEX specification adds that this justification “could be difficult to prove conclusively.”

CISA also distinguishes the last two. With vulnerable_code_cannot_be_controlled_by_adversary, nothing the attacker does can reach the vulnerable code in a way that triggers it. With inline_mitigations_already_exist, the attacker can influence execution, but another control blocks the attack. Both, CISA says, “rely on an expert analysis of the structure of the code.”

How the formats express it

OpenVEX

OpenVEX is a JSON format. Per its specification, a document requires @context, @id, author, timestamp, version and statements. Each statement needs a vulnerability, a status and at least one product (these can be inherited from the document in some cases, and the specification says a document with incomplete statements is not valid). For not_affected, the statement must include either a justification or an impact_statement, which is free text. The specification says free-text impact statements are “highly discouraged for automated systems.” For affected, it must include an action_statement describing how to remediate or mitigate.

A minimal not-affected statement looks like this. Everything below is an invented placeholder: the CVE number, the product identifier and the author are not real.

{
  "@context": "https://openvex.dev/ns/v0.2.0",
  "@id": "https://example.com/vex/2026-0001",
  "author": "Example Product Security Team",
  "timestamp": "2026-10-13T06:00:00Z",
  "version": 1,
  "statements": [
    {
      "vulnerability": { "name": "CVE-2026-00000" },
      "products": [{ "@id": "pkg:oci/[email protected]" }],
      "status": "not_affected",
      "justification": "vulnerable_code_not_in_execute_path"
    }
  ]
}

The version field, the specification says, must be incremented when any content of the document changes, which is how a supplier moves from under_investigation to fixed over time.

CSAF 2.0

CSAF (Common Security Advisory Framework) is an OASIS Standard, approved November 18, 2022, with an errata release dated January 26, 2024 that changes only an aggregator schema. Its Profile 5: VEX requires a product tree, a list of vulnerabilities, and at least one of the fixed, known_affected, known_not_affected or under_investigation product-status lists. It also sets two content rules:

  • For each product in known_not_affected, an impact statement must exist, either as a machine-readable flag or as a human-readable impact entry in threats.
  • For each product in known_affected, product-specific action information must be given in remediations; the categories no_fix_planned and none_available are permitted.

CSAF’s flag labels are the same five justification values as CISA’s list.

Reading a VEX statement critically

A scanner that supports VEX can hide findings based on these documents. That is the point, and also the risk. These are our practical checks, not requirements from CISA, OpenVEX or OASIS:

  1. Match the product exactly. Check that the product identifier and version in the statement are the ones you deploy, not a sibling image or a different build.
  2. Check who signed it. OpenVEX says the author’s identity “SHOULD be cryptographically associated with the signature of the VEX document.” An unsigned file fetched from an arbitrary location is a weaker basis than a signed statement from the supplier.
  3. Prefer machine-readable justifications. A bare not_affected with free text gives your tooling, and a future auditor, little to evaluate.
  4. Weigh the justification type. component_not_present is something you can verify against your own SBOM. inline_mitigations_already_exist relies on the supplier’s threat model, which is hard to check from outside.
  5. Treat known-exploited vulnerabilities with extra care. If a vulnerability is on CISA’s Known Exploited Vulnerabilities list, a wrong “not affected” is expensive. Our article on CVSS, EPSS and KEV covers how to use that signal.
  6. Keep the audit trail. Record which VEX document suppressed which finding, and re-evaluate when the document’s version changes.

CISA’s guidance also notes that VEX statements cover known vulnerabilities and that attackers often chain flaws; new vulnerabilities may emerge that do affect a product. A “not affected” for one CVE says nothing about the next.

Using VEX with scanners

Tool support varies. As one example, Trivy’s documentation says VEX can be used “to filter vulnerabilities based on their status,” and shows the --vex option with four sources: a VEX repository, a local file, a VEX attestation stored in an OCI registry, or VEX files referenced in an SBOM. That page was marked “EXPERIMENTAL” when we read it and warned that the feature “might change without preserving backwards compatibility.” We did not test Trivy or any other scanner’s VEX handling, and we did not check which formats each scanner accepts, so confirm support for your chosen format and version before relying on it.

Where VEX fits

Limits of this article

We could not read CISA’s “Minimum Requirements for VEX” PDF (access denied). The CISA status-justification document is from June 2022 and its own text says it is not exhaustive and that CISA may add justifications later; we did not look for later revisions. We did not review the CycloneDX VEX specification, or the details of any scanner’s VEX support beyond the Trivy page above. The OpenVEX specification page is titled v0.2.0 but also contains an older revision-table entry using a different version number, so check the version your tools implement.

Sources and verification

Checked on October 13, 2026.

Important claimSourceVerification
VEX documents must contain metadata, product details, vulnerability details and product status; four statuses; five not-affected justifications; statements are the author’s assertions the consumer may accept or notCISA, VEX Status Justifications, June 2022Verified
Definitions and examples for each justification; the caveats on execution path and inline mitigationsSame document, sections 3.3 to 3.7Verified
CISA published “Minimum Requirements for VEX,” page dated April 21, 2023CISA resource pageQualified: PDF itself could not be downloaded
OpenVEX required fields; justification or impact statement required for not_affected; free text discouraged for automation; action_statement for affected; author signature recommendation; version incrementingOpenVEX specificationVerified
OpenVEX says it aims to meet CISA’s April 2023 minimum requirementsSame specification, overviewQualified: the OpenVEX project’s own claim
CSAF 2.0 is an OASIS Standard dated November 18, 2022; errata dated January 26, 2024CSAF 2.0 errata 01Verified
CSAF Profile 5 requirements; product_status categories; flag labelsCSAF 2.0 standardVerified
Trivy --vex options; page marked experimentalTrivy VEX documentationQualified: read October 13, 2026; may change
Status mapping table; reading checklistOur analysisQualified: editorial judgment, labelled as such

Frequently asked questions

What does VEX stand for?

Vulnerability Exploitability eXchange. CISA's June 2022 status-justification guidance describes it as a form of security advisory that lets a supplier or other party assert the status of specific vulnerabilities in a particular product.

Is VEX the same as an SBOM?

No. An SBOM is an inventory of components. A VEX document is a set of statements about the exploitability status of specific vulnerabilities in a specific product. They are often used together: the SBOM tells a scanner what to look for, and VEX tells a reader which findings the supplier says do not apply.

Should I suppress a scanner finding because a vendor says 'not affected'?

CISA's guidance says VEX statements are assertions the consumer may accept or reject. A reasonable approach, which is our suggestion rather than a CISA requirement, is to accept statements from suppliers you trust for the exact product version and component you run, to prefer machine-readable justifications over free text, and to keep the original finding recorded alongside the reason it was suppressed.

Which VEX formats exist?

This article covers two: OpenVEX, a lightweight JSON format whose specification says it aims to meet CISA's minimum requirements, and CSAF 2.0, an OASIS Standard that includes a VEX profile (Profile 5). CycloneDX can also carry VEX data; we did not review its specification for this article.

Supply ChainVulnerability Management