Skip to content

ci(release): attest the ramdisk SBOMs of release files and OCI artifacts - #905

Draft
MaxRink wants to merge 1 commit into
build/ramdisk-sbomfrom
ci/release-sbom-attestations
Draft

MaxRink wants to merge 1 commit into
build/ramdisk-sbomfrom
ci/release-sbom-attestations

Conversation

@MaxRink

@MaxRink MaxRink commented Nov 9, 2026

Copy link
Copy Markdown
Collaborator

What

Third of three supply-chain PRs, stacked on #903 (ramdisk SBOMs), which is stacked on #902 (reproducible initramfs). Retarget each one once the PR below it merges.

Signatures and build provenance on all release files and the multi-arch images exist already (#890, cosign sign-blob). This PR binds each ramdisk SBOM to the ramdisk it describes:

  • New sbom-attest matrix job. It runs one job per released ramdisk archive: default, gobgp, slim, micro, split-base and split-frr, for amd64 and arm64. Each job:

    • re-checks the .sha256 of the archive and both SBOMs;
    • creates a CycloneDX and an SPDX attestation with actions/attest v4.2.2, pinned by SHA 1e69f48a…, with the archive as the subject. actions/attest-sbom is deprecated in favour of actions/attest.

    The action takes one SBOM per call, so the work is split into one job per archive. The release job waits for these jobs, so a release can't be published without the attestations.

  • OCI initramfs artifacts (ghcr.io/<repo>/initramfs:<ver>-<flavor>-<arch>): the publish loop re-checks the SBOM checksum and adds a keyless cosign attest --type cyclonedx. A mirror of the OCI artifact then keeps its SBOM. This follows the nightly image, which already uses cosign attest.

  • The README shows how to verify both: gh attestation verify --predicate-type https://cyclonedx.org/bom (or https://spdx.dev/Document/v2.3) and cosign verify-attestation --type cyclonedx. The proposal status is updated.

Guard / impact

This changes only the release workflow, so it runs only on v* tags. Release files and OCI refs are unchanged; attestations are added on top.

Verification

  • A workflow test covers the job, matrix, pinning, inputs, the release dependency and the OCI attestation. go test . and golangci-lint v2.14.0 pass (0 issues), and actionlint is clean for release-v2.yml.
  • Still needed: a real tag run (an rc tag or a fork dry run). OIDC signing can't be exercised from a PR.
  • Risk to watch on that run: the cosign attestation predicates are about 300 KB of CycloneDX each. The public Rekor instance may log the attestation body only by hash, but it should accept it. If it rejects the entry, I'll switch the OCI attestation to a referrer that oras attach adds, signed by digest.

Follow-ups (not here)

  • Build provenance on the per-arch and ORAS refs, which today are cosign-signed only.
  • A KMS-signed bundle for offline sites (proposal "Signing").
  • Pinning snapshot.debian.org so rebuilds stay reproducible after the mirrors move.
  • Pointing the release Trivy scan job at the CycloneDX SBOMs, so it sees the Debian packages.

🤖 Generated with Claude Code

The ramdisk SBOMs are signed release files, but nothing binds an SBOM to
the digest of the ramdisk it describes. A consumer that mirrors only the
OCI initramfs artifact gets no SBOM at all.

A new sbom-attest matrix job (one job per released ramdisk archive, split
parts included) runs after build. It re-checks the checksums and creates a
CycloneDX and an SPDX attestation with actions/attest v4.2.2 (pinned by
SHA; attest-sbom is deprecated in favour of it), with the archive as the
subject. The release waits for it. The OCI initramfs publish loop now adds
a keyless cosign CycloneDX attestation to each artifact. The README shows
how to verify both.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@github-actions

github-actions Bot commented Nov 9, 2026

Copy link
Copy Markdown

Security scan report

Commit: 941dd5e95f0f48f289b78a7e749170729343c5c7

Security findings are advisory, not merge blockers. Build, test and licensing checks remain blocking.

A successful job is not proof of a clean scan; findings and scanner errors are called out below.

Check Result Details
Go Vulnerability Check success Logs
Detect Initramfs Flavor Changes success Logs
Security report tests success Logs
Lint success Logs
Test success Logs
Build (amd64) success Logs
Linux E2E (Privileged) success Logs
Build (arm64) success Logs
Build Flavors (arm64 gobgp, path-filtered) success Logs
E2E Tests success Logs
Build Flavors (arm64 micro, path-filtered) success Logs
BFD FRR interop (lab) success Logs
Build Flavours (amd64 slim + micro + gobgp) success Logs
BFD FRR interop (10.2.1) success Logs
Reproducible Initramfs (amd64, path-filtered) success Logs
Cable Check ISO (BIOS, UEFI, Secure Boot) success Logs
Build Flavors (arm64 slim, path-filtered) success Logs
Build Flavors (arm64 default, path-filtered) success Logs
E2E Boot (ContainerLab) success Logs
KVM Boot Validation success Logs
E2E Production Templates (native model) success Logs
E2E GoBGP PeerModes (vrnetlab) success Logs
E2E ContainerLab success Logs
E2E EVPN Boot (vrnetlab) success Logs
E2E Production Templates (one uplink) success Logs
E2E Production Templates (networkd Ubuntu 24.04) success Logs
E2E Production Templates (networkd Ubuntu 26.04) success Logs
E2E Pure Type-5 Fabric success Logs
UEFI ISO Boot Validation success Logs
E2E Cable Check success Logs
E2E GoBGP PeerModes success Logs
E2E Production Smoke (ContainerLab) success Logs
E2E Production Templates success Logs
Go Vulnerability Check: Standard library govulncheck finding GO-2026-6809 (Distrust compromised intermediate certificates in crypto/x509). Fixed in Go v1.27.3. This does not fail the check, because only a Go toolchain bump clears it.

See the linked logs for complete findings and any scanner setup failures.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant