Skip to main content

Blog / AppSec basics

What is an SBOM? A practical guide to software bills of materials

An SBOM is the ingredient list for your software. Customers, auditors and regulators increasingly ask for one. Here is what goes in it, which format to pick, how to generate one that is actually complete, and what an SBOM does and does not tell you.

Key takeaways

  • A software bill of materials (SBOM) is a machine-readable inventory of the components in a piece of software: every package and version, direct and transitive, with identifiers, licenses and relationships.
  • Customers, procurement teams and regulators now ask for SBOMs, so they answer one question fast: are we affected by this newly published vulnerability?
  • Two formats dominate: SPDX and CycloneDX. Both are fine; pick the one your consumers ask for and generate it automatically.
  • An SBOM is only as good as its inputs. Generate it from lockfiles or the built artifact, per release, and keep it with that release.
  • An SBOM is an inventory, not a vulnerability report. Pair it with vulnerability matching and VEX statements to say what actually affects you.

What is an SBOM?

A software bill of materials (SBOM) is a formal, machine-readable list of the components that make up a piece of software. Think of it as the ingredient list on food packaging: it does not tell you whether the product is safe, but without it you cannot answer questions about what is inside.

For a typical application, the SBOM lists every open-source and third-party package it ships, the exact version of each, a unique identifier such as a package URL (purl), the license, who supplied it, and how components depend on one another. Because most of a modern application's code comes from dependencies, and most of those dependencies are transitive (pulled in by other packages rather than chosen by you), the SBOM is usually the first place you see how much third-party code you actually ship.

Why SBOMs matter now

SBOMs moved from good practice to a common requirement after a run of supply-chain incidents, Log4Shell in particular, showed how long it took organisations to answer "do we use this?"

  • Incident response. When a critical vulnerability is published, an up-to-date SBOM per release turns a week of searching into a query.
  • Customer and procurement requests. Enterprise buyers increasingly ask suppliers for SBOMs during security review, alongside questionnaires.
  • Government requirements. US Executive Order 14028 (2021) set SBOM expectations for software sold to the federal government, and the NTIA published the minimum elements an SBOM should contain. The EU Cyber Resilience Act requires manufacturers of products with digital elements to keep an SBOM as part of their technical documentation, with the main obligations applying from December 2027.
  • License compliance. The same inventory shows which licenses you ship, before a copyleft package reaches a product that cannot accept it.

What goes into an SBOM

The NTIA's minimum elements are a good baseline. Every component entry should carry:

NTIA minimum data fields for each component
FieldExample
Supplier nameThe organisation or project that publishes the package
Component namelog4j-core
Version2.17.2
Other unique identifiersA package URL such as pkg:maven/org.apache.logging.log4j/log4j-core@2.17.2
Dependency relationshipWhich component includes which
Author of SBOM dataWho or what generated the SBOM
TimestampWhen the SBOM was generated

Useful SBOMs go further: licenses for each component, hashes so a consumer can verify they have the same artifact, whether each dependency is direct or transitive, and references to known vulnerabilities at the time of generation.

SPDX vs CycloneDX

Two formats cover almost every SBOM in use. Both are open, both describe components and relationships, and good tooling reads and writes both.

The two main SBOM formats
SPDXCycloneDX
OriginLinux Foundation; published as international standard ISO/IEC 5962:2021OWASP
StrengthsLicense detail and provenance; widely used in compliance and government contextsSecurity use cases: vulnerabilities, VEX, services, and extensions for ML models and data
Common encodingsJSON, tag-value, othersJSON, XML
When to choose itA customer or regulator asks for SPDX, or license compliance is the main goalSecurity tooling and vulnerability workflows are the main consumers
One component in a CycloneDX SBOM
{
  "bomFormat": "CycloneDX",
  "specVersion": "1.6",
  "metadata": { "timestamp": "2026-11-03T09:00:00Z" },
  "components": [
    {
      "type": "library",
      "bom-ref": "pkg:maven/org.apache.logging.log4j/log4j-core@2.17.2",
      "name": "log4j-core",
      "version": "2.17.2",
      "purl": "pkg:maven/org.apache.logging.log4j/log4j-core@2.17.2",
      "licenses": [{ "license": { "id": "Apache-2.0" } }]
    }
  ]
}

If you also ship AI features, the same idea extends to models, prompts, agents and MCP servers. That is an AI bill of materials; see What is an AI-BOM?.

How to generate a useful SBOM

Generating some SBOM is easy. Generating one you can rely on takes a few rules:

  1. Generate from lockfiles or the built artifact, not from loose manifests. A package.json with version ranges says what could be installed; package-lock.json says what was installed. Without a lockfile, transitive versions are guesses.
  2. Generate per release, automatically, in CI, and store the SBOM with the release artifact. An SBOM that someone produced by hand last quarter describes software you no longer ship.
  3. Cover every layer you ship. Application dependencies and the operating-system packages in your container base image are both components.
  4. Use real identifiers. Package URLs and hashes let consumers match components to advisories without guessing.
  5. Do not invent data. Missing supplier or license information should be marked as unknown, not filled in with a plausible guess.

An SBOM is not a vulnerability report

The most common misunderstanding: sending an SBOM does not tell anyone which vulnerabilities matter. It tells them what you ship. Turning that into decisions takes two more steps:

  • Vulnerability matching. Software composition analysis (SCA) matches each component version against advisory data, and should be re-run as new advisories appear even when the SBOM has not changed. Prioritise matches by exploit signal (the CISA Known Exploited Vulnerabilities catalog, then EPSS exploit probability, then reachability) rather than severity alone.
  • VEX (Vulnerability Exploitability eXchange). A VEX statement records your assessment of a vulnerability in a product: affected, not affected (with a justification such as "the vulnerable code is not present"), fixed, or under investigation. It stops customers chasing a CVE in a component you do not actually use in a vulnerable way.

For the difference between scanning dependencies and scanning your own code, see SAST vs SCA.

SBOM checklist

What a dependable SBOM process looks like
CheckWhy
Generated automatically in CI for every releaseHand-made SBOMs go stale immediately
Built from lockfiles or the final artifactCaptures the versions you actually ship, including transitive ones
Includes container OS packages when you ship containersBase images are part of the product
Every component has a purl, version and license (or an explicit unknown)Consumers can match and audit it
Stored and versioned with the releaseYou can answer "were we affected in March?"
Re-checked against new advisories on a scheduleNew CVEs appear for old versions
VEX statements published for assessed vulnerabilitiesSaves customers and your team from chasing non-issues

Generating SBOMs with CodeStax

CodeStax's SCA builds the dependency inventory from supported manifests and lockfiles on every scan (npm, pip, Maven, Gradle, Go modules, Cargo, Composer, RubyGems and NuGet), then lets you export it as an SBOM. Each component carries its name, version and package URL, SPDX license identifiers, CVE references and whether it is a direct or transitive dependency. CycloneDX export is included on the Free plan; SPDX export is available on Growth and above. Vulnerabilities are prioritised by KEV and EPSS alongside CVSS, and VEX workflows record your assessments.

Common questions

What does SBOM stand for?

SBOM stands for software bill of materials: a machine-readable inventory of the components in a piece of software, including versions, identifiers, licenses and dependency relationships.

Is an SBOM required by law?

It depends on who you sell to. US federal software suppliers face SBOM expectations following Executive Order 14028, and the EU Cyber Resilience Act requires manufacturers of products with digital elements to maintain an SBOM, with main obligations applying from December 2027. Many enterprise customers also require one contractually.

SPDX or CycloneDX: which should I use?

Use whichever your customers or regulators ask for; good tools produce both. SPDX is an ISO standard with strong license and provenance detail. CycloneDX, from OWASP, is popular in security tooling and supports VEX and AI/ML components.

Does an SBOM show vulnerabilities?

Not on its own. An SBOM lists components. Software composition analysis matches them against vulnerability advisories, and VEX statements record whether each vulnerability actually affects your product.

What is the difference between an SBOM and an AI-BOM?

An SBOM lists software packages. An AI-BOM lists AI components such as model providers, models, prompts, agents and MCP servers, and their relationships. Teams shipping AI features increasingly keep both.

Your next step

Export an SBOM for one of your repositories.

Connect a repository on the Free plan, run a scan, and export a CycloneDX SBOM built from your lockfiles.

Get started free