← NIST SP 800-204D
5.1.1
Secure build
Build in isolated, hardened environments and produce signed provenance for what was built. Covers build workers, the build's own dependencies and the attestations it emits.
Summary in ghtier's words. Read NIST 800-204D's own text
Incidents (6)
Last 12 months (2): Actions cache poisoning (Angular, TanStack), TeamPCP tag force-overwrite campaign
2026
- Actions cache poisoning (Angular, TanStack)Organization May 2026
- TeamPCP tag force-overwrite campaignOrganization March 2026
2025
- tj-actions/changed-files supply-chain compromise (CVE-2025-30066)Application March 2025
2024
- Ultralytics build cache poisoningOrganization December 2024
- ArtiPACKED artifact token leakageApplication August 2024
2023
- Self-hosted runner takeovers (PyTorch and others)Organization January 2023
Attack path techniques used
- Repoint existing tags on a published Action (Point a release tag at a bad commit)
- Run PR code in a privileged workflow (Steal CI secrets and tokens)
- Read secrets from the runner (Steal CI secrets and tokens)
- Poison a shared Actions cache (Poison the build or published package)
- Backdoor a persistent self-hosted runner (Poison the build or published package)
- Publish a malicious version with a stolen token (Poison the build or published package)
Checklist items
The fixes for those techniques.
- Rulesets applied: push restriction, tag protection, sensitive file-path protection
- Third-party Actions pinned to a full commit SHA instead of a mutable tag or branch
- Audit every use of pull_request_target and remove or restructure risky ones
- Set the default GITHUB_TOKEN permission to read-only at the org level
- Require approval for first-time/external contributor workflow runs on forks
- Restrict which Actions can run to GitHub-verified creators or an internal allow-list
- Adopt artifact attestations for build provenance on published binaries/images
- Disallow self-hosted runners on public repositories
- Cloud credentials migrated from static keys to OIDC federation, scoped to repo + branch
- Publish packages with trusted publishing (OIDC) instead of long-lived registry tokens
- Put production secrets in environments with required reviewers
- Write and rehearse a credential-rotation runbook before you need it
Permissions involved
The GitHub permissions those incidents abused.