GitHub Artifact Attestations, Explained From The Ground Up

GitHub Artifact Attestations, Explained From The Ground Up

How GitHub creates an unforgeable, verifiable link between a piece of built software and the exact source code and process that produced it — without anyone having to manage a signing key.

Imagine buying a sealed medicine bottle at a pharmacy. You trust it is genuine not because you watched it get manufactured, but because a tamper-evident seal proves nobody opened it after the factory closed it, and a printed batch number lets you trace it back to exactly which production run made it. Software has the same trust gap: when you download a binary, a container image, or a package, you have no way of knowing whether it truly came from the source code you think it did, or whether someone slipped something else in along the way. Artifact attestations are GitHub’s version of that tamper-evident seal and batch number for software — a cryptographically signed statement that says, in effect, “this exact file was built, by this exact workflow, from this exact commit.”

1What Is an Artifact Attestation?

Before diving into certificates and transparency logs, it helps to pin down exactly what is being created and why GitHub built this as a first-class feature.

Provenance, in plain terms

An artifact attestation is a small, signed document that records the provenance of a build artifact — a binary, a container image, a package, or any file produced by a build process. “Provenance” simply means origin: which repository, which commit, which workflow, and which build steps produced this exact file. The attestation binds all of that metadata to a cryptographic hash (a digest) of the artifact itself, so that if even a single byte of the artifact changes, the attestation no longer matches it.

Simple Analogy

Think of it like a notarized birth certificate for a file. The certificate does not make the baby healthy or good — it simply proves, beyond reasonable doubt, exactly when and where that baby was born and who the recorded parents are. An artifact attestation proves exactly when, where, and from what source code a file was built — nothing more, nothing less.

What it is not

This distinction matters enough that GitHub states it explicitly in its own documentation: an attestation is not a guarantee that the artifact is safe, bug-free, or free of vulnerabilities. It says nothing about code quality. What it does is remove any ambiguity about where the artifact came from, which is the foundation every other security check — vulnerability scanning, license review, code audit — depends on. You cannot meaningfully trust the results of a security scan on a binary if you are not first certain the binary is the one your source code actually produced.

i
Good to know

Generating an attestation and never checking it provides zero security benefit on its own. The value only appears at the moment someone — a consumer, a deployment pipeline, an admission controller — actually verifies it before trusting the artifact.

2Why Artifact Attestations Matter

This feature exists because of a specific, well-documented category of real-world attack: the software supply chain compromise.

The supply chain problem

Modern software is assembled, not written from scratch. A typical application pulls in dozens or hundreds of open-source dependencies, each built somewhere else, by someone else, on infrastructure the final consumer never sees. If an attacker compromises any single link in that chain — a build server, a maintainer’s account, a package registry — they can slip malicious code into an artifact that looks, on the surface, completely legitimate. Several major real-world incidents in the last decade followed exactly this pattern: the compromise happened not in the source code repository itself, but somewhere in the gap between source code and the final published artifact.

Closing the gap between source and binary

Artifact attestations close precisely that gap. Instead of asking consumers to trust a download link, a registry, or a build server’s reputation, attestations let them cryptographically verify that the artifact in front of them matches a specific, publicly inspectable build process, tied to a specific commit in a specific repository.

2024
the year Artifact Attestations reached general availability on GitHub
10 min
typical validity window of the short-lived signing certificate
0
long-term signing keys an organization has to create or rotate

Regulated and security-conscious consumers

An organization deploying open-source software into a regulated environment can require that every artifact carry a verifiable attestation before it is allowed to run, turning “we trust this vendor” into “we cryptographically verified this exact build.”

Open-source maintainers

A maintainer publishing binaries or container images can let downstream users prove, without asking the maintainer anything, that the download in front of them was really built by the project’s own GitHub Actions workflow and not tampered with afterward.

3Architecture and Components

GitHub does not implement signing and verification from scratch. It builds on top of Sigstore, an open-source project purpose-built for exactly this problem, and adds three moving parts of its own on top.

Identity

GitHub Actions OIDC token

Every workflow run can mint a short-lived identity token proving which repository, commit, and workflow is currently executing — no secret required to obtain it.

Certificate authority

Fulcio

Sigstore’s certificate authority. It exchanges the OIDC identity token for a short-lived signing certificate, binding a freshly generated key pair to that workflow’s identity.

Transparency log

Rekor

An append-only, publicly auditable ledger that permanently records the fact that a signing event happened, so nobody — not even GitHub — can quietly issue a signature after the fact without leaving a public trace.

Format

In-toto / SLSA statement

The structured document that actually carries the provenance details — builder identity, source repository, invocation parameters — wrapped in a signed envelope alongside the artifact’s digest.

flowchart LR
    A[Workflow builds artifact] --> B[Compute SHA-256 digest]
    B --> C[Request OIDC identity token]
    C --> D[Fulcio issues short-lived certificate]
    D --> E[Sign in-toto/SLSA statement]
    E --> F[Bundle: statement + certificate + signature]
    F --> G[Record event in Rekor transparency log]
    F --> H[Store attestation with GitHub]
        
FIG 1 — The pieces involved in producing one signed attestation

Why “keyless” is the headline feature

Traditional code signing requires an organization to generate a private key, store it somewhere safe, restrict who can use it, and rotate it periodically — all famously difficult to do correctly at scale. Sigstore’s keyless signing model removes that entire burden: a brand-new key pair is generated fresh for every single signing event, used once, and then discarded within minutes. There is no long-lived secret to leak, steal, or forget to rotate.

4How It Works Internally

Following one artifact through the full signing sequence makes the earlier architecture concrete.

1

The workflow requests an identity token

Once the artifact is built, the workflow asks GitHub’s own OIDC provider for a token describing exactly who is asking: this repository, this commit SHA, this workflow file, this trigger event.

2

A fresh key pair is generated in memory

A brand-new public/private key pair is created inside the runner, existing only for the duration of this single signing operation.

3

Fulcio issues a short-lived certificate

The OIDC token and the new public key are sent to Fulcio, which validates the token’s authenticity and issues an X.509 certificate binding that public key to the workflow’s verified identity — typically valid for around ten minutes.

4

The provenance statement is built and signed

The tooling computes the artifact’s digest, assembles an in-toto statement containing the SLSA provenance predicate, and signs the whole statement with the freshly generated private key.

5

The event is recorded in Rekor

A record of the signature — including the certificate and enough metadata to verify it later — is written to Rekor’s public, append-only transparency log, so the signing event is permanently, independently auditable.

6

The signing key is discarded

The private key is never written to disk and is discarded the moment the runner finishes, closing the window during which it could ever be stolen or reused.

sequenceDiagram
    participant WF as Workflow / Runner
    participant OIDC as GitHub OIDC Provider
    participant Fulcio as Sigstore Fulcio
    participant Rekor as Sigstore Rekor Log
    participant GH as GitHub Attestation Store
    WF->>OIDC: Request identity token
    OIDC-->>WF: Short-lived OIDC token
    WF->>WF: Generate ephemeral key pair
    WF->>Fulcio: Public key + OIDC token
    Fulcio-->>WF: Short-lived signing certificate
    WF->>WF: Sign in-toto/SLSA statement
    WF->>Rekor: Record signature event
    WF->>GH: Store attestation bundle
        
FIG 2 — The full keyless signing sequence for a single build
i
Trust anchor

Anyone verifying the attestation later trusts Fulcio’s root certificate and GitHub’s OIDC issuer, not any secret the repository owner personally holds. Trust is rooted in infrastructure, not in a password someone could lose or leak.

5Public Repositories vs Private Repositories

Not every repository gets exactly the same Sigstore setup, and the difference matters for anyone deciding how much external transparency they are comfortable with.

AspectPublic repositoriesPrivate repositories
Sigstore instance usedSigstore Public Good InstanceGitHub’s own dedicated Sigstore instance
Transparency logPublicly readable on the internetNot written to a public transparency log
Federation scopeBroadly federated across the open Sigstore ecosystemFederates only with GitHub Actions
Attestation bundle storageStored with GitHubStored with GitHub

This split exists for an obvious reason: a public transparency log is a feature for open-source projects, where anyone in the world benefiting from public verifiability is exactly the point. For a private repository, permanently publishing a public record that a build even happened would leak information the organization never intended to disclose. GitHub’s own Sigstore instance uses the identical underlying codebase, so the cryptographic guarantees are the same — it simply keeps the transparency record private to GitHub rather than broadcasting it to the internet.

!
Common misconception

Attestations on private repositories are not “less secure” than public ones — they use the same signing and verification cryptography. The only difference is whether the transparency record is public or GitHub-internal.

6The Attestation Lifecycle: Generate, Store, Verify

Stepping back from the cryptographic detail, the entire feature can be understood as three distinct phases.

Phase 1

Generate

A workflow builds an artifact and, as an explicit step, attests to its provenance using GitHub’s official attestation action, which handles the entire Sigstore signing sequence automatically.

Phase 2

Store

The resulting attestation bundle is stored alongside the repository and is viewable from the repository’s Actions history, so anyone can later retrieve it for the artifact in question.

Phase 3

Verify

A consumer — a human, a deployment pipeline, or an admission controller — checks the attestation against the artifact before trusting it, confirming the digest matches and the signer identity meets an expected policy.

Every one of these three phases has to happen for the feature to provide any real protection. Generating an attestation that nobody ever checks is equivalent to installing a lock and leaving the key in it — the mechanism exists, but nothing enforces its use.

7What Actually Gets Signed

GitHub supports more than one kind of attestation, and choosing the right one — and the right frequency — is a deliberate design decision, not an afterthought.

Good candidates to sign

  • Released software you expect people to verify before running
  • Binaries people will download and execute directly
  • Packages published to a registry for wider consumption
  • Container images pushed to a registry
  • Manifests or SBOMs that summarize a larger set of contents

Poor candidates to sign

  • Frequent internal builds used only for automated testing
  • Individual source files or documentation pages
  • Embedded images or other loose static assets
  • Anything nobody downstream will ever actually verify

Two common predicate types

The most common attestation is a build provenance attestation, which records where and how an artifact was built — the repository, the workflow, the trigger event, and the commit. A second common type is an SBOM attestation (Software Bill of Materials), which instead records exactly which dependencies and components went into the artifact, letting a consumer check for known-vulnerable components without needing to unpack the artifact themselves.

Linked artifacts page

When an attestation is generated and pushed to a registry with the right permissions configured, GitHub can automatically create a storage record on the organization’s linked artifacts page, giving security teams a build history, deployment record, and ownership trail for every attested artifact in one place.

8Verifying an Attestation

Verification is where the entire feature earns its keep — this is the step that actually protects a consumer from a tampered artifact.

What a verification check actually confirms

When a consumer verifies an attestation, three things are checked at once: that the artifact’s own digest matches the one recorded in the attestation, that the signing certificate chains back to a trusted root (Fulcio’s), and that the signer’s recorded identity — which repository and workflow produced it — matches whatever policy the consumer has decided to trust.

i
Policy, not just presence

A passing verification only proves the signature is genuine and matches the artifact. It does not by itself prove the signer was who you meant to trust — pinning the expected repository, owner, or workflow identity during verification is what turns a valid signature into a meaningful security guarantee.

Where verification fits

Verification can happen in several places depending on how much automation an organization wants: manually by a developer using GitHub’s own command-line tooling before running a downloaded binary, automatically inside a deployment pipeline as a gate before promoting an artifact to production, or inside a Kubernetes admission controller that refuses to schedule any container image whose attestation does not pass.

“Signed does not mean safe — it means traceable. A failed verification should always be treated as a supply-chain integrity break, never as a warning to shrug off.”

9SLSA Build Levels

Artifact attestations do not exist in isolation — they are GitHub’s practical implementation of a broader industry framework called SLSA (Supply-chain Levels for Software Artifacts).

SLSA defines a maturity ladder for how trustworthy a build process is, from Level 1 (basic documentation of the build) up through higher levels that require increasingly strong guarantees that the build process itself cannot be tampered with. GitHub-hosted runners combined with the attestation action let a project reach a meaningfully strong level out of the box, because the provenance is generated by GitHub’s own trusted infrastructure rather than by a script the project author controls — removing the possibility that the same person who could tamper with the artifact is also the one vouching for its provenance.

Reaching a higher level with reusable workflows

Projects that want an even stronger guarantee can combine attestations with reusable, centrally maintained workflows, so that the build logic itself — not just the identity token — is defined somewhere the individual repository cannot silently modify, closing more of the gap toward the framework’s higher build levels.

!
Nuance worth remembering

A higher SLSA level describes stronger guarantees about the build process, not about the code’s correctness or security posture. The two are complementary, not substitutes for each other.

10Security Considerations

A feature whose entire purpose is trust has to be scrutinized for its own weak points, and GitHub’s design choices reflect several deliberate mitigations.

No long-lived secret to steal

Because every signing key is generated fresh and discarded within minutes, there is no persistent private key sitting in a secrets store waiting to be exfiltrated — a category of risk that has caused real incidents with traditional, long-lived code-signing keys in the past.

Identity is tied to workflow, not to a person

The signing identity embedded in the certificate reflects the exact workflow, repository, and trigger that ran — not a maintainer’s personal account. This means access to sign a release is governed entirely by who can modify the workflow file and trigger it, which is exactly the access an organization already controls through repository and branch protection settings.

Public auditability as a deterrent

For public repositories, every signing event lands in a publicly readable transparency log. Anyone — including the maintainers themselves — can later notice a signing event that should not have happened, because the log is append-only and cannot be quietly edited after the fact.

i
Shared responsibility

GitHub secures the signing infrastructure and the transparency log. The organization is still responsible for securing the workflow file itself — a workflow that can be modified by an untrusted contributor is a weak link no amount of Sigstore cryptography can fix on its own.

11Advantages and Trade-offs

Weighing both sides honestly helps a team decide how broadly to adopt attestations and how much verification tooling to build around them.

Advantages

  • No signing keys to generate, store, or rotate
  • Public transparency log gives independent, tamper-evident auditability
  • Tight integration with GitHub Actions — no separate signing infrastructure to run
  • Supports both build provenance and SBOM attestation types
  • Directly supports meeting recognized SLSA build-level guarantees

Disadvantages / Trade-offs

  • Provides zero benefit unless consumers actually verify attestations
  • Adds workflow permissions and an extra step to every signing build
  • A misconfigured or overly permissive workflow can still undermine the identity guarantee
  • Private-repository attestations are not publicly transparent, so external parties must trust GitHub’s own instance
  • Does not, by itself, say anything about code quality or vulnerabilities

12Design Patterns, Anti-patterns, and Best Practices

Most of the value — and most of the mistakes — come down to a handful of repeatable choices.

ANTI-PATTERN-01 Avoid
Problem

A team enables attestation generation on every build, including throwaway test builds, and never actually checks any attestation before deploying anything.

Why It’s Harmful

This produces noise without protection — the transparency log fills with irrelevant events, and the false sense of security (“we sign our builds”) hides the fact that nothing downstream is enforcing the check that would catch tampering.

Correct Approach

Sign only artifacts people will actually consume and verify, and make verification a mandatory, automated gate before deployment — not an optional manual step someone might skip under deadline pressure.

Pin the expected identity, not just “any valid signature”

Verification policies should check that the signer’s repository and workflow match exactly what is expected, rather than accepting any attestation that happens to pass cryptographic validation — otherwise a compromised but unrelated repository’s valid signature could pass an overly loose check.

Grant the workflow only the permissions it needs

The permissions required to request an OIDC identity token and write an attestation should be scoped narrowly to the specific job that performs the signing step, not granted broadly across an entire workflow file.

Treat a failed verification as a hard stop

A pipeline or admission controller that logs a warning on a failed verification but continues anyway has effectively turned the entire control into decoration.

Combine attestations with reusable, centrally owned workflows

Where the build logic itself is defined in a shared workflow the individual repository cannot silently rewrite, the identity guarantee becomes meaningfully stronger than trusting whatever workflow file happens to live in each repository.

13Real-World and Industry Examples

Seeing where this feature has already been adopted makes the abstract cryptography from earlier chapters concrete.

Homebrew

The popular macOS and Linux package manager worked closely with security researchers to become one of the earliest large-scale public adopters of artifact attestations, using them to strengthen trust in the packages it distributes to millions of developers.

Elastic

Elastic’s engineering team has publicly described completing a supply-chain security project in about a week using artifact attestations that had originally been scoped to take months, largely because the keyless signing model removed the need to design and operate their own key-management system.

Kubernetes admission controllers

Organizations running Kubernetes can deploy an admission controller that checks a container image’s attestation before allowing it to be scheduled, turning “only run software we can prove came from our own build pipeline” into an automatically enforced cluster-wide policy rather than a manual review step.

Software marketplaces and plugin ecosystems

Some plugin and extension marketplaces sign both individual scan results and their overall catalog listing with the same keyless approach, so a consumer can verify not just that one plugin is genuine, but that the catalog they browsed to find it has not been tampered with either.

14Frequently Asked Questions

Q1Do I need to manage a signing key to use artifact attestations?

No. The entire point of Sigstore’s keyless signing model is that a fresh key pair is generated automatically for every signing event and discarded within minutes — there is nothing for you to create, store, or rotate.

Q2Does an attestation mean the artifact is safe to use?

No. An attestation only proves where and how an artifact was built. It says nothing about whether the code is secure, correct, or free of vulnerabilities — those remain separate checks.

Q3Is there a difference between public and private repositories?

Yes. Public repositories use the Sigstore Public Good Instance and write to a publicly readable transparency log. Private repositories use GitHub’s own Sigstore instance, which is not written to a public log and only federates with GitHub Actions.

Q4Should I attest every build my workflows produce?

No. GitHub’s own guidance is to sign software you expect people to verify — releases, binaries, packages, and container images — and to avoid attesting frequent internal test builds or individual source files.

Q5How does someone actually check an attestation before trusting an artifact?

A consumer uses verification tooling to confirm the artifact’s digest matches the attestation, the signing certificate chains back to a trusted root, and the recorded signer identity matches an expected policy — this can be done manually, in a deployment pipeline, or inside an admission controller.

Q6What happens if verification fails?

A failed verification should be treated as a supply-chain integrity break and the artifact should not be used or deployed, since it means the file no longer matches what was actually signed.

15Summary and Key Takeaways

Artifact attestations give GitHub Actions a built-in way to cryptographically bind a built artifact to the exact source code and workflow that produced it, using Sigstore’s keyless signing model so no organization ever has to manage a private signing key. A short-lived OIDC identity token, a Fulcio-issued certificate, and a Rekor transparency-log entry together form an unforgeable, auditable chain from commit to artifact. The feature’s real value only appears once consumers actually verify attestations — as a manual check, a deployment gate, or a cluster-wide admission policy — and pin the identity they expect to see, turning a cryptographically valid signature into a meaningful trust decision rather than a checkbox nobody enforces.

Key Takeaways

  • An attestation proves origin, not safety — it links an artifact to its source code and build process, and says nothing about code quality.
  • Signing is keyless — a fresh key pair is generated per build and discarded within minutes, removing long-lived secrets from the picture entirely.
  • Fulcio and Rekor are the trust backbone — Fulcio issues the short-lived certificate; Rekor permanently, publicly records that the signing event happened.
  • Public and private repositories use different Sigstore instances — same cryptography, different transparency scope.
  • Generating an attestation is only half the job — the security benefit only exists once something actually verifies it before trusting the artifact.
  • Sign selectively — releases, binaries, packages, and container images are good candidates; routine test builds and loose source files are not.
  • Attestations underpin recognized SLSA build-level guarantees, giving organizations a standardized way to describe how trustworthy their build process is.