ChainDrop is a self-propagating npm worm linked to TeamPCP that compromised a maintainer account, abused trusted GitHub Actions releases, and spread poisoned packages with valid provenance. It stole developer credentials, used an Ethereum smart contract for rotating C2 domains, and planted persistence hooks in IDE and AI-agent configuration files, while also threatening destructive deletion when tokens were revoked. #ChainDrop #TeamPCP #keyv #Sigstore #SLSA #Ethereum
Keypoints
- ChainDrop entered the npm ecosystem on August 4, 2026 through a compromised maintainer account tied to the keyv ecosystem.
- The worm abused GitHub Actions release pipelines to publish poisoned packages with valid SLSA and Sigstore provenance, including keyv 6.0.0.
- It self-propagated by stealing npm tokens and republishing infected versions, spreading to more than 400 packages in under four hours.
- Its command-and-control relied on an Ethereum smart contract, enabling domain rotation without changing the malware and bypassing blocklists.
- The payload harvested a broad set of credentials, including npm, GitHub, cloud, Kubernetes, Vault, SSH, and AI tooling secrets.
- Persistence was achieved through hooks in .claude/settings.json and .vscode/tasks.json, allowing re-execution when projects were opened in Claude Code or VS Code.
- A revoked token could trigger destructive behavior such as remote code execution or wiping the victimâs home directory with rm -rf ~/.
MITRE Techniques
- [T1195.002 ] Compromise Software Supply Chain â The attacker poisoned trusted release workflows and published malicious packages from legitimate repositories (âthe projectâs existing GitHub Actions release workflow kicked in automatically, built the poisoned package, and published itâ).
- [T1059.007 ] JavaScript â The malware executed JavaScript payloads through setup.mjs and Math_Symbol.js (âThe setup.mjs file runs automaticallyâ and âThe Math_Symbol.js file is a heavily obfuscated file executed by Bunâ).
- [T1053.005 ] Scheduled Task/Job: At â Persistence-like execution was triggered by IDE and agent hooks that re-ran the payload when projects were opened (âHooks VS Code to execute the payload when a project folder is openedâ and âHooks Claude Code to execute node .vscode/setup.mjs at the start of a sessionâ).
- [T1105 ] Ingress Tool Transfer â The payload downloaded the Bun runtime from GitHub to run the second stage (âDownloads the Bun JavaScript runtime v1.3.13 directly from its official GitHub release pageâ).
- [T1555.003 ] Credentials from Web Browsers â The worm harvested tokens and credentials from configuration files, environment variables, and memory (âtargeting npm tokens from ~/.npmrc, environment variables, GitHub credentials such as PATs, ⌠AWS credentials ⌠SSH keys ⌠AI tooling credentialsâ).
- [T1552.001 ] Unsecured Credentials: Credentials In Files â It extracted secrets from files like ~/.npmrc, ~/.aws/credentials, ~/.kube/config, and ~/.ssh/ (âtargeting npm tokens from ~/.npmrcâ and âAWS credentials from ~/.aws/credentialsâ).
- [T1041 ] Exfiltration Over C2 Channel â Stolen data was uploaded to attacker-controlled GitHub repositories and, if needed, retrieved via Ethereum-based C2 (âcreate a new public repository under their identityâ and âcalls an Ethereum smart contract ⌠to retrieve active C2 domainsâ).
- [T1568.002 ] Dynamic Resolution: Domain Generation Algorithms â The attacker rotated C2 domains through an Ethereum smart contract to evade blocklists (âallowing the attacker to rotate domains with a single blockchain transactionâ).
- [T1486 ] Data Encrypted for Impact â Stolen data was compressed and encrypted before exfiltration (âserialized to JSON, compressed, and encrypted using AES-256-GCMâ).
- [T1490 ] Inhibit System Recovery â Revocation of stolen tokens could trigger destructive behavior including deletion of the home directory (âIf the token returns a 4xx error ⌠the worm triggers a secondary destructive payloadâ and âwiping the victimâs entire home directoryâ).
- [T1070.004 ] File Deletion: File Deletion â A destructive fallback used rm -rf ~/ to remove files (âexecute rm -rf ~/, wiping the victimâs entire home directoryâ).
- [T1112 ] Modify Registry â The malware modified package.json and workflow/config files to ensure execution (âmodified package.json to add a preinstall hookâ and âplants execution hooks that target modern AI-assisted developer toolingâ).
Indicators of Compromise
- [MD5 ] Malware file hashes associated with the payload â f92ee93a0af971a3966bfa8efa9c2625, 57bcf8d9f6834c44450eac145a967d2f2, and 54140f7e17e6f97f83aa3472473e01add
- [C2 URL ] Command-and-control endpoint used for fallback retrieval â https://npm-cache[.]com:443/router
- [C2 domain ] Fallback and active C2 infrastructure â npm-cache[.]com, awqhnjewqjkl[.]icu
- [Ethereum smart contract address ] EtherHiding C2 retrieval contract â 0xE1f2395ee43e45A1556EC6438a88c31B83493103
- [File names ] Malicious and persistence-related files â setup.mjs, Math_Symbol.js
- [Repository description strings ] Exfiltration repository naming used by the worm â Shai-Hulud: Here We Go Again, niagA oG eW ereH :duluH-iahS
Read more: https://www.zscaler.com/blogs/security-research/tracking-shai-hulud-inside-chaindrop-npm-worm