SBOM and VEX Policy: [Organisation name]
Organisation policy for producing, consuming, signing, distributing and retaining software bills
of materials (SBOMs) and vulnerability exploitability exchange (VEX) statements. Data fields and
practices follow the joint CISA guidance 2026 Minimum Elements for a Software Bill of Materials
(SBOM) (version 2.1, 29 July 2026), which updates and replaces the NTIA 2021 minimum elements.
Formats: CycloneDX 1.7 (ECMA-424, 2nd edition, December 2025) and SPDX 3.0.1 (December 2024). VEX
follows the CISA Minimum Requirements for VEX (April 2023) and is expressed in CycloneDX, the
OASIS CSAF 2.0 VEX profile or OpenVEX v0.2.0. Appendix A maps every 2026 minimum element to
CycloneDX 1.7 and SPDX 3.0.1 fields. Replace every [bracketed] value and every row marked
Example. Worked examples use Corvid Commerce, a fictional SaaS company that also ships an
on-premises point-of-sale agent and an open-source SDK. This is a documentation format, not legal
advice.
Document control
| Field | Value |
|---|
| Document ID | [SBV-POL-001] |
| Version | [1.0] |
| Status | [Draft / In review / Approved / Superseded] |
| Owner | [@head-of-product-security] |
| Approvers / reviewers | [@ciso], [@vp-engineering], [@head-of-legal], [@head-of-procurement] |
| Last updated | YYYY-MM-DD |
| Classification | [Internal] |
| Effective date | YYYY-MM-DD |
| Next review | YYYY-MM-DD (at least annually, and within 90 days of a new major format or guidance version) |
| Products in scope | [Example: Corvid Storefront (SaaS), Corvid POS Agent (on-premises), corvid-sdk (open source)] |
| Primary SBOM format | [Example: CycloneDX 1.7 JSON] |
| Secondary SBOM format | [Example: SPDX 3.0.1 JSON-LD, on request] |
| VEX formats | [Example: CSAF 2.0 VEX profile for customers, OpenVEX v0.2.0 for corvid-sdk] |
| Related | [Software supply chain assessment], [PSIRT procedure], [Dependency management policy], [Records retention schedule] |
Approvals
| Role | Name | Decision | Date |
|---|
| Chief information security officer | [@name] | [Approved / Changes requested] | YYYY-MM-DD |
| VP Engineering | [@name] | [Decision] | YYYY-MM-DD |
| Head of Legal | [@name] | [Decision] | YYYY-MM-DD |
| Head of Procurement | [@name] | [Decision] | YYYY-MM-DD |
Revision history
| Version | Date | Author | Change summary |
|---|
| 0.1 | YYYY-MM-DD | [@name] | First draft |
| 0.2 | YYYY-MM-DD | [@name] | Example: Field mapping (Appendix A) validated against generator output for all three products |
| 1.0 | YYYY-MM-DD | [@name] | Example: Approved; replaces SBOM section of the 20XX secure development standard |
Contents
1. Purpose and drivers
1.1 Purpose
This policy makes software composition transparent, both for the software [Organisation name] ships
and for the software it buys. It sets one organisation-wide rule set so that every product produces
SBOMs with the same minimum content, signs them the same way, publishes VEX statements to explain
vulnerability status, and keeps the records long enough to answer a customer, auditor or regulator
about any supported version.
The policy has three outcomes. Know what we ship: for every released version, an accurate,
signed, machine-processable component inventory exists and is retrievable. Answer "are we
affected?" quickly: when a vulnerability is published, the security team can tell within hours
which products and versions contain the component and can publish a VEX status. Know what we
buy: third-party software that processes our data or runs in our environment comes with SBOM
data that we validate and ingest.
1.2 Drivers
| ID | Driver | Requirement it creates | Policy statements |
|---|
| DRV-01 (Example) | CISA 2026 Minimum Elements for an SBOM | Baseline data fields and practices for SBOMs requested and produced | 4.3, Appendix A |
| DRV-02 (Example) | EU Cyber Resilience Act, Regulation (EU) 2024/2847, Annex I Part II point 1 | Manufacturers identify and document components, including by drawing up an SBOM covering at least top-level dependencies (check the consolidated text and any implementing act on format) | 4.1, 4.3, 8 |
| DRV-03 (Example) | Enterprise customer contracts (retail chains buying Corvid POS Agent) | SBOM per release delivered within 5 business days of request; VEX for listed CVEs | 6.2, 5.1 |
| DRV-04 (Example) | OpenSSF OSPS Baseline OSPS-QA-02.02 and OSPS-VM-04.02 (corvid-sdk) | Released compiled assets carry an SBOM; non-affecting vulnerabilities explained in VEX | 4.2, 5.1 |
| DRV-05 | [Sector or national rule] | [Requirement] | [Section] |
2. Scope and applicability
2.1 In scope and out of scope
| Item | In scope | Notes |
|---|
| Distributed software: installable software, container images, mobile apps, firmware, libraries | Yes | Every product, version and release channel shipped to customers or the public |
| Open-source projects maintained by employees in an official capacity | Yes | Public channels per section 6.2 |
| Software operated as a service (SaaS) | Yes | Deployed services that customers depend on; deployed-context SBOM (SBV-08) |
| Internal build and signing platforms (CI/CD runners, base images) | Yes | They are components of the delivered product |
| Third-party software used in production or processing confidential data | Yes | Consumption rules in section 7 |
| AI components embedded in products (models, datasets, agent tools) | Yes | Additional elements recorded in the AI bill of materials |
| End-user productivity software that does not process customer data | No | Unless procurement flags it as critical |
| Prototypes and spikes that never leave a development environment | No | Becomes in scope at first external release |
| Data management and storage details inside SBOM tools | No | Also out of scope of the CISA guidance |
2.2 Lifecycle
Each arrow is a control point covered by a numbered statement in sections 4 to 7.
3. Roles and responsibilities
3.1 Roles
| Role | Responsibilities |
|---|
| Policy owner (Head of Product Security) | Maintains this policy, approves exceptions up to Medium risk, reports metrics quarterly |
| Product engineering lead | Ensures the product's release pipeline generates, validates and signs SBOMs that meet section 4 |
| Build platform team | Provides the standard SBOM generation and signing jobs, key management integration and the SBOM repository |
| PSIRT | Matches SBOMs against new vulnerabilities, decides VEX status with engineering, publishes VEX and advisories |
| Release manager | Blocks a release whose SBOM gate fails; confirms SBOM and VEX are published with release notes |
| Legal and open-source programme office | Reviews licence data, approves what is withheld from external SBOMs, owns licence obligations |
| Procurement and vendor risk | Puts SBOM and VEX clauses in contracts; tracks supplier delivery |
| Customer trust team | Handles SBOM requests from customers; tracks NDA status |
3.2 RACI
| Activity | Policy owner | Engineering lead | Build platform | PSIRT | Release manager | Legal | Procurement |
|---|
| Generate SBOM per release | I | A | R | I | C | I | - |
| Sign SBOM and bind to artefact | I | A | R | I | C | - | - |
| Validate SBOM quality gate | C | A | R | C | R | - | - |
| Decide VEX status | C | C | - | A, R | I | - | - |
| Publish VEX or advisory | I | C | - | A, R | I | C | - |
| Answer customer SBOM request | I | C | - | C | - | C | - |
| Contract clauses for supplier SBOMs | C | - | - | C | - | C | A, R |
| Approve exceptions | A | R | C | C | I | C | C |
R = responsible, A = accountable, C = consulted, I = informed.
4. SBOM production
The keywords MUST, MUST NOT, SHOULD and MAY are used as in RFC 2119 and RFC 8174 when written in
capitals.
4.1 Formats and versions
- SBV-01 Every SBOM MUST be produced in a format that is open, machine-processable and widely
supported. The approved formats are CycloneDX and SPDX, the two formats the 2026 minimum elements
name as widely used.
- SBV-02 The primary format MUST be [CycloneDX 1.7] in JSON. Products MAY additionally publish
[SPDX 3.0.1] in JSON-LD where a customer or regulator asks for it.
- SBV-03 Products MUST NOT emit a format version that its maintainer has declared deprecated.
The policy owner reviews supported versions at each review (section 11). At the time of writing
CycloneDX 1.7 is current (Ecma published ECMA-424 2nd edition in December 2025; specification
patch 1.7.2 was tagged in September 2026) and SPDX 3.0.1 is current, with SPDX 3.1 at release
candidate stage only.
- SBV-04 When a new major or minor format version is published, the build platform team SHOULD
support it within [6 months] and MUST keep support for the previous version for at least [12
months] so that customers' tools keep working.
4.2 Generation
- SBV-05 Each released software version or update MUST have its own SBOM, including patch
releases and rebuilt container images whose base layers changed.
- SBV-06 SBOMs MUST be generated automatically in the release build from the resolved dependency
graph (lockfiles, build manifests and the final artefact), not written by hand.
- SBV-07 Each SBOM MUST record its generation context. The default for release SBOMs is the
build phase; products SHOULD add a post-build (analysed) SBOM for container images and firmware,
produced by binary or image analysis, and reconcile it with the build SBOM.
- SBV-08 SaaS services MUST maintain a deployed-context SBOM for each production deployment
unit, regenerated on every deployment, so that the running inventory can be matched against new
vulnerabilities.
- SBV-09 When the producer discovers an error or new information about a component, a revised
SBOM MUST be issued with an incremented SBOM Version and a new timestamp, and the previous
revision kept (section 8).
4.3 Content and coverage
- SBV-10 Every SBOM MUST populate all 17 data fields of the 2026 minimum elements: nine SBOM
Metadata fields and eight Component Data fields, as mapped in Appendix A. The SBOM Author MUST
name the organisation that operated the generator (in full, not as an acronym), never the tool.
- SBV-11 Coverage MUST include all components that make up the target software, including
transitive dependencies, with no minimum depth cut-off. If several instances of one component
differ in metadata, each instance MUST be listed separately with its dependency relationship.
- SBV-12 Non-code files MAY be excluded, but security-relevant configuration files SHOULD be
included.
- SBV-13 Where a field cannot be populated, the SBOM MUST state whether the value is unknown to
the author or deliberately withheld. Silence is not allowed: an empty field is a gate failure.
- SBV-14 Component Producer MUST name the single organisation that created the component, using
its full name rather than an acronym. When the producer cannot be determined, the SBOM MUST mark
the component as of unknown provenance. Suppliers or redistributors (for example a Linux
distribution) are recorded in the supplier field, not as producer.
- SBV-15 Component Identifiers MUST include a Package URL (PURL) where the ecosystem supports
one, and SHOULD include every other identifier known (CPE, SWHID, OmniBOR identifier, commit
hash).
- SBV-16 Component Hash Value MUST be computed over the executable artefact with an approved
algorithm, [SHA-256] minimum, and the algorithm MUST be recorded. MD5 and SHA-1 MUST NOT be the
only hash recorded.
- SBV-17 Component License MUST use SPDX licence identifiers or expressions where they exist;
otherwise it MUST point to where the full licence terms are available and flag proprietary
conditions.
- SBV-18 The SBOM Timestamp MUST be in UTC with an explicit offset (for example
2026-10-24T09:30:00Z), which is valid under RFC 3339 and RFC 9557 and accepted by both formats.
- SBV-19 First-party code copied from another project MUST be recorded as a dependency (an
internal fork with a name), not hidden inside a first-party component.
- SBV-20 Withheld information MUST be limited to what Legal approves (for example unreleased
internal component names in a public SBOM), and recipients MUST have a documented route to ask
about withheld security-relevant data.
4.4 Signing and integrity
- SBV-21 Every distributed SBOM MUST carry an SBOM Author Signature that lets a recipient verify
who produced it and that it was not modified.
- SBV-22 Signatures MUST use an algorithm approved by NIST (FIPS 186-5) or an equivalent
national authority. [Example: ECDSA P-256 with SHA-256 via the organisation's keyless signing
service, with transparency log entries.]
- SBV-23 The SBOM MUST be bound to the artefact it describes, either as a signed attestation
that references the artefact digest or by listing the target component hash in the SBOM itself.
- SBV-24 Signing keys MUST be managed under the key management standard, with private keys in a
hardware-backed or managed key service and rotation at least every [12 months] for long-lived
keys.
- SBV-25 SPDX 3.0.1 has no in-document signature property, so SPDX SBOMs MUST be signed with a
detached signature distributed beside the document. CycloneDX SBOMs MAY use the enveloped JSON
Signature Format signature or a detached signature; the product records which.
4.5 Quality gate
Every release pipeline runs an automated SBOM gate. A release MUST NOT be promoted if the gate
fails, unless an exception is approved (section 9).
| Gate check | Rule | Threshold |
|---|
| QG-01 Schema validity | Document validates against the official schema of its format version | 100% |
| QG-02 Metadata completeness | All nine SBOM Metadata fields present | 100% |
| QG-03 Component completeness | Name, version, producer, identifier, hash, licence present or explicitly marked unknown or withheld | 100% marked; [95%] populated (Example) |
| QG-04 PURL coverage | Components with a PURL, where the ecosystem supports PURL | [98%] (Example) |
| QG-05 Dependency graph | Every component reachable from the target component through dependency relationships | 100% |
| QG-06 Signature | Signature verifies against the published key or identity | Pass |
| QG-07 Drift | Build SBOM and post-build SBOM differ by no more than the accepted list | [0 unexplained components] (Example) |
| QG-08 Prohibited components | No component on the deny list (licence or security) | 0 |
4.6 Worked example
| Product | Version | Formats | Generation context | Components | Unknown or withheld | Gate | Notes |
|---|
| Corvid POS Agent (Example) | 5.4.0 | CycloneDX 1.7, SPDX 3.0.1 | build plus post-build | 412 | 6 unknown producer, 0 withheld | Pass | 6 vendored C files marked unknown provenance; ticket SEC-2201 to trace origin |
| Corvid Storefront (Example) | deploy 2026-10-20.3 | CycloneDX 1.7 | deployed | 1,186 | 0 unknown, 14 withheld (internal service names) | Pass | Shared with customers under NDA |
| corvid-sdk (Example) | 3.2.1 | CycloneDX 1.7 | build | 37 | 0 | Pass | Published on the release page with the signature bundle |
5. VEX and exploitability statements
5.1 When to issue VEX
- SBV-26 PSIRT MUST publish a VEX statement for a product version when any of the following is
true: a vulnerability in a listed component is added to the CISA Known Exploited Vulnerabilities
catalogue; a customer asks about a specific vulnerability; a vulnerability rated High or Critical
is published for a component in a supported version; or the product is affected and a fix or
mitigation is available.
- SBV-27 PSIRT SHOULD publish "not affected" statements proactively for widely reported
vulnerabilities in components the product does not contain or does not reach, to reduce customer
triage effort.
- SBV-28 An "under investigation" statement SHOULD be published within [2 business days] of a
High or Critical vulnerability in a listed component being made public, and updated to a final
status within [10 business days] (Example targets; align with the PSIRT procedure).
5.2 Status, justification and evidence
Every VEX statement MUST identify the product (and version), the vulnerability and one status. The
four statuses come from the CISA minimum requirements for VEX (April 2023); the five "not affected"
justification labels come from the earlier CISA document VEX Status Justifications (June 2022).
| Status | Additional content required | Evidence before publishing |
|---|
| Not affected | A justification from the fixed list, or an impact statement explaining why the vulnerability cannot be exploited | Engineering analysis recorded in the PSIRT case; second reviewer from product security |
| Affected | An action statement describing remediation or mitigation | Reproduction or reachability analysis; fix plan |
| Fixed | The fixed product versions | Release record showing the patched component version |
| Under investigation | None beyond identification | Case opened in the PSIRT tracker |
- SBV-29 A "not affected" status MUST NOT be published on the grounds of a compensating control
the customer must configure; that is "affected" with a mitigation in the action statement.
- SBV-30 The justifications "vulnerable code cannot be controlled by adversary" and "inline
mitigations already exist" MUST be approved by the head of product security, because they are hard
to prove and frequently bypassed.
- SBV-31 Every change of status MUST produce a new VEX document version with a new timestamp;
earlier versions are retained.
5.3 Formats and binding to SBOMs
- SBV-32 Customer-facing VEX MUST be machine-readable. Approved formats are the CSAF 2.0 VEX
profile, CycloneDX 1.7 vulnerability analysis (embedded in or alongside the BOM) and OpenVEX
v0.2.0 (a draft specification: use it where the ecosystem expects it, such as container image
scanners and open-source projects).
- SBV-33 VEX statements MUST reference products with the same identifiers used in the SBOM (PURL
or CPE plus version) so that tools can correlate them automatically.
- SBV-34 VEX documents MUST be signed under the same rules as SBOMs (4.4).
- SBV-35 Full advisories for affected products are produced with the Security Advisory template
(
security/security-advisory); this policy governs the VEX content only.
5.4 Worked example
| VEX ID | Product version | Vulnerability | Status | Justification or action | Approved by | Format |
|---|
| CORVID-VEX-2026-031 (Example) | Corvid POS Agent 5.4.0 | CVE-YYYY-NNNNN (XML parser entity expansion) | Not affected | Vulnerable code not in execute path: the parser is used only for signed configuration from the management server, with entity expansion disabled | [@head-of-product-security] | CSAF 2.0 VEX |
| CORVID-VEX-2026-032 (Example) | Corvid POS Agent 5.3.2 | CVE-YYYY-NNNNN (TLS library) | Affected | Upgrade to 5.3.3; until then disable the legacy cipher list in agent settings | [@psirt-lead] | CSAF 2.0 VEX |
| CORVID-VEX-2026-033 (Example) | corvid-sdk 3.2.1 | CVE-YYYY-NNNNN (HTTP client) | Fixed | Fixed in 3.2.1 (client pinned to the patched release) | [@maintainer] | OpenVEX |
6. Distribution and access
6.1 Rules
- SBV-36 SBOMs and VEX MUST be available promptly to those who need them, through the channel
defined per product class below.
- SBV-37 Access controls MAY restrict SBOM data to authorised parties (for example customers
under NDA), but MUST NOT prevent an authorised recipient from importing the data into its own
security tooling.
- SBV-38 Each SBOM MUST be retrievable by a stable, version-specific URL or API query, and MUST
be referenced from the release notes.
- SBV-39 Distribution services MUST follow the organisation's security policy (authenticated
channels, TLS, logging of downloads for restricted documents).
6.2 Channels by product class
| Product class | SBOM channel | VEX channel | Audience | Response time for requests |
|---|
| Open-source projects (Example) | Release page, signed, public | Repository vex/ directory and release page | Public | Published with release |
| Installable software (Example) | Customer trust portal and inside the installation package | Trust portal and CSAF provider metadata | Customers | Published with release |
| SaaS (Example) | Trust portal, on request, under NDA | Trust portal | Customers and auditors | [5 business days] |
| Regulators and market surveillance | Secure transfer on reasoned request | Same | Authorities | Per legal deadline |
7. Consuming third-party SBOMs and VEX
- SBV-40 Contracts for software in scope (2.1) MUST require the supplier to provide an SBOM
meeting the 2026 minimum elements for each delivered version, in CycloneDX or SPDX, with VEX or
CSAF advisories for vulnerabilities in listed components. Use the supplier security assessment for
the wider questionnaire.
- SBV-41 Received SBOMs MUST be validated on intake: schema validity, signature verification,
the 17 data fields and a spot check of coverage (for example comparing with a binary scan of the
delivered artefact).
- SBV-42 Validated SBOMs MUST be ingested into the central inventory and matched against
vulnerability sources at least [daily].
- SBV-43 Supplier VEX "not affected" statements MAY be used to suppress findings only when the
VEX is signed by the supplier and references the exact product version in use.
- SBV-44 SBOM quality issues (missing fields, failed signature, large undeclared components)
MUST be raised with the supplier and recorded in the vendor risk register; persistent failure is a
risk acceptance decision (section 9).
| Supplier (Example) | Product | SBOM received | Validation result | Action |
|---|
| Northwind Payments Ltd (fictional) | Card terminal SDK 8.1 | CycloneDX 1.6, signed | 15 of 17 fields: SBOM Generation Context and Component License missing | Request revised SBOM by YYYY-MM-DD; ingest meanwhile with gaps flagged |
| Example Analytics Inc (fictional) | Reporting service (SaaS) | None | Not delivered | Contract renewal blocked until clause accepted |
8. Retention and records
- SBV-45 Every SBOM and VEX revision MUST be retained, with its signature, for at least the
longest of: the product version's support period plus [2 years]; the contractual retention period;
and any legal retention period (for products under the EU Cyber Resilience Act, check the
technical documentation retention requirement in the consolidated text).
- SBV-46 Records MUST be stored in the SBOM repository with integrity protection (write-once
storage or signed manifests) and backed up under the backup policy.
- SBV-47 Deletion at the end of retention MUST follow the records schedule and be logged.
| Record | Retention (Example) | Location | Owner |
|---|
| Release SBOMs and signatures | Support period plus 10 years (CRA products) | SBOM repository, immutable bucket | Build platform |
| Deployed SaaS SBOMs | 3 years | SBOM repository | Build platform |
| VEX documents, all revisions | Same as the related SBOM | CSAF provider and repository | PSIRT |
| Supplier SBOMs | Contract term plus 3 years | Vendor risk system | Procurement |
| Gate results | 3 years | CI logs archive | Release management |
9. Exceptions and risk acceptance
- SBV-48 Any deviation from a MUST statement requires an exception recorded in the exception
register with: the statement ID, product and version, reason, compensating measures, risk rating,
owner and expiry date (maximum [6 months], renewable once).
- SBV-49 Approval levels: Low and Medium risk by the policy owner; High risk by the CISO; any
exception that affects a regulatory or contractual obligation also requires Legal.
| Exception ID | Statement | Product | Reason | Compensating measure | Risk | Approved by | Expires |
|---|
| SBV-EXC-004 (Example) | SBV-08 | Corvid Storefront legacy reporting service | Deployment tooling cannot run the SBOM job | Weekly image scan of the running container; migration to the standard pipeline planned in Q1 | Medium | [@head-of-product-security] | YYYY-MM-DD |
10. Compliance measurement
| Metric | Formula | Target (Example) | Source |
|---|
| M1 SBOM coverage | Releases with a gate-passing signed SBOM ÷ all releases in the period × 100 | 100% | Release records |
| M2 Field completeness | Populated or explicitly marked fields ÷ (17 × components) × 100 | 100% marked, ≥ 95% populated | Gate results |
| M3 VEX timeliness | Median business days from public disclosure to final VEX status for High and Critical | ≤ 10 | PSIRT tracker |
| M4 Customer request time | Requests answered within target ÷ all requests × 100 | ≥ 95% | Trust portal |
| M5 Supplier SBOM coverage | In-scope suppliers delivering compliant SBOMs ÷ in-scope suppliers × 100 | ≥ 80% this year | Vendor risk register |
| M6 Drift findings | Unexplained components found by post-build analysis per release | 0 | Gate QG-07 |
Example quarter for Corvid Commerce: 46 releases, 46 with passing signed SBOMs (M1 = 100%); 1,635
components across the latest SBOMs of three products, 27,795 field slots (1,635 × 17), 27,795 marked
and 27,402 populated (M2 = 100% marked, 98.6% populated); median VEX time 6 business days (M3 met);
19 of 20 customer requests on time (M4 = 95%); 12 of 18 suppliers compliant (M5 = 66.7%, below
target, action owned by Procurement).
11. Review cycle
The policy owner reviews this policy at least annually, records the outcome in the revision
history, and also reviews it when any of these triggers occurs:
- a new edition of the CISA minimum elements or of related guidance, such as the G7 Software Bill
of Materials for AI: Minimum Elements (May 2026);
- a new CycloneDX or SPDX version (SPDX 3.1 final, CycloneDX 1.8) or CSAF 2.1 approval as an OASIS
standard;
- an EU implementing act specifying SBOM format or elements under the Cyber Resilience Act;
- an incident where SBOM or VEX data was wrong, late or missing;
- two consecutive quarters below target on any metric in section 10.
12. Related documents
| Document | Relationship |
|---|
Software Supply Chain Security Assessment (security/supply-chain-security) | Product-level assessment (SLSA, signing, Scorecard) that applies this policy |
AI Bill of Materials (ai-data/ai-bom) | Additional elements for models, datasets and agent tools |
CRA Vulnerability Handling and Reporting Procedure (security/cra-vulnerability-handling) | EU duties for SBOM, vulnerability handling and reporting |
Security Advisory (security/security-advisory) | Public advisory format that carries VEX for affected products |
PSIRT Vulnerability Handling (security/psirt-vulnerability-handling) | Producer-side triage that decides VEX status |
Vulnerability Disclosure Policy (security/vulnerability-disclosure-policy) | Public intake channel for reports |
Dependency Management Policy (dev/dependency-management-policy) | Rules for adding and updating the components the SBOM lists |
Release Checklist (dev/release-checklist) | Release step that confirms SBOM and VEX publication |
SSDF Practice Conformance (security/ssdf-practice-attestation) | Evidence that SBOM practices meet NIST SSDF expectations |
Supplier Security Assessment (compliance/supplier-security-assessment) | Questionnaire that includes the SBOM clauses of section 7 |
OSS Project Security Baseline (security/oss-project-security-baseline) | Self-assessment for open-source projects, including SBOM and VEX controls |
13. Glossary and references
13.1 Glossary
| Term | Definition |
|---|
| SBOM | Software bill of materials: a nested, machine-processable inventory of the components that make up a piece of software |
| Target component | The component an SBOM is generated for |
| Component Producer | The single organisation that created a component, distinct from a distributor or supplier |
| SBOM Author | The entity that operated the tool to create the SBOM data |
| Generation context | The lifecycle phase (before build, build, after build, deployed) in which the SBOM was produced |
| VEX | Vulnerability exploitability exchange: a statement of whether a product version is affected by a vulnerability |
| CSAF | Common Security Advisory Framework, an OASIS standard for machine-readable advisories, with a VEX profile |
| PURL | Package URL, a uniform identifier for software packages, standardised as ECMA-427 |
| Drift | Components present in the artefact but absent from its build SBOM, or the reverse |
13.2 References
| Reference | Use |
|---|
| CISA, NSA, FBI and international partners, 2026 Minimum Elements for a Software Bill of Materials (SBOM), version 2.1, 29 July 2026 (cisa.gov/resources-tools/resources/2026-minimum-elements-software-bill-materials-sbom; TLP:CLEAR copy: ic3.gov/CSA/2026/260729.pdf) | Element names and practices (4, Appendix A) |
| CISA, Minimum Requirements for Vulnerability Exploitability eXchange (VEX), April 2023 (cisa.gov) | VEX statuses and required content (5) |
| CISA, Vulnerability Exploitability eXchange (VEX): Status Justifications, June 2022 (cisa.gov) | Justification labels (5.2, Appendix B) |
| CycloneDX Bill of Materials Standard 1.7, ECMA-424 2nd edition, December 2025 (cyclonedx.org; ecma-international.org) | Field paths (Appendix A, B) |
| SPDX Specification 3.0.1, 17 December 2024 (spdx.github.io/spdx-spec/v3.0.1) | Field paths (Appendix A, B) |
| OASIS, Common Security Advisory Framework Version 2.0, OASIS Standard, 18 November 2022, with Errata 01 (2024) (docs.oasis-open.org/csaf/csaf/v2.0) | VEX profile and product status (5, Appendix B) |
| OpenVEX Specification v0.2.0, draft (github.com/openvex/spec) | VEX fields (Appendix B) |
| G7 and CISA, Software Bill of Materials for AI: Minimum Elements, May 2026 | Additional AI elements (11) |
| RFC 9557 (timestamps), RFC 9562 (UUIDs), RFC 2119 and RFC 8174 (requirement keywords) | Timestamp, serial number, keywords |
| Regulation (EU) 2024/2847 (Cyber Resilience Act), eur-lex.europa.eu | Driver DRV-02, retention (8) |
Appendix A. Field mapping: CISA 2026 minimum elements to CycloneDX 1.7 and SPDX 3.0.1
A.1 SBOM Metadata
| 2026 minimum element | Meaning (paraphrased) | CycloneDX 1.7 | SPDX 3.0.1 | Policy |
|---|
| SBOM Author | Entity that created the SBOM data (the operator of the tool, not the tool) | metadata.manufacturer (organisation) or metadata.authors (people) | CreationInfo.createdBy (Organization or Person agent) | SBV-06, SBV-10, SBV-21 |
| SBOM Author Signature | Digital signature attributable to the SBOM author | Top-level signature (JSON Signature Format) or detached signature | No in-document property: detached signature over the serialised document | SBV-21 to SBV-25 |
| SBOM Data Format Name | Name of the data format | bomFormat = CycloneDX | Implied by the SPDX 3.0.1 JSON-LD context and the SpdxDocument type | SBV-01 |
| SBOM Data Format Version | Version identifier of that format | specVersion = 1.7 | CreationInfo.specVersion = 3.0.1 | SBV-03 |
| SBOM Generation Context | Lifecycle phase and data available when generated | metadata.lifecycles[].phase (design, pre-build, build, post-build, operations, discovery, decommission) | software_Sbom.software_sbomType (design, source, build, deployed, runtime, analyzed) | SBV-07 |
| SBOM Timestamp | Date and time of the most recent update, per RFC 9557 | metadata.timestamp | CreationInfo.created | SBV-18 |
| SBOM Tool Name | Tool used to generate or amend the SBOM | metadata.tools.components[].name | CreationInfo.createdUsing (Tool element name) | SBV-06 |
| SBOM Tool Version | Version of that tool | metadata.tools.components[].version | Tool has no version property: include the version in the Tool name or an externalIdentifier | SBV-06 |
| SBOM Version | Author's identifier for this revision of the SBOM | version (integer, increment on change) with a stable serialNumber (UUID URN) | No dedicated property: issue a new SpdxDocument with a new spdxId per revision, link the previous revision to it with an amendedBy relationship and record the revision in name | SBV-09 |
A.2 Component Data
| 2026 minimum element | Meaning (paraphrased) | CycloneDX 1.7 | SPDX 3.0.1 | Policy |
|---|
| Component Producer | Single entity that created the component (replaces 2021 "Supplier Name") | components[].manufacturer; keep supplier for distributors | originatedBy (Agent); keep suppliedBy for distributors | SBV-14 |
| Component Name | Name assigned by the producer | components[].name (with group where the ecosystem uses namespaces) | name | SBV-10 |
| Component Version | Producer's version identifier | components[].version | software_packageVersion | SBV-10 |
| Component Identifiers | Identifiers for look-up (CPE, PURL, SWHID, OmniBOR and others) | purl, cpe, swhid, omniborId, swid | software_packageUrl; externalIdentifier with type packageUrl, cpe23, swhid, gitoid, swid | SBV-15 |
| Component Hash Value | Hash of the executable component artefact | components[].hashes[].content | verifiedUsing Hash hashValue | SBV-16 |
| Component Hash Algorithm | Algorithm used, named per IANA hash function textual names | components[].hashes[].alg (for example SHA-256) | verifiedUsing Hash algorithm (for example sha256) | SBV-16; spellings differ by format and from IANA (sha-256): the rule is the algorithm, not the spelling |
| Component License | Licence identifiers, SPDX identifiers preferred | components[].licenses[] (license.id or expression) | Relationship hasDeclaredLicense or hasConcludedLicense to a licence expression | SBV-17 |
| Component Dependency Relationship | One component is needed by another | dependencies[] with ref and dependsOn | Relationship of type dependsOn (and contains for inclusion) | SBV-11 |
A.3 Practices and Processes
| 2026 practice | What it expects (paraphrased) | Where this policy meets it | Format support |
|---|
| Accommodation of Updates to SBOM Data | Correct errors promptly; accept corrections | SBV-09, SBV-31 | CycloneDX version; SPDX new revision |
| Coverage | All components including transitive; no minimum depth; linked SBOMs allowed if the recipient can access them | SBV-11, SBV-12 | CycloneDX compositions[].aggregate (complete, incomplete, unknown and variants); SPDX Relationship completeness (complete, incomplete, noAssertion) |
| Distribution and Delivery | Prompt availability; access control must not block authorised sharing (absorbs the removed 2021 Access Controls element) | SBV-36 to SBV-39 | Out of format scope |
| Explicitly Identifying Unknown Information | State whether data is unknown or withheld; offer a route to ask about redactions | SBV-13, SBV-20 | CycloneDX compositions with unknown; SPDX noAssertion completeness and NoAssertion elements |
| Frequency | New SBOM for every version, build or update; revised SBOM on new knowledge | SBV-05, SBV-09 | n/a |
| Machine-Processable Data | Support the widely used open formats; retire formats that become unmaintained | SBV-01 to SBV-04 | n/a |
Appendix B. VEX status and justification mapping
| Internal status (CISA VEX) | CSAF 2.0 product_status | CycloneDX 1.7 analysis.state | OpenVEX v0.2.0 status | SPDX 3.0.1 security profile |
|---|
| Not affected | known_not_affected (with a flag or an impact threat) | not_affected (or false_positive when the finding is wrong) | not_affected | VexNotAffectedVulnAssessmentRelationship |
| Affected | known_affected (with a remediation) | exploitable | affected (with action_statement) | VexAffectedVulnAssessmentRelationship |
| Fixed | fixed (and first_fixed) | resolved | fixed | VexFixedVulnAssessmentRelationship |
| Under investigation | under_investigation | in_triage | under_investigation | VexUnderInvestigationVulnAssessmentRelationship |
| CISA and OpenVEX justification | CSAF 2.0 flag label | Closest CycloneDX 1.7 justification |
|---|
| Component not present | component_not_present | code_not_present (component level) |
| Vulnerable code not present | vulnerable_code_not_present | code_not_present |
| Vulnerable code not in execute path | vulnerable_code_not_in_execute_path | code_not_reachable |
| Vulnerable code cannot be controlled by adversary | vulnerable_code_cannot_be_controlled_by_adversary | requires_configuration, requires_environment or requires_dependency (choose the specific reason) |
| Inline mitigations already exist | inline_mitigations_already_exist | protected_by_compiler, protected_at_runtime or protected_by_mitigating_control |
SPDX 3.0.1 class names are shown as defined in the model; in the JSON-LD serialisation they carry
the profile prefix (for example security_VexNotAffectedVulnAssessmentRelationship).
CycloneDX protected_at_perimeter relies on a control outside the product and does not meet SBV-29
for a "not affected" statement to customers.
Standard and licence note
Based on the joint guidance 2026 Minimum Elements for a Software Bill of Materials (SBOM) led by
CISA (July 2026) and the CISA Minimum Requirements for VEX (April 2023), works of the United
States Government; minimum element names are used exactly as published and their meanings are
paraphrased. Field names are cited from CycloneDX 1.7 (Apache License 2.0; ECMA-424), the SPDX
Specification 3.0.1 (Community Specification License 1.0, with earlier portions under CC BY 3.0;
attribution: SPDX project, The Linux Foundation, spdx.dev), the OASIS CSAF 2.0 standard (Copyright
OASIS Open; this template comments on and assists implementation of it and reproduces no
specification text) and the OpenVEX specification (CC0 1.0). The text of this template is original.
Check the current official versions at cisa.gov, cyclonedx.org, spdx.dev and oasis-open.org before
relying on this policy, because SPDX 3.1 and CSAF 2.1 were in progress at the time of writing.
Template licence: MIT.