Key takeaways
- Every OpenVEX statement carries one of four status values: not_affected (no action needed), affected (remediation recommended), fixed (a fix ships in this version), or under_investigation (not yet determined).
- No — CISA's own VEX guidance names four formats in current use without mandating any one of them.
- OpenVEX only states exploitability — it assumes a product and component identifiers already exist, from an SBOM or otherwise.
OpenVEX is a minimal JSON-LD document format for stating whether a specific CVE actually affects a specific product — built, in the project's own words, to be "lightweight, and embeddable while meeting all requirements of a valid VEX implementation" as defined in CISA's April 2023 Minimum Requirements for VEX. An OpenVEX document needs just six fields (@context, @id, author, timestamp, version, statements) and does not need to be wrapped inside an SBOM, which makes it the smallest-footprint of the four VEX implementations CISA tracks today: the CSAF 2.0 VEX profile, CycloneDX, SPDX 3.0, and OpenVEX itself.
Why does a device maker need a VEX format at all?
An SBOM lists every component in a product; a vulnerability scanner matching that component list against the NVD or OSV will flag every CVE affecting every listed library version — most of which never execute in a way that's actually reachable or exploitable in that product. A VEX (Vulnerability Exploitability eXchange) document is the manufacturer's own machine-readable statement of which of those flagged CVEs actually matter, separating signal from noise for a downstream customer or regulator running automated SBOM-to-vulnerability matching. The Cyber Resilience Act's CRA vulnerability-handling obligations and most large-customer SBOM intake programs expect exactly this kind of exploitability triage, not a raw, unfiltered CVE list.
What does an OpenVEX document actually contain?
Six required top-level fields, per the official OPENVEX-SPEC.md: @context (the OpenVEX JSON-LD context URL), @id (a document identifier that must be an IRI compliant with RFC3987 — OpenVEX offers a public namespace at https://openvex.dev/docs/[name]), author, timestamp, version (incremented on any content change), and statements — the array of per-vulnerability assessments, each naming a product, a vulnerability identifier, and a status.
What are the four status values and the not_affected justifications?
Every OpenVEX statement carries one of four status values: not_affected (no action needed), affected (remediation recommended), fixed (a fix ships in this version), or under_investigation (not yet determined). A not_affected statement must include either a free-form impact_statement or one of five machine-readable justification labels defined by the spec: component_not_present, vulnerable_code_not_present, vulnerable_code_not_in_execute_path, vulnerable_code_cannot_be_controlled_by_adversary, and inline_mitigations_already_exist — the same justification vocabulary CISA's Minimum Requirements document defines, so a scanner or customer intake tool can parse the reason programmatically instead of relying on prose.
Does OpenVEX replace CycloneDX VEX or CSAF VEX?
No — CISA's own VEX guidance names four formats in current use without mandating any one of them. The practical differences are weight and workflow fit. CSAF 2.0 VEX (see our CSAF/VEX guide) is built for PSIRTs that already run a full CSAF advisory-publishing pipeline with discoverable provider metadata. CycloneDX VEX (see our CycloneDX VEX guide) fits teams whose tooling already emits CycloneDX SBOMs, either embedding VEX statements in the same document or publishing them standalone via bom-link. OpenVEX is the lightest of the three: a single small JSON-LD file with no encapsulating SBOM and no advisory-publishing infrastructure required, which is why it shows up as the default output format in several open-source vulnerability-triage and SBOM-generation tools, including the project's own vexctl CLI and the openvex/go-vex library used to consume and transform VEX data from other formats.
Does OpenVEX cover firmware that has no build-time SBOM?
OpenVEX only states exploitability — it assumes a product and component identifiers already exist, from an SBOM or otherwise. For firmware where no source-accurate SBOM exists because the binary was built by a third-party vendor, the harder problem is generating a trustworthy component list in the first place (see our firmware SBOM guide). SoftWSP's firmware security assessments extract the actual open-source component inventory from a firmware binary and flag which flagged CVEs are reachable in the shipped build, producing the kind of evidence a not_affected OpenVEX justification needs to be defensible rather than asserted. See PSIRT services for how VEX publishing fits into an ongoing disclosure workflow.
This guide is based on the official OPENVEX-SPEC.md in the openvex/spec GitHub repository, the OpenSSF OpenVEX project page, and CISA's April 2023 Minimum Requirements for Vulnerability Exploitability eXchange document, all read directly for this guide. The OpenVEX specification is actively versioned (v0.2.0 at the time of writing, which introduced an expanded product and vulnerability field structure); check the spec repository for the current version before implementing against a specific field layout.
Sources
Frequently asked questions
What is OpenVEX?
OpenVEX is an implementation of the Vulnerability Exploitability eXchange (VEX) format designed, in the project's own words, to be 'lightweight, and embeddable while meeting all requirements of a valid VEX implementation' as defined in CISA's Minimum Requirements for VEX (published April 2023). It is a minimal JSON-LD document that states whether a specific vulnerability actually affects a specific product, independent of any single SBOM format.
What fields does an OpenVEX document require?
Six: @context (a URL linking to the OpenVEX context definition), @id (an IRI, compliant with RFC3987, identifying the document), author, timestamp, version (incremented whenever document content changes), and statements — the list of per-vulnerability assessments. OpenVEX provides a public namespace for document identifiers at https://openvex.dev/docs/[name].
What are the four VEX status values, and what does not_affected require?
not_affected, affected, fixed, and under_investigation. A not_affected statement must carry either a machine-readable justification or a free-form impact statement; OpenVEX defines five justification labels: component_not_present, vulnerable_code_not_present, vulnerable_code_not_in_execute_path, vulnerable_code_cannot_be_controlled_by_adversary, and inline_mitigations_already_exist.
Does OpenVEX need to be embedded in an SBOM?
No. Unlike CycloneDX's embedded VEX, which lives inside the same BOM document as the component list, OpenVEX documents stand alone by design — the project's own spec states OpenVEX does not require an 'encapsulating document,' which lets a vendor assert VEX data about a product without also shipping an SBOM in the same file. It can still reference external SBOM component identifiers, working with SPDX, CycloneDX or any other format.
How does OpenVEX compare to CycloneDX VEX and CSAF VEX?
CISA's own VEX guidance lists four implementations in active use: the CSAF 2.0 VEX profile, OpenVEX, CycloneDX, and SPDX 3.0. CSAF VEX is the heaviest-weight, built for PSIRTs already running full CSAF advisory infrastructure (see our CSAF/VEX guide). CycloneDX VEX is convenient when the same pipeline already emits a CycloneDX SBOM. OpenVEX is the smallest footprint of the three — a single small JSON file, easy to generate from a CI pipeline or a vulnerability-triage tool with no advisory-publishing infrastructure required.
In this cluster


