Poisoned Pipeline / Techniques / T0202
Inadequate CI/CD workflow permissions
CI/CD Posture SCM Posture Secrets Hygiene
Pipelines that grant overly broad tokens (for example GitHub ActionsGITHUB_TOKEN with contents: write, id-token: write, or pull-request
jobs that can push to default branches) let an attacker persist after the
first poisoned workflow run. Persistence takes the form of a new workflow
file, a deploy key, a self-hosted runner registration, or a long-lived
cloud credential minted by the job. This is distinct from overprivileged
runners (T0132) and from creating an access token after account takeover
(T0165): the weakness is the workflow permission set itself.
Where this idea came from
This catalogue, from upstream issue #42 and OWASP CICD-SEC-5 (pipeline-based access controls).
- https://docs.github.com/en/actions/security-guides/automatic-token-authentication
- https://www.cisa.gov/news-events/alerts/2025/03/18/supply-chain-compromise-third-party-github-action-cve-2025-30066
- https://github.com/pbom-dev/OSCAR/issues/42
Mitigations
- M1220 Use only trusted third-party Github actions from reputable sources
- M1221 Review the Github action source code
- M1222 Limit the permissions granted to third-party Github actions
- M1120 Store credentials in vault
Detections
- D1260 Implement regular security audit and review
- D1261 Implement penetration testing
- D1590 Implement continuous monitoring and logging of the CI/CD process
Observed in incidents (8)
- actions-cool GitHub Action tags still serve Mini Shai-Hulud after re-enablement
- tj-actions/changed-files GitHub Action
- Nx s1ngularity (stolen npm token via Actions injection)
- Keyv / Cacheable ChainDrop worm
- @7nohe/openapi-react-query-codegen poisoned publish workflow
- GHAPPIER loader via @dforge-core/dforge-mcp trusted publishing
- LiteLLM 1.107.0 built from a lookalike repository shipped a startup-hook stealer and hourly loader
- TanStack Mini Shai-Hulud (CVE-2026-45321)