Security Incident [Remediated]: npm supply-chain compromise of @squawk/* packages on 2026-05-11 #251
Pinned
neilcochran
announced in
Announcements
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
-
Incident Summary
On 2026-05-11, the mini-Shai-Hulud npm supply-chain worm published 110 malicious versions across all 22
@squawk/*packages on the npm registry during a 95-minute window (22:17-23:52 UTC). The worm gained access via a compromised upstream dependency (@tanstack/router-cliand@tanstack/router-plugin) that was pulled into CI through a routine Dependabot PR.The malicious versions are no longer installable. GitHub Trust and Safety removed all 110 malicious tarballs from the registry. The
latestdist-tag on every@squawk/*package now points at a pre-incident clean version. Any newnpm install @squawk/<anything>is safe.This post documents the incident in full so anyone arriving at squawk through public incident coverage can verify the project's response.
What happened
The upstream
@tanstack/*packages were compromised earlier on 2026-05-11 (see TanStack/router#7383). The compromised versions added a hidden@tanstack/setupoptionalDependencypointing at an orphan git commit; npm fetched it as a tarball and ran a credential-stealingpreparescript during install.A Dependabot PR for a routine dev-dependency group bump pulled in the compromised
@tanstack/router-cli@1.166.49and@tanstack/router-plugin@1.167.41. After review and merge tomain, the publish workflow rannpm ciwithNPM_TOKENin scope. The maliciouspreparescript exfiltrated the token and used it to publish 5 malicious versions of every package the token had access to, including all 22@squawk/*packages.The stolen token also had access to three of my unrelated personal npm packages (
cross-stitch,ts-dna,wot-api). Those were hit in the same window and have been remediated separately. None of them use@tanstack/*; they were collateral damage from a single overly broad classic npm token.Timeline (UTC)
main. CI runs onmainwith compromised@tanstack/*installed@squawk/mcp@0.9.1. The worm enumerates every package the stolen token can publish to and begins mass-publishing@squawk/mcp@0.9.5. 110 malicious versions across 22@squawk/*packages live on the registry, withlatestpointing at malicious code on every packageNPM_TOKENat npm.com, disable GitHub Actions on this repo, remove all repo secrets and variables, rotate the GitHub App private key used by the release workflow, and revoke all Personal Access Tokensmain, reverting PR #246. Repo source state returns to a known-clean lockfile and package.json. The@tanstack/*pause is added to.github/dependabot.ymlin the same change@squawk/*versions from the registry and resetlatestdist-tags. They also clean upcross-stitchandts-dnain the same passwot-api(an unrelated 2022 package) during cleanup. I unpublish those 5 malicious versions directly once my account access was restoredAffected versions
Every
@squawk/*package received 5 malicious patch publishes during the worm window. The "Last clean" column is whatlatestcurrently points to and is safe to install.Every malicious version was published between 2026-05-11 22:17 and 2026-05-11 23:52 UTC. Any
@squawk/*version published in that window should be treated as malicious.Are you affected?
You are affected only if you ran
npm install(or equivalent) for any@squawk/*package between 2026-05-11 22:17 UTC and approximately 2026-05-12 04:00 UTC when Trust and Safety completed the registry cleanup.If you may have been affected:
node_modulesand any cached@squawk/*tarballs in your npm cache.npm install @squawk/<package>@<version>pinning to a "Last clean" version from the table above.If you did not install
@squawk/*packages during the worm window, no action is needed. Current installs of@latestare safe.What I did
NPM_TOKENat npm.com within minutes of detection.@tanstack/*updates in.github/dependabot.ymluntil upstream remediation is confirmed.bundle.jsor other payloads, no@tanstack/setupreferences in the lockfile, no unexpected branches or commits, no malicious public repos created on the account, no unfamiliar webhooks, deploy keys, or collaborators.@squawk/*package on npm and confirmedlatestdist-tags resolve to pre-incident clean versions across all 22 packages.Status
@squawk/*versions: removed from the registry.latestdist-tags: pointing at pre-incident clean versions for every package.main: clean. Revert and@tanstack/*pause both merged.The
@squawk/*package code on the registry today is exactly what it was on 2026-05-11 before the worm ran. No source changes from the incident remain in any published version.References
For security concerns relating to
@squawk/*packages, please follow the disclosure flow in SECURITY.md."Walk without rhythm, and it won't attract the worm." - Fremen survival rule, Frank Herbert's Dune
Beta Was this translation helpful? Give feedback.
All reactions