Skip to content

ci(release): repin setup-bazel to the GENUINE v0.14.0 — the old pin was not in the action's history - #583

Closed
avrabe wants to merge 2 commits into
mainfrom
ci/release-setup-bazel-real-v0140
Closed

avrabe wants to merge 2 commits into
mainfrom
ci/release-setup-bazel-real-v0140

Conversation

@avrabe

@avrabe avrabe commented Oct 21, 2026

Copy link
Copy Markdown
Contributor

Signing-path change — auto-merge deliberately NOT armed; maintainer review.

release.yml pinned bazel-contrib/setup-bazel@5483a91… commented # v0.14.0 pinned. It is not v0.14.0 (that is e8776f5) and not in the action's history: commits API 422, .patch Not Found, commit search 0 — yet the tarball endpoint serves it (HTTP 200), because GitHub resolves owner/repo@sha across the fork network. Every release since #205 (v1.77, 2026-06-17) downloaded it; v1.140.0's log shows it.

Benign, measured: extracted in isolation, never executed — tree byte-identical to genuine v0.14.0 (20 files, content hash d9249affa4edfd11 both), with a control (real 0.19.1: 24 files, different hash) proving the comparison discriminates. So this repin changes no executed code, only provenance.

Scope: deliberately not #580's bump to 0.19.1 (a version change on the signing path, to judge separately — its SHA 104e3ee is genuinely 0.19.1, but it kept the stale v0.14.0 comment, which is how this surfaced).

Audit: all 3 distinct SHA pins in .github/ checked with negative + positive controls; this is the only one not in its repo. (The first audit pass was vacuous — --jq '.sha[0:7]' prints null on a 422 — the controls caught it.)

Out of scope, named: nearly every other action here is pinned by mutable tag, not SHA.

🤖 Generated with Claude Code

https://claude.ai/code/session_01HvusAXYbHLyv3uTzfBcMbG

…as not in the action's history

`release.yml` pinned `bazel-contrib/setup-bazel@5483a91b6e3ffac6092848f1dd7eafcfad203d80`
with the comment `# v0.14.0 pinned`. That SHA is not v0.14.0 — tag 0.14.0 is
e8776f58fb6a6e9055cbaf1b38c52ccc5247e9c4 — and it is not in the action
repository's history at all:

  commits/<sha>              422 "No commit found"
  commits/<sha>/branches-where-head   422
  github.com/.../commit/<sha>.patch   Not Found
  search/commits?q=hash:<sha>         0 results
  tarball/<sha>              HTTP 200   <- still served

GitHub resolves `owner/repo@<sha>` across the whole fork network, so an object
that exists only in a fork, or was orphaned, still downloads under the
upstream name. That is the "imposter commit" class, and it sat on the release
job since #205 (2026-06-17, v1.77). The signed falcon-v1.140.0 run's log
records `Download action repository 'bazel-contrib/setup-bazel@5483a91…'`.

IT WAS BENIGN — MEASURED. Extracted into an isolated directory and never
executed, its tree is byte-identical to the genuine v0.14.0:

  5483a91 (pinned)   20 files   content tree-hash d9249affa4edfd11
  e8776f5 (v0.14.0)  20 files   content tree-hash d9249affa4edfd11
  104e3ee (v0.19.1)  24 files   content tree-hash 24710fabad65c309   <- control

The control proves the comparison discriminates. So no release ran anything but
v0.14.0's code; what was wrong is that nobody could have SHOWN that from the pin,
and the object could vanish (breaking a release mid-tag) or — had it differed —
run arbitrary code on the job that produces signed artifacts.

This repin changes NO executed code, only provenance: from "an object nobody can
locate" to "the release tag's own commit". It is deliberately NOT the 0.19.1 bump
in #580: that is a version change on the signing path and should be judged on its
own. (#580's new SHA 104e3ee IS genuinely 0.19.1 — but it kept the stale
"# v0.14.0 pinned" comment, which is how this surfaced.)

AUDIT, so this is not one of several: every SHA-pinned `uses:` in .github/ was
checked for existence upstream, with a negative control (a fabricated SHA must
read NOT-IN-UPSTREAM) and a positive one (real 0.19.1 must read IN-UPSTREAM).
3 distinct SHA pins; this was the ONLY one not in its repository. The first run of
that audit was vacuous — `--jq '.sha[0:7]'` prints the string "null" on a 422 and
read as present — and the controls are what exposed it.

Not in scope, named: ~every other action in this repo is pinned by mutable TAG,
not SHA. That is a broader posture question, not this defect.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HvusAXYbHLyv3uTzfBcMbG
@avrabe

avrabe commented Oct 21, 2026

Copy link
Copy Markdown
Contributor Author

Superseded by #588 — this exact commit is cherry-picked there (-x records the source) and batched with the other CI-only changes, so it costs one CI cycle under strict protection instead of one each.

@avrabe avrabe closed this Oct 21, 2026
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