Engineers with a laptop at automation test rigs in a bright production hall

SBOM

SLSA explained: supply-chain levels for software artifacts

Last updated:

SLSA (Supply-chain Levels for Software Artifacts, pronounced "salsa"), currently version 1.2 (approved 12 November 2025), is a framework for grading how trustworthy a software build and its source history are, published at slsa.dev as part of the Open Source Security Foundation (OpenSSF). Rather than a single pass/fail check, SLSA defines two separate tracks of increasing levels: a Build Track that grades the build process, and a Source Track that grades the source repository's history and controls. A level is only as credible as the signed provenance attestation behind it, which a consumer can independently verify.

Key takeaways

  • SLSA's homepage describes it as led by a "cross-organization, vendor-neutral steering group" under OpenSSF, with participants including Google, Microsoft, Intel, IBM, Red Hat and Datadog.
  • Per the v1.2 Build Track basics, provenance is documentation describing an artifact's construction: the entity that built it, the process used, and the top-level build inputs.
  • Approved as part of v1.2, the Source Track grades the source repository rather than the build.
  • SLSA recommends its own provenance format, carried as the predicate of an in-toto Statement (see our in-toto guide).

Who maintains SLSA, and what version is current?

SLSA's homepage describes it as led by a "cross-organization, vendor-neutral steering group" under OpenSSF, with participants including Google, Microsoft, Intel, IBM, Red Hat and Datadog. The specification text itself is published by The Linux Foundation under the Community Specification License 1.0. The framework has evolved in stages: version 1.0 narrowed the original multi-level scheme to a Build Track only (removing source-related requirements to focus the spec); version 1.1 was a clarity refresh; and version 1.2, approved 12 November 2025, is a structural release that adds a full Source Track, promoted from experimental to approved status. SLSA v1.2 is backward compatible with Build Track claims made under v1.0 and v1.1.

What does each Build Track level require?

Per the v1.2 Build Track basics, provenance is documentation describing an artifact's construction: the entity that built it, the process used, and the top-level build inputs.

Level Name What it requires
Build L0 No guarantees No requirements; represents the absence of SLSA, typical of local development or test builds
Build L1 Provenance exists The build platform automatically generates provenance recording who built the package, what process was used, and the top-level build inputs; the producer distributes that provenance
Build L2 Hosted build platform All L1 requirements, plus: builds run on a hosted platform that generates and signs the provenance itself, so forging it requires an explicit attack on that platform
Build L3 Hardened builds All L2 requirements, plus: the build platform implements strong controls so that concurrent build runs cannot influence one another, and the signing secret for provenance is inaccessible to user-defined build steps

The build requirements page splits the work between the producer (the organisation that releases the software) and the build platform:

Who Requirement L1 L2 L3
Producer Choose a build platform capable of the target level ✓ ✓ ✓
Producer Follow a consistent build process, so verifiers can form expectations ✓ ✓ ✓
Producer Distribute provenance to consumers ✓ ✓ ✓
Platform Provenance exists ✓ ✓ ✓
Platform Provenance is authentic (signed; generated by the control plane, not the tenant) ✓ ✓
Platform Provenance is unforgeable (signing secret inaccessible to user-defined build steps) ✓
Platform Hosted (not an individual's workstation) ✓ ✓
Platform Isolated (no influence between builds) ✓

"Isolated" is stricter than it sounds. The specification says a build must not be able to persist or influence the environment of a later build, so "an ephemeral build environment MUST be provisioned for each build," and one build must not poison a cache another build uses: "the output of the build MUST be identical whether or not the cache is used."

What does each Source Track level require?

Approved as part of v1.2, the Source Track grades the source repository rather than the build. Per the v1.2 source requirements:

Level Name What it requires
Source L1 Version controlled Source is stored in a modern version control system (Source Control System), in a repository with a stable, unique locator
Source L2 History & provenance Branch history is continuous, immutable and retained; force pushes that break ancestry are prevented; the Source Control System issues a Source Provenance Attestation for each new revision
Source L3 Continuous technical controls The Source Control System provides evidence that the organisation's technical controls on protected branches are continuously enforced, with the meaning of those controls documented and recorded in attestations
Source L4 Two-party review Changes to protected branches must be agreed to by two or more trusted persons before submission

What is inside a SLSA provenance document?

SLSA recommends its own provenance format, carried as the predicate of an in-toto Statement (see our in-toto guide). Its predicateType is always https://slsa.dev/provenance/v1, whatever minor version the URL bar shows.

Field Holds For a firmware image, typically
subject (Statement) Name and digest of each output artifact The .wic image, the update package, the SDK installer
buildDefinition.buildType URI of the template that says how to read the parameters The CI system's or your own documented build type
buildDefinition.externalParameters Inputs a user controlled, which verifiers must check Repository, branch or tag, MACHINE, image target
buildDefinition.internalParameters Platform-set values, for debugging Runner image version
buildDefinition.resolvedDependencies Artifacts fetched during the build, as URI plus digest Layer commits, source tarballs, toolchain
runDetails.builder.id Identity of the build platform that the verifier trusts The runner or workflow identity
runDetails.metadata invocationId, startedOn, finishedOn CI run ID and timestamps
runDetails.byproducts Other outputs worth recording The SBOM, build logs

At Build L2 some fields, such as resolvedDependencies, may still be produced by the tenant rather than the platform; the specification asks builders to document such cases.

Which supply-chain threats do the levels address?

SLSA's threat model labels threats A to I along the path from producer to consumer. The table summarises what the v1.2 text says about each.

Threat Example What SLSA says
A. Producer Producer ships malicious code on purpose "Cannot be directly mitigated through SLSA controls"
B, C. Source Unreviewed change, compromised repository Addressed by the Source Track
D. External build parameters Build from an unofficial fork or branch Verifier checks provenance against expectations
E. Build process Tampering during the build Build L3, assuming the build platform itself is trusted
F. Artifact publication Upload of an artifact that does not match the build Build L2 covers tampering after the build
G. Distribution channel Artifact swapped in the registry or in transit Mitigated when the consumer verifies
H. Package selection Dependency confusion Build L2+ plus verified expectations on install
I. Usage Insecure use of a correct package "Not addressed by SLSA"

The verification guidance is explicit that "SLSA Build L3 does not cover compromise of the build platform itself, such as by a malicious insider." Choosing which builders to trust stays a human decision.

How does a device maker apply SLSA to a Yocto or Buildroot build?

Most SLSA examples are containers and language packages. A firmware build differs: it is long, it fetches hundreds of source tarballs, and it relies on caches such as Yocto's shared state (sstate). A workable mapping:

  1. Run the release build on a hosted CI platform, not a workstationThat is the "Hosted" property of L2. Large Yocto builds often use self-hosted runners for speed; a runner your team operates can still be hosted infrastructure, but then you are the build platform and carry its requirements.
  2. Let the platform, not the build script, generate and sign provenanceGitHub's artifact attestations state that the feature "by itself provides SLSA v1.0 Build Level 2", and that a shared reusable workflow can provide the isolation needed for Build Level 3. Signing uses Sigstore.
  3. Make the runner ephemeral for L3A runner that keeps TMPDIR, downloads and sstate between jobs conflicts with the isolation rule. Use a fresh environment per release build and treat any shared sstate or download cache as an input that must not change the output.
  4. Lean on reproducibility to make caches safeThe Yocto Project's reproducible-builds page says builds have been reproducible down to the binary level since release 3.1, and that hash equivalence for sstate reuse works much better when output stays identical. It also warns that the guarantee covers BitBake and OE-Core only; every added layer has to be checked.
  5. Pin every fetchBitBake's fetcher checks SRC_URI checksums, and BB_NO_NETWORK makes network access fatal once a mirror is in place. Buildroot uses per-package .hash files, as its manual describes. Pinned inputs are what make resolvedDependencies meaningful.
  6. Name the shipped files as subjectsAttest the update package and image the device actually installs, by SHA-256, not an intermediate directory.
  7. Publish provenance with the releaseSLSA's distribution guidance names the file after the artifact, with in-toto recommending <filename>.intoto.jsonl.

Worked example: what does provenance for a gateway image look like?

Synthetic example: product, URLs and digests are invented; digests are shortened for readability. A Yocto build of gateway firmware 4.2.0, run by a reusable CI workflow, produces this Statement (unsigned view):

{
  "_type": "https://in-toto.io/Statement/v1",
  "subject": [
    { "name": "gw-4.2.0.swu", "digest": { "sha256": "5d2e…a91c" } }
  ],
  "predicateType": "https://slsa.dev/provenance/v1",
  "predicate": {
    "buildDefinition": {
      "buildType": "https://ci.example.com/buildtypes/yocto-image/v1",
      "externalParameters": {
        "repository": "https://git.example.com/gw/manifest",
        "ref": "refs/tags/v4.2.0",
        "machine": "gw-imx8",
        "target": "gw-image-prod"
      },
      "resolvedDependencies": [
        { "uri": "git+https://git.yoctoproject.org/poky", "digest": { "gitCommit": "8c1f…02be" } },
        { "uri": "https://mirror.example.com/busybox-1.36.1.tar.bz2", "digest": { "sha256": "b8cc…3f0d" } }
      ]
    },
    "runDetails": {
      "builder": { "id": "https://ci.example.com/workflows/yocto-release@v3" },
      "metadata": { "invocationId": "run-18422", "startedOn": "2026-11-03T08:12:00Z", "finishedOn": "2026-11-03T10:47:00Z" }
    }
  }
}

A verifier pins the builder.id, the repository and the tag pattern. Any other machine, target or repository fails the check; the parameters stay few because the image recipe and layer list live in the tagged manifest rather than in the provenance.

How does a consumer verify SLSA provenance?

SLSA's verification guidance lists these steps; they are the same whether your release gate or a customer runs them:

  1. Configure roots of trust once:which builder identities you accept, and up to which Build level you trust each.
  2. Verify the envelope's signatureagainst those roots of trust.
  3. Check that the Statement's subject digest matches the artifactyou hold, and that predicateType is https://slsa.dev/provenance/v1.
  4. Look up the Build levelfor the recognised builder, defaulting to L1.
  5. Compare against expectations:builder identity, canonical source repository, buildType and externalParameters. Unrecognised external parameters should fail verification.
  6. Optionally check dependencies recursively,such as a chip vendor's SDK with its own provenance.

On GitHub, gh attestation verify performs the signature and identity checks for attestations created there.

Why does SLSA matter for device and firmware makers?

SLSA's Build Track provenance answers a question a firmware SBOM cannot: not just what components are inside the image, but how the image itself was produced, and by whom. A firmware build pipeline that reaches Build L2 or L3 can prove, with a signed attestation, that a given binary came from a specific hardened, hosted pipeline rather than an engineer's laptop: useful evidence for a secure-development-lifecycle narrative alongside an SBOM; see our guide to firmware SBOM without source code and the comparison of Yocto and Buildroot SBOMs with image scanning. The Source Track is relevant further upstream: a chip vendor's SDK or an open-source dependency with Source L2+ history gives a downstream device maker more confidence that what they pulled is what the maintainer actually committed.

Provenance stops at the release. Whether the device only boots that signed image is a separate control; see secure boot and hardware root of trust.

No regulation known to us at the time of writing names a required SLSA level. Where SLSA is useful is as evidence of process maturity that can support, but does not substitute for, the specific duties in frameworks such as the Cyber Resilience Act's secure-development and vulnerability-handling requirements (see CRA Annex I explained) or a formal secure development lifecycle model such as NIST SSDF or IEC 62443-4-1. Confirm any specific regulatory mapping against current guidance before relying on it; this guide makes no such claim.

What are the common pitfalls?

  • Generating provenance nobody checks. GitHub's documentation puts it plainly: attestations "must be verified for the benefit to be realized."
  • Signing inside the build job. If the key is readable by build steps, the provenance is L1 at best, whatever the label says.
  • Claiming L3 on a persistent runner. Leftover build directories and writable shared caches break the isolation requirement.
  • Unpinned fetches. A floating branch in SRC_URI or a missing .hash file means resolvedDependencies records whatever happened to be downloaded.
  • Attesting the wrong file. Provenance for a build directory does not cover the signed update package a device installs.
  • Too many parameters. Recording every shell command in externalParameters makes expectations impossible to write; SLSA suggests keeping the build definition in a versioned repository instead.

What is a workable adoption order?

  1. Start with Build L1: turn on provenance generation in your existing CI, even if it is self-reported and easy to forge; it establishes the habit and the schema.
  2. Move the build to a hosted, SLSA-aware platformto reach Build L2, so provenance is generated and signed by something other than the build job itself.
  3. Harden the build platform(isolated runs, inaccessible signing secrets) to reach Build L3 for your highest-value release artifacts.
  4. Separately assess your source repositoriesagainst the Source Track: continuous, immutable history (L2) and enforced branch protection (L3) are usually closer at hand than full two-party review (L4) for a small team.
  5. Publish and verify provenance, not just generate it: a SLSA level only has value to a downstream consumer who can check the signed attestation, so treat distribution of the provenance artifact as part of the release.

SoftWSP does not generate or verify SLSA provenance. It covers the "what is inside" side: it extracts an SBOM from the shipped firmware binary as CycloneDX 1.6 JSON, matches components against NVD, CISA KEV, FIRST EPSS and CISA's ICS advisories, and drafts a cited report an engineer reviews. You can open any CycloneDX or SPDX SBOM in the free, browser-only SBOM viewer. See device firmware security.

This guide summarises the public SLSA v1.2 specification at slsa.dev, read 2026-11-10; it does not constitute legal or compliance advice.

Put this guide to work

Frequently asked questions

What does SLSA stand for?

Supply-chain Levels for Software Artifacts, pronounced "salsa". It is a security framework published at slsa.dev: a checklist of standards and controls meant to prevent tampering and improve the integrity of packages and build infrastructure.

Who maintains SLSA?

SLSA is run by a cross-organisation, vendor-neutral steering committee as part of the Open Source Security Foundation (OpenSSF), with the specification itself published under the Linux Foundation's Community Specification License 1.0. Participating organisations named on slsa.dev include Google, Microsoft, Intel, IBM, Red Hat and Datadog, among others.

What is the difference between the Build Track and the Source Track?

The Build Track (levels 0-3) grades how trustworthy the build process is: whether provenance exists, whether it is generated by a hosted platform, and whether that platform is hardened against tampering. The Source Track (levels 1-4), approved as part of SLSA v1.2 in November 2025, grades how trustworthy the source code's history and change-control process is, from basic version control up to mandatory two-party review.

Does reaching a SLSA level satisfy the EU Cyber Resilience Act or a firmware SBOM duty?

No regulation currently names SLSA as a required or sufficient control, to our knowledge as of this guide's publication; this should be confirmed against current CRA guidance before being relied on. SLSA provenance is evidence about how an artifact was built, which can support a secure development lifecycle narrative and complements, rather than replaces, a firmware SBOM. Treat any mapping between a SLSA level and a specific regulatory clause as informational, not a compliance claim, until a regulator states otherwise.

Is SLSA a certification I can be audited against?

SLSA levels are self-assessed or verified by whoever consumes the artifact, based on provenance attestations; slsa.dev does not describe an official third-party certification body for SLSA levels. A build platform or producer claims a level, and a consumer can validate the authenticity of the provenance that backs the claim.

Sources

  1. SLSA: Build Track requirements, v1.2 specification
  2. SLSA: Build Track Basics, v1.2 specification
  3. SLSA: Source Track requirements, v1.2 specification
  4. SLSA: What's new in v1.2
  5. SLSA homepage (slsa.dev)
  6. OpenSSF: SLSA project page
  7. SLSA: Build provenance format, v1.2 specification
  8. SLSA: Verifying artifacts, v1.2 specification
  9. SLSA: Distributing provenance, v1.2 specification
  10. SLSA: Threats and mitigations, v1.2 specification
  11. GitHub Docs: Artifact attestations (SLSA Build Level 2 and 3)
  12. Yocto Project Test Environment Manual: Reproducible Builds
  13. BitBake User Manual: File download support
  14. Buildroot user manual
Was this guide helpful?

In this cluster

SLSA explained: supply-chain levels for software artifacts