Skip to content

SHA-pin the 4 publish-path third-party actions (release / crates.io-OIDC / codecov token surface) #409

Description

@IvanWng97

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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    tech-debtRefactor / cleanup / paying down internal debt (no user-facing change)

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions