Skip to content

Pin all third-party GitHub Actions to immutable commit SHAs across CI workflows #3287

Description

@niStee

Description

ultraworkers/claw-code has no explicit policy requiring SHA pinning for third-party GitHub Actions. The three workflows in .github/workflows/ (release.yml, rust-ci.yml, rust.yml) reference actions by floating tags:

  • actions/checkout@v4
  • actions/setup-python@v5
  • actions/upload-artifact@v4
  • softprops/action-gh-release@v2
  • Swatinem/rust-cache@v2

GitHub's security hardening guide for Actions recommends pinning third-party actions to a full-length commit SHA to defend against a compromised or malicious tag — a tag is mutable, a SHA is immutable. Sister projects in the same space (topgrade-rs/topgrade, devswha/gajae-code) already enforce this.

This repo is too small to need a separate hardening ticket for every workflow. Filing one issue to cover all three.

Risk

  • Tag-mutation attack: a compromised upstream maintainer (or someone who steals their npm token) re-points @v4 to a malicious commit. Consumers running @v4 get pwned on the next workflow run.
  • Audit trail: pinning to SHA means the workflow content reflects exactly what you reviewed at that moment — important for supply-chain attestations.

Proposed solution

Convert every floating tag to SHA + comment in the three workflows. Suggested SHA picks (latest v4/v5 release as of 2026-08-10):

  • actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 (or pin to v4.4.0)
  • actions/setup-python@... (full SHA for the v5 release)
  • actions/upload-artifact@... (full SHA for the v4 release)
  • softprops/action-gh-release@... (full SHA for the v2 release)
  • Swatinem/rust-cache@... (full SHA for the v2 release)

I'll file a separate PR with the SHA-pinned versions once this issue has a maintainer ack. PR will use the "anti-slop" resolution gate from .github/PULL_REQUEST_TEMPLATE.md: this issue is the linked evidence.

Alternatives considered

  • Renovate config to auto-pin: heavier change; not justified for 3 workflows. Re-evaluate if the project adds more workflows.
  • Dependabot monthly (as CatoTH/antragsgruen does): Dependabot does offer action-version PRs but doesn't pin to SHA by default — same gap.

Environment

  • claw-code current state: 3 workflow files using @vN refs
  • This is a triage-only report — no remote state was modified to write it.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions