ChainDrop Worm: Self-Spreading Malware Infects 400+ npm Packages

Step by step
How the ChainDrop attack unfolded
Click a phase for details – or let the animation play through.
PHASE 1/6 · Initial Access

Attackers seized popular npm packages using stolen maintainer credentials and published manipulated versions.

T1195.002 – Compromise Software Supply Chain T1078 – Valid Accounts
  • Control over keyv/cacheable-family packages via stolen maintainer credentials (Microsoft Threat Intelligence)
  • First tainted version keyv@6.0.0 published at 09:35 UTC on 4 August 2026
  • Snyk initially confirmed eleven malicious releases (e.g. cacheable@2.5.1, ecto@5.0.1)
  • Microsoft documented more than 400 compromised packages across multiple publishers
PHASE 2/6 · Execution

A preinstall lifecycle hook triggered malicious code merely through the npm install command.

T1059.007 – Command and Scripting Interpreter: JavaScript T1204.003 – User Execution: Malicious Image
  • Manipulated entry "preinstall": "node setup.mjs"
  • No app launch, no import and no click required
  • setup.mjs was a heavily obfuscated loader program
  • Downloaded a second Bun-runtime-based payload stage
PHASE 3/6 · Credential Collection

ChainDrop scanned developer and CI/CD systems specifically for secrets and credentials.

T1552.001 – Unsecured Credentials: Credentials In Files T1552.005 – Cloud Instance Metadata API
  • Specifically distinguished between developer machines and CI/CD runners
  • Searched files, environment variables and CLI tools
  • Targeted npm tokens, GitHub, AWS, Kubernetes and HashiCorp Vault
  • Leveraged valid provenance that did not prove authorization
PHASE 4/6 · Self-Propagation

Using stolen npm write tokens the worm autonomously copied itself into further packages.

T1195.002 – Compromise Software Supply Chain T1080 – Taint Shared Content
  • Enumerated which packages the victim was allowed to publish
  • Injected preinstall hook and payload, bumped the version number
  • Republished manipulated packages – automated propagation
  • StepSecurity snapshot: 444 packages and 2,212 tainted versions
PHASE 5/6 · Exfiltration

The collected secrets were encrypted and transmitted to attacker infrastructure.

T1560.001 – Archive Collected Data: Archive via Utility T1041 – Exfiltration Over C2 Channel
  • Data was packaged and compressed
  • Encryption using AES-256-GCM
  • Transmission to, among others, the domain npm-cache[.]com
  • Affected: credentials for npm, GitHub, AWS, Kubernetes, Vault
PHASE 6/6 · Impact

An active supply-chain attack broadly compromised the npm ecosystem with self-perpetuating damage.

  • Snyk: "This is an active software supply chain incident, not a proof of concept."
  • CSA Singapore reported over 1,300 affected package versions two days later
  • Figures describe reach, not confirmed victim counts
  • Anyone using Node.js/npm directly or via a provider is affected
Short & clear answers
Frequently asked questions about this incident
Am I affected by ChainDrop?
In principle, anyone using Node.js/npm is potentially affected – either directly or through a service provider. Developer machines and automated build systems (CI/CD) that store credentials are especially at risk. A purely static website or a classic WordPress/PHP site without an npm build is not directly affected through this installation path.
How do I check whether one of the compromised packages was installed?
Check your lockfiles (not just package.json), as they record the exact installed versions. A quick overview is possible with the command npm ls keyv flat-cache file-entry-cache cacheable-request cacheable @cacheable/utils cache-manager @cacheable/net @cacheable/node-cache @cacheable/memory ecto --all. Compare the results against the versions confirmed by Snyk, such as keyv@6.0.0, flat-cache@6.1.24 or cache-manager@7.2.10.
Why was merely installing a package enough to get infected?
npm packages can include so-called lifecycle scripts that run automatically during installation. The manipulated packages added the entry "preinstall": "node setup.mjs", which automatically launched malicious code with every npm install. No application start, import or click was required.
What do I need to do right now?
First take stock of whether npm/Node.js is involved at all, then check your lockfiles against the confirmed malicious versions. Search node_modules/**/package.json for "preinstall": "node setup.mjs" as well as the files setup.mjs, Math_Symbol.js or math_init.js, without executing package code. Microsoft recommends treating affected developer workstations and build systems as compromised and rotating credentials.
Is it true that two billion people are affected?
No, that is false. Figures like over 400 packages or two billion refer to the reach within the npm ecosystem and monthly downloads, not to actual victims. There is no confirmed public figure for affected organizations or personal data records.
More security news
You might also be interested in
Critical Elementor Pro Flaw: Attackers Can Fully Take Over WordPress Sites
A file upload bug in Elementor Pro up to 4.2.1 allows RCE without login. Version 4.2.2 fixes the flaw – update now!
Pods Plugin: Critical Flaw Enables Admin Takeover, No Login
A critical flaw in the WordPress plugin Pods lets attackers overwrite admin passwords without login. Over 100,000 sites are affected.
miniOrange SAML SSO: Critical Bypass Turns Attackers Into Admins
Two critical auth bypasses in the miniOrange SAML SSO plugin allow forged SAML assertions—up to full WordPress admin access.