CVE Tools
A tangled web of glowing package/dependency nodes on a dark background, one node cracked open and leaking data, spreading infection lines to neighboring nodes — abstract supply-chain compromise visu

ChainDrop: The npm Worm That Made "Verified" Code Meaningless

A compromised maintainer account, a valid provenance signature, and a preinstall script were enough to turn keyv and ten other packages into a self-propagating credential harvester across 1,300+ versions and 2 billion monthly downloads.

On August 4, 2026, someone with legitimate publish rights to the keyv npm package pushed a new release. GitHub Actions built it, attested it, and signed it. npm's provenance check passed. By every automated signal a developer or CI pipeline could check, the package was clean. It wasn't — and it had already started spreading.

1,300+compromised package versionsacross keyv, cacheable and related libraries
2B+combined monthly downloadsof the affected package family
11confirmed malicious packagesidentical payload hash across all of them
0CVEs assignedthis is an identity compromise, not a code flaw

What actually happened

keyv is a small, widely-used key-value storage abstraction; cacheable and its sibling packages (flat-cache, file-entry-cache, cacheable-request, cache-manager and others) share a maintainer and a dependency graph. Singapore's Cyber Security Agency (CSA) and independent research from Snyk both describe the same mechanism: a compromised maintainer identity was used to commit malicious changes directly to these repositories, and the normal CI/CD pipeline built and signed the poisoned result as if nothing were wrong.

PackageMalicious versionStatus at snapshot
keyv6.0.0Live on latest
cacheable2.5.1Live
@cacheable/net2.1.1Live
@cacheable/node-cache3.1.2Live
@cacheable/memory2.2.1Live
@cacheable/utils2.5.1Live
file-entry-cache11.1.6Live
ecto5.0.1Live
flat-cache6.1.24Removed by npm
cacheable-request13.0.20Removed by npm
cache-manager7.2.10Removed by npm

Snyk's researchers checked a snapshot roughly two days after publication (11:16 UTC) and found eight of the eleven malicious releases still sitting on npm's latest tag — meaning npm install keyv was still pulling the compromised version for a significant window after disclosure began.

Why a signed, attested package still wasn't safe

This is the part worth sitting with. npm's provenance system links a published package back to the exact GitHub Actions run and commit that built it, and that link held here — the signature was real. The problem is what provenance actually proves versus what people assume it proves.

The infection chain: preinstall, Bun, and a second stage

The malicious commit added a single line to package.json: "preinstall": "node setup.mjs". npm runs preinstall scripts automatically and unconditionally during npm install — a developer never has to import keyv, start an application, or call any function. Running npm install was the entire attack surface.

How ChainDrop moves from install to propagation

  1. Maintainer identity compromised
  2. Malicious commit lands in repo
  3. CI builds + signs the release (provenance valid)
  4. Package published to npm
  5. Victim runs npm install
  6. preinstall auto-runs setup.mjs
  7. setup.mjs fetches Bun runtime if absent
  8. Second stage (Math_Symbol.js) executes
  9. Harvests npm/GitHub/cloud credentials
  10. Stolen npm token publishes to new packages
  11. IDE hook: .claude / .vscode task fires on folder open

setup.mjs (roughly 30KB) runs platform checks for Linux, macOS and Windows, then loads a second-stage payload (Math_Symbol.js, roughly 728KB) using child_process.execFileSync. If the Bun JavaScript runtime isn't already present on the machine, the loader fetches an appropriate Bun release directly from GitHub before executing further — using a legitimate developer tool as its own delivery mechanism.

The detail that should worry AI-assisted dev teams specifically

What it steals, and how it spreads itself

  • npm publish tokens — the mechanism the worm uses to compromise further packages
  • GitHub CLI and GitHub Actions secrets
  • AWS, HashiCorp Vault and Kubernetes configuration credentials
  • Terraform credentials
  • Cryptocurrency wallet material

CSA's advisory is explicit that the worm's core function is to "steal developer credentials and spread by compromising additional packages" — the self-propagation is why the count climbed from an initial cluster to over 1,300 package versions within days. Once it has a live npm token, it can publish malicious versions of any package that maintainer controls, repeating the exact provenance-valid trick.

IndicatorType
npm-cache[.]comExfiltration domain
https://npm-cache[.]com:443/routerExfiltration endpoint
eth-mainnet.nodereal[.]io, go.getblock[.]io, eth.llamarpc[.]comEthereum RPC endpoints (used as C2 lookup)
pypi-get[.]com, js-mirror[.]comAdditional network IOCs
setup.mjs, Math_Symbol.js / math_init.jsMalicious payload filenames (hash-matched)
GitHub repos titled "Shai-Hulud: Here We Go Again"Propagation marker

What to actually do about it

  1. Search lockfiles, node_modules, and CI/CD caches for the exact versions in the table above — matching by package name and version, not by CVE id, since none exists.
  2. Remove any affected version from development, build and CI/CD environments immediately.
  3. Treat any system that installed a malicious version as compromised; CSA's guidance is to rebuild rather than clean.
  4. Rotate npm tokens, GitHub tokens/SSH keys, cloud (AWS) credentials, Kubernetes configs and Terraform credentials on any system where installation occurred.
  5. Review cloud and source-control audit logs for unauthorized access or publishes following the installation window.
  6. Hunt for the network and file IOCs above, and for repositories or forks carrying the "Shai-Hulud: Here We Go Again" marker string.
  7. If you use Claude Code, Cursor, or VS Code tasks with runOn: folderOpen in any repo you don't fully control, review .claude/ and .vscode/ directories for unexpected hook configurations before trusting a workspace.

IOC and scope data as of 2026-08-06live record →

Filed under npm, supply-chain, chaindrop, shai-hulud, credential-theft, malware, ci-cd, software-supply-chain

More from the blog

We use analytics cookies to see which pages and articles actually help people. Decline and none of them run — the site works the same. What we store