Deferred from PR #408's local two-lens review (the design/blast-radius lens). #408's body originally justified skipping SHA-pin as "actions are first-party (GitHub + Anthropic)" — that was wrong; verified live there are ~11 third-party actions, four of them on the credentialed publish path.
Problem
Floating action tags are mutable. Dependabot bumps the tag but does not protect against a malicious tag-move on a compromised upstream (cf. the tj-actions/changed-files Mar-2025 compromise). Most of pixtuoid's third-party actions run read-only in CI, but four run in the release/publish path with credentials, where a moved tag = token / supply-chain theft.
Pin these four (publish / credentialed path)
| Action |
Why it matters |
rust-lang/crates-io-auth-action@v1 |
mints the crates.io OIDC token |
softprops/action-gh-release@v3 |
creates the GH release (has a token) |
orhun/git-cliff-action@v4 |
runs in the release-notes/publish job |
codecov/codecov-action@v7 |
upload token; prior supply-chain history |
OIDC trusted publishing (#216 / #383) makes the crates.io/npm token short-lived, which reduces but does not eliminate the exposure — a compromised action in the publish job can still exfiltrate the token during its validity window or publish a malicious artifact.
Leave floating (read-only CI — acceptable with Dependabot)
dtolnay/rust-toolchain, Swatinem/rust-cache, taiki-e/install-action, extractions/setup-just, EmbarkStudios/cargo-deny-action, withastro/action. A moved tag could poison a CI run, but these jobs hold no publish secrets; floating + Dependabot is an accepted posture.
Fix
- Pin each of the four to a full-length commit SHA with a trailing
# vX.Y.Z comment (Dependabot updates pinned SHAs too, preserving the auto-bump).
- Scope to the workflow(s) that actually run these (release / publish / coverage), not a blanket repo-wide sweep.
Acceptance
The four publish-path actions reference a 40-hex commit SHA; Dependabot still tracks and bumps them; CI/release stays green.
Deferred from PR #408's local two-lens review (the design/blast-radius lens). #408's body originally justified skipping SHA-pin as "actions are first-party (GitHub + Anthropic)" — that was wrong; verified live there are ~11 third-party actions, four of them on the credentialed publish path.
Problem
Floating action tags are mutable. Dependabot bumps the tag but does not protect against a malicious tag-move on a compromised upstream (cf. the
tj-actions/changed-filesMar-2025 compromise). Most of pixtuoid's third-party actions run read-only in CI, but four run in the release/publish path with credentials, where a moved tag = token / supply-chain theft.Pin these four (publish / credentialed path)
rust-lang/crates-io-auth-action@v1softprops/action-gh-release@v3orhun/git-cliff-action@v4codecov/codecov-action@v7OIDC trusted publishing (#216 / #383) makes the crates.io/npm token short-lived, which reduces but does not eliminate the exposure — a compromised action in the publish job can still exfiltrate the token during its validity window or publish a malicious artifact.
Leave floating (read-only CI — acceptable with Dependabot)
dtolnay/rust-toolchain,Swatinem/rust-cache,taiki-e/install-action,extractions/setup-just,EmbarkStudios/cargo-deny-action,withastro/action. A moved tag could poison a CI run, but these jobs hold no publish secrets; floating + Dependabot is an accepted posture.Fix
# vX.Y.Zcomment (Dependabot updates pinned SHAs too, preserving the auto-bump).Acceptance
The four publish-path actions reference a 40-hex commit SHA; Dependabot still tracks and bumps them; CI/release stays green.