Shai-Hulud self-propagating worm (1.0 & 2.0)
The worm made GitHub permissions the propagation mechanism. It validated available GitHub tokens and their permissions, then queried /user/repos?affiliation=owner,collaborator,organization_member to find repos where the compromised account had enough privilege. It planted shai-hulud-workflow.yml, exfiltrated ${{ toJSON(secrets) }} to a webhook, and made repos public, including any the victim merely held tokens for. The 2.0 variant registered the infected host as a self-hosted Actions runner named SHA1HULUD and planted an injection-prone workflow at .github/workflows/discussion.yaml, so opening a GitHub Discussion gave arbitrary command execution on the host. 2.0 compromised 796 npm packages, with credential exfiltration confirmed across more than 500 GitHub users spanning 150+ organizations. A smaller descendant, known as Mini Shai-Hulud, hit in May 2026: on 19 May one developer account takeover led to more than 630 malicious versions across 317 npm packages in about 20 minutes, including AntV packages. The TanStack compromise a week earlier came through a different door, Actions cache poisoning (see the cache poisoning incident).
Permissions abused
On the permission reference
Sources
- researchInside Shai-Hulud's maw: how the npm worm exploits and propagates
- researchShai-Hulud: self-replicating worm compromises 500+ npm packages
- trackerShai-Hulud 2.0: host registered as SHA1HULUD runner
- trackerShai-Hulud npm supply chain attack
- trackernpm supply chain attack: GitHub API exploitation
- trackerHackers have compromised dozens of popular open source packages in an ongoing supply chain attack