Skip to content

fix(release): attest bundled control-plane images as a custom predicate (ADR-16 P5)#28

Merged
wrkode merged 2 commits into
mainfrom
fix/release-bundled-attestation
Jul 1, 2026
Merged

fix(release): attest bundled control-plane images as a custom predicate (ADR-16 P5)#28
wrkode merged 2 commits into
mainfrom
fix/release-bundled-attestation

Conversation

@wrkode

@wrkode wrkode commented Jul 1, 2026

Copy link
Copy Markdown
Collaborator

What

The v0.3.0 release failed at Attest bundled control-plane image SBOM:

Error: Unsupported SBOM format. Must be valid SPDX or CycloneDX JSON.

actions/attest-sbom's SBOM-format detector rejected the hand-rolled CycloneDX
predicate (the doc is spec-valid — cyclonedx-cli validate passes it; the action's
detector is simply stricter/opaque). Everything else in the release succeeded
(images pushed, provenance + image SBOM + binary attestations).

Fix (robust / future-proof)

Stop depending on the SBOM-format detector. Attest the baked-in images.lock
directly as a custom in-toto predicate
via generic actions/attest:

  • images.lock is the authoritative record — ref → digest → verified → verifyReason for every bundled control-plane image — so attesting it directly is
    faithful to (arguably better than) ADR-16 B5's intent: each released image
    attests exactly which control-plane images it baked, by digest, and at what trust
    level (cosign-verified vs digest-pinned-only).
  • Generic predicate-type + predicate-path accepts arbitrary JSON — no
    SBOM-format detection to trip over. Verifiable with
    gh attestation verify <image> --predicate-type https://kairos.io/attestations/bundled-control-plane-images/v1.

Changes

  • release.yml: replace the CycloneDX-generate + attest-sbom steps with an
    extract-images.lock step + actions/attest@v2 (SHA-pinned # v2, consistent
    with #4203).
  • Remove build/gen-bundled-sbom.py (no longer used).

The image + binary SBOM attestations (syft-generated CycloneDX) are unchanged
those pass the detector and are proven since v0.2.2; only the hand-rolled bundled
SBOM tripped it.

Validation

release.yml valid YAML, all actions SHA-pinned; actions/attest@v2 confirmed to
accept predicate-type + predicate-path. Go gates unaffected (workflow-only
change + script removal). The attest step itself runs only in a tagged release
(OIDC) — this is the re-cut that exercises it.

wrkode and others added 2 commits July 1, 2026 19:53
…te (ADR-16 P5)

The v0.3.0 release failed at 'Attest bundled control-plane image SBOM':
actions/attest-sbom rejected the hand-rolled CycloneDX with 'Unsupported SBOM
format' -- its SBOM-format detector is stricter than the CycloneDX spec (the doc
validates fine under cyclonedx-cli). Rather than chase that detector's quirks,
attest the baked-in images.lock DIRECTLY as a custom in-toto predicate via generic
actions/attest: images.lock IS the authoritative ref->digest->verified/verifyReason
record, and a generic predicate bypasses SBOM-format detection entirely -- more
robust and future-proof, and it still records exactly which control-plane images
(by digest) the release baked and at what trust level (B5 intent preserved).

- release.yml: replace the CycloneDX-generate + attest-sbom steps with an
  extract-images.lock step + actions/attest@v2 (predicate-type
  https://kairos.io/attestations/bundled-control-plane-images/v1, predicate-path
  images.lock). Action SHA-pinned (# v2), consistent with #4203.
- Remove build/gen-bundled-sbom.py (no longer used).

The image + binary SBOM attestations (syft-generated CycloneDX) are unchanged --
those pass the detector and are proven since v0.2.2; only the hand-rolled bundled
SBOM tripped it.

Co-Authored-By: Claude <noreply@anthropic.com>
Signed-off-by: William Rizzo <william.rizzo@gmail.com>
…P5 B5)

Consumers must pass the custom predicate-type explicitly to verify the pre-bundled
control-plane image set (per security-architect follow-up on PR #28):
  gh attestation verify ... --predicate-type \
    https://kairos.io/attestations/bundled-control-plane-images/v1

Co-Authored-By: Claude <noreply@anthropic.com>
Signed-off-by: William Rizzo <william.rizzo@gmail.com>
@wrkode
wrkode merged commit 3b5e803 into main Jul 1, 2026
9 checks passed
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