VEX: When Should You Accept not_affected?
Check the product, version, justification, and evidence in a VEX advisory before closing a CVE alert or postponing a patch.

A VEX not_affected status asserts that a vulnerability does not affect the products identified in the advisory. Before closing the CVE alert, verify that the deployed product falls within that scope and that the justification describes your situation.
Ask whether this version of the advisory explains why this instance of your product is not affected. Merely establishing that the supplier published a VEX document is insufficient. Keeping the question specific prevents a narrow statement from becoming a permanent exception across an entire software catalog.
Start with the product, then examine the status
Record the product, version, distribution method, and deployed artifact. A commercial name is not always enough to distinguish a hosted service, an appliance, and a locally built container image.
Compare those details with the available SBOM and actual inventory. If the SBOM describes another build, fix the mapping first. Sound technical analysis applied to the wrong product can still produce an incorrect closure.
For each decision, preserve the advisory received, its source, author, and date. A link to a page that will change may not let you reconstruct what was originally stated. Also retain the document's version number or identifier when available.
The CISA minimum requirements for VEX distinguish affected, not affected, fixed, and under investigation statuses. They call for a justification or impact statement for not_affected. This framework describes the information exchanged; the procedure below concerns its technical verification in your environment.
Turn the justification into a testable question
A justification becomes useful when the team knows what evidence to request. “The component is absent” calls for examining the artifact. “The vulnerable code is not used” calls for an analysis of execution paths. Those assertions cannot be verified with the same document.
| Stated reason | Evidence to seek in the case | Trigger for review |
|---|---|---|
| Component absent | Inventory of the relevant artifact and the identification method | New image or dependency |
| Vulnerable code absent | Build configuration, patch, or binary analysis | Build changes |
| Code unreachable through the product's use | Analysis of calls and possible inputs | New functionality or configuration |
| Built-in protection prevents exploitation | Description and verification of the mechanism | Mechanism changes or a new attack path |
This table proposes a review method. It does not replace the exact values in the format your supplier uses. Validate the fields and vocabularies before ingesting them.
Do not substitute an operational preference for missing evidence. “The patch is difficult to deploy” explains a scheduling problem. It does not establish that the vulnerability is inapplicable.
A fictional example: the dependency is present, the function is absent
Imagine an internal application called Atelier, distributed in two variants. The server variant includes a library with an optional module affected by a CVE. The minimal variant uses a build that excludes the module. This example is fictional and does not describe a real vulnerability.
The supplier publishes a not_affected advisory for the minimal variant. A dependency scanner still recognizes the library and flags the CVE. Both results can coexist: one identifies a component; the other analyzes its contents within a particular product.
The analyst checks the installed artifact and confirms that it is the minimal variant covered by the advisory. They retain the build reference and evidence that the module was excluded. The closure records those details and the CVE concerned. It does not remove every alert associated with that library.
If the environment uses the server variant, the advisory does not answer the question. If the installed variant remains unknown, the case still needs investigation. Similar version numbers should not be sufficient grounds for applying the exception.
Respect the differences between formats
OpenVEX uses not_affected and justifications such as vulnerable_code_not_present. Its specification connects statements to identified products and vulnerabilities. It also distinguishes protection built into a product from an assumption about its environment.
This matters when a team cites its firewall as the reason a product is not exposed. An external, changeable control needs a local risk assessment and follow-up. It should not automatically become a supplier statement that the product is inherently unaffected.
CycloneDX has its own analysis model, including fields such as state, justification, and response. Its vulnerability exploitability guide describes their roles. Converting between formats must preserve meaning without assuming that every label has a direct equivalent.
Test the connector with a recognized advisory, an incomplete advisory, and a value it does not understand. In the last case, the tool should leave the decision visible to an analyst. Silently dropping an unknown field can turn a limited condition into a blanket exemption.
Put boundaries on the closure decision
Associate the closure with the CVE, product, version or artifact, and advisory version. Add the person or team that accepted the reasoning and the date of the check.
Then define what should reopen the case: a new product version, a configuration change, a revised advisory, or new information contradicting the justification. A status accepted today does not automatically apply to the next update.
Retain the scanner finding and its explanation instead of deleting it. During a technical audit or a handover, the record should show why a known alert did not require the same action as another. This history also helps identify exceptions that no longer apply.
The SBOM guide for security teams helps establish the initial inventory. The supply chain CVE response process then places the advisory within dependency and patch management.
For your next alert accompanied by VEX, request four concrete items: the deployed artifact, applicable advisory, evidence supporting the justification, and condition for review. If one is missing, assign an owner to obtain it and keep the limitation explicit. Close the case once the conclusion has been established for the product concerned.
FAQ
Frequently asked questions
What does not_affected mean in a VEX advisory?
The author asserts that the vulnerability does not affect the products identified in the advisory. Compare that conclusion with the deployed version, justification, and conditions of use.
Does an SBOM prove that a CVE is exploitable?
No. It helps identify which components are present. Applicability and exploitability require an analysis of the product and its context.
Can an alert be deleted as soon as a VEX advisory arrives?
Not without validating its provenance, scope, and applicability. Retain the alert, advisory, and decision, together with the events that should trigger a review.
Related articles
- CVE-2026-63077 Puts Unauthenticated RCE on Every TeamCity On-Premises Server
A deserialization flaw in the agent polling protocol gives attackers TeamCity server privileges without credentials. JetBrains patched in 2025.11.7 and 2026.1.3 — CISA KEV and a 3-day federal deadline mean hunt now, not after the next release train.
- CVE-2026-9198 Gives Unauthenticated RCE in IBM Langflow OSS Agent Control Planes
A SUPERUSER token minted through /api/v1/auto_login chains with Python exec() in /api/v1/validate/code. Langflow 1.10.1 fixes the flaw — but internet-exposed instances need hunting now, not after the next sprint.
Supply Chain CVE Response: SBOMs, Dependency Risk, and Coordinated Vulnerability DisclosureBuild a modern supply-chain security program: generate SBOMs, map CVEs to components, integrate EPSS and KEV, and coordinate fixes across vendors and open-source maintainers.
Check any IP or domain
See what our indexed threat intelligence records say about it.
Try the IP / Domain Checker