Skip to content
← Blog & Education · compliance 8 min read

Software supply chain security — SBOM, VEX, and provenance in one place

Ingest a CycloneDX or SPDX bill of materials, correlate its components against your findings, author machine-readable VEX, verify SLSA provenance, enforce composition policy, diff releases, and export a federal-ready procurement bundle — all from one page.

By The Talarity team · July 17, 2026

Since Executive Order 14028 and OMB Memorandum M-22-18, “do you have an SBOM?” has become a procurement gate, not a nice-to-have. A software bill of materials lists every component that ships inside a release — the direct dependencies you chose and the transitive ones you inherited. The NTIA’s minimum-elements guidance and CISA’s SBOM work set the baseline: component name, version, supplier, unique identifiers, and dependency relationships, in a machine-readable format (CycloneDX or SPDX).

Most teams can generate an SBOM — syft, cdxgen, and Trivy all do it in one command. The hard part is everything after: correlating those components against the vulnerabilities you already track, telling the world which CVEs actually affect you (and which don’t) in a format a machine can read, proving how the artifact was built, and handing a buyer a single bundle that answers all of it. Talarity treats the SBOM as the spine of that whole workflow.

What’s on the page

Everything below happens on one route — /app/appsec/sbom — organized into three tabs:

  • Documents — the SBOM inventory: ingest a bill of materials, browse its component inventory, correlate findings, author and publish VEX, verify provenance, and export a procurement bundle.
  • Products — group a series of releases so you can diff any two of them.
  • Composition policies — license/package rules that flag components you don’t want shipping.

The SBOM page: six summary cards (documents, components, known vulnerabilities, VEX statements, needs-VEX, provenance verified) above the ingested-document list.

Step 1 — Ingest a bill of materials

Click Upload SBOM and paste a CycloneDX 1.5 or SPDX 2.3 document. Talarity auto-detects the format, so you don’t pick a type. Optionally link the document to a repository — a real picker of the repos you already track, not a raw ID to hunt down — and give the release a name.

The Upload SBOM modal: a repository picker, an optional name, and a paste area for the CycloneDX or SPDX JSON.

Re-uploading the same document is safe — Talarity de-duplicates on the document’s SHA-256, so a nightly pipeline that pushes the same bytes won’t pile up duplicates. Ingest parses every component into a normalized inventory.

After ingest, the release appears as a document with its parsed component inventory.

Step 2 — Read the component inventory

Each component lands with its version, license, type, and — once you correlate — its known vulnerabilities. A container image SBOM can carry thousands of components, so the inventory has a filter: type a name, purl, or license and the list narrows server-side. Below, filtering on apache cuts a twelve-component release down to the four Apache-2.0 packages.

The component inventory filtered to the four Apache-2.0 components, each showing version, license, and type.

Step 3 — Correlate against your findings

Talarity does not run a second vulnerability scanner or call an external feed behind your back. Instead, Correlate findings matches the SBOM’s components against the SCA findings already in your AppSec findings register — the ones that arrived through your real SARIF and scanner imports. Every CVE it attaches is one you already track; a release with no matching findings honestly correlates zero.

After correlating, the Correlated CVEs column flags log4j-core with one matched finding while every other component shows a dash — a dash means nothing is correlated, not that the component is CVE-free.

Expand the affected component to see the CVE, its severity, and its CVSS score, with an inline editor for the next step.

Expanding log4j-core reveals CVE-2021-44228 (Log4Shell), critical severity, CVSS 10.0, and an inline VEX editor.

Step 4 — Author VEX (and say what doesn’t affect you)

A vulnerability appearing in your dependency graph is not the same as your product being exploitable. VEX — a Vulnerability Exploitability eXchange statement — is how you say so in a way a buyer’s tooling can consume. Talarity follows the OASIS CSAF 2.0 model: set a status (not affected, affected, fixed, under investigation), and when you claim not affected, a justification is required — one of the standard CSAF reasons, like “vulnerable code not in execute path.”

The inline VEX editor: status "Not affected", a required CSAF justification, and optional impact and action statements.

When you’ve authored your statements, Publish VEX (CSAF 2.0) assembles them into a real OASIS CSAF 2.0 VEX document and downloads it — the same builder Talarity uses for security advisories, recast to the csaf_vex profile. It refuses to publish an empty document.

After authoring, the release shows one VEX statement and the Publish VEX (CSAF 2.0) action.

Step 5 — Verify build provenance (SLSA)

Under Record provenance, paste a SLSA / in-toto attestation (DSSE-wrapped or a bare statement). Talarity verifies its structure and checks that the subject digest matches the artifact — a mismatch fails loudly. The result is recorded honestly: a bare, unsigned attestation shows a verification state of Unsigned, meaning the structure and subject digest were verified but cryptographic signature verification is not yet enabled. Nothing is ever labeled “Verified” that wasn’t.

The SLSA provenance table: builder (a GitHub Actions workflow), SLSA level, subject, and an honest "Unsigned" verification state.

Step 6 — Enforce composition policy

Beyond CVEs, you often care about what licenses you’re shipping. Composition policies flag components by license, package name, ecosystem, or purl. A block rule flags anything that matches; an allow rule builds an allowlist, so anything matching no allow rule is flagged.

The Composition policies tab: a "Block copyleft (GPL) licenses" rule — License contains "GPL-3.0", enabled.

The New composition policy modal: rule kind, match field, operator, value, and an enabled toggle.

Run the policies from a document’s Evaluate composition. Here the release is checked against one block policy and the GPL-licensed readline component is flagged. The same modal offers a Check known vulnerabilities (OSV.dev) button — a single live lookup against the public OSV.dev database, read-only.

Evaluate composition flags readline (GPL-3.0-or-later) as a block violation, with the live OSV.dev check available.

Step 7 — Diff two releases

Group releases into a Product, then Compare releases to see exactly what changed between any two — added, removed, and changed components, plus the known-CVE delta. This is where the security story of an upgrade becomes obvious: moving from 2.4.0 to 2.5.0 here resolves CVE-2021-44228 (the log4j upgrade) and drops the GPL-licensed readline.

The release comparison: +1 added / −2 removed / ~7 changed, with CVE-2021-44228 shown as a resolved CVE.

Step 8 — Hand the buyer one bundle

Finally, Export procurement bundle assembles the SBOM, the CSAF-VEX, and the SLSA provenance into a single JSON bundle — the artifact a federal buyer asks for under EO 14028 and OMB M-22-18. One download answers “what’s in it, what’s exploitable, and how was it built.”

The document detail — one known vulnerability, one VEX statement, recorded provenance — with the Export procurement bundle action.

What you walk away with

A supply-chain program that lives in one place instead of five: ingest → inventory → correlate → VEX → provenance → policy → diff → procurement bundle. Every claim on the page is one the product actually keeps — correlation only surfaces CVEs you already track, VEX is real CSAF 2.0, provenance states are honest, and the procurement bundle is a genuine assembly of the three. Generate the SBOM in your pipeline; do everything after it here.

Loading…

Keep reading

See Talarity in action.

A 30-minute walkthrough or a 7-day trial — your call.