Skip to content

Fix deterministic container evidence recovery - #12

Merged
0xsl1m merged 1 commit into
mainfrom
codex/container-release-recovery-0.6.3
Jul 25, 2026
Merged

Fix deterministic container evidence recovery#12
0xsl1m merged 1 commit into
mainfrom
codex/container-release-recovery-0.6.3

Conversation

@0xsl1m

@0xsl1m 0xsl1m commented Jul 25, 2026

Copy link
Copy Markdown
Owner

Incident

The v0.6.3 container workflow built, scanned, pushed, and SLSA-attested the exact release image, then stopped before evidence verification/assets because canonicalization removed CycloneDX serialNumber. The pinned attestation action requires bomFormat, specVersion, and serialNumber to recognize CycloneDX JSON.

PyPI v0.6.3 published successfully. Both GHCR tags currently resolve to sha256:ddc369cd94ee8b982fd8976f2a3641bb75546a4da805ab556e97c3a80df69d9f, and its SLSA provenance verifies against release commit cd852fe6f2b8a3e766fc21ae9f6360755ae50e97.

Fix

  • canonicalize after resolving the exact registry digest and replace the random serial with a deterministic UUIDv5 derived from repository@digest; remove only the nondeterministic timestamp
  • add a recovery-only manual dispatch for existing stable releases
  • require the dispatch itself to run from protected main, then verify its workflow SHA is contained in origin/main
  • checkout an explicit stable tag and require a published, non-draft, non-prerelease GitHub release, matching package version, exact green release-source CI, and release commit contained in main
  • require both immutable image tags to preexist and match; verify image labels and prior exact-release-source SLSA provenance before reuse
  • prevent manual recovery from building, repairing, or pushing image tags and from issuing new provenance
  • bind the new SBOM attestation to the protected-main recovery SHA while retaining/verifying the prior SLSA binding to the exact release SHA
  • keep release evidence compare-or-create; conflicting assets are never overwritten

Verification

  • full regression: 320 passed, 2 opt-in model tests skipped
  • Ruff lint/format clean; strict mypy clean across 54 source files
  • Actionlint clean; all six embedded Bash run blocks pass bash -n
  • workflow/production policy tests: 22 passed
  • independent security re-review: GO, with no remaining signing-oracle, mutable-image, tag-confusion, source-binding, or asset-clobber blocker
  • live recovery preflight: stable v0.6.3 release, exact green source CI, equal version/SHA tags, matching digest, and exact-source SLSA verification all pass

@vercel

vercel Bot commented Jul 25, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
shadowshield Ready Ready Preview, Comment Jul 25, 2026 10:35pm

@0xsl1m
0xsl1m merged commit 8238111 into main Jul 25, 2026
15 checks passed
@0xsl1m
0xsl1m deleted the codex/container-release-recovery-0.6.3 branch July 25, 2026 22:39
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