Poisoned Pipeline / Incidents / AS48
Shai-Hulud first wave (@ctrl/tinycolor)
npmGitHub ActionsGit / GitHubAI coding agentsDeveloper workstation
In September 2025 a malicious version of @ctrl/tinycolor (then ~2M weekly
downloads) started the first known self-propagating worm on npm. Socket’s
one-year recap is the primary timeline: bundle.js ran TruffleHog against
the host, exfiltrated npm/GitHub/cloud secrets to a webhook and to a
public GitHub repo named Shai-Hulud on the victim’s account, planted a
GitHub Actions workflow, then used stolen npm tokens to infect other
packages the maintainer owned. It reached CrowdStrike’s npm namespace
within a day. Hundreds of packages before rollback. Later Mini Shai-Hulud
/ ChainDrop / TanStack waves reused the pattern (AS16, AS28).
Mapped techniques
- T0121 Compromised legitimate artifact
- T0109 Publish malicious artifact
- T0140 Harvest tokens from environment variables
- T0168 Exfiltration to code repositories
- T0166 Trigger pipeline execution
- T0169 Push implants across repositories
supply-chain npm worm
@ctrl/tinycolor under its real name.
Stolen npm tokens republished the worm into other maintainer packages.
TruffleHog sweep of npm, GitHub, and cloud keys.
Public GitHub repo named Shai-Hulud created on the victim account.
Planted GitHub Actions workflow for persistence.
Self-propagation into every package the stolen token could publish.
Sources
- https://socket.dev/blog/happy-birthday-shai-hulud
- https://safedep.io/shai-hulud-supply-chain-attack-response
- https://safedep.io/npm-supply-chain-attack-targeting-maintainers
- https://www.reversinglabs.com/blog/shai-hulud-worm-arrests-what-you-need-to-know
- https://socket.dev/blog/tinycolor-supply-chain-attack-affects-40-packages
- https://socket.dev/blog/ongoing-supply-chain-attack-targets-crowdstrike-npm-packages