Open Source · · 2 days
IronWorm backdoored Arweave ecosystem npm packages
JFrog found a Rust-built npm worm in 36 packages published from the compromised asteroiddao account, carrying an eBPF kernel rootkit and a Tor C2. It backdated commits across nine GitHub organizations and republished via npm trusted publishing.
JFrog Security Research disclosed in early June 2026 that a self-propagating worm it named IronWorm had backdoored 36 npm packages, most of them in the Arweave and WeaveDB ecosystem, after compromising the asteroiddao publishing account. Unlike the JavaScript droppers that dominated npm attacks that year, IronWorm was a native Rust implant with a kernel-level rootkit.
The delivery was conventional enough. A preinstall hook executed a 976 KB Linux ELF binary before dependency resolution finished. Everything after that was not. The binary was packed with a modified UPX stub carrying altered magic values, which defeats signature-based unpackers, and every internal string was encrypted with a key unique to its call site, so recovering one string does not help with the next. Bundled with it was an eBPF program that hid the malware's processes and network connections from the kernel's own accounting, and a Tor client that wrapped plain HTTP command-and-control traffic in an onion circuit.
The collector targeted 86 environment variables and more than 20 credential file paths across AWS, GCP, Azure, Kubernetes, Docker, npm, and GitHub, together with a sweep for 2026-era AI provider keys covering Anthropic, OpenAI, Google Gemini, Cohere, Mistral, Groq, and xAI. Separate modules went after cryptocurrency wallets. JFrog noted that the operator had hardcoded his own wallet recovery phrase into the malware's skip list so that it would not rob him, which is how researchers came to have it.
Propagation ran two ways. The worm committed binaries into victims' GitHub repositories as build hooks, attributing the commits to "claude" so they read as AI tooling output, and it carried logic, which JFrog never observed fire in the wild, to replace GitHub Actions workflows with versions that exfiltrated ${{ toJSON(secrets) }}, attributing those to bot identities such as dependabot. It then abused npm's trusted publishing through OIDC to release poisoned versions under the compromised developers' names. JFrog counted 57 backdated commits across nine compromised GitHub organizations and said it could not match the implant, the rootkit, or the C2 tooling to any known family, indicating a custom-built operation.
Notes
- JFrog enumerated 37 packages with one malicious version each, published from the compromised asteroiddao account and from other maintainer accounts reached with stolen credentials. Reported counts vary between 36 and 37 by source.
- JFrog reported 57 backdated commits across nine compromised GitHub organizations, concentrated in the Arweave and WeaveDB ecosystem, and found no match to any known infostealer, rootkit framework or C2 toolkit.
- The implant is a 976 KB Rust ELF run from a preinstall hook, with per-call-site string encryption that slowed analysis. The operator's own wallet recovery phrase is hardcoded into its skip list.
- OSSF records preserve npm checksums for 31 releases; with four from npm and hbsig 0.3.2 from npmmirror, 36 of 37 artifacts have whole-file hashes. wdb-core 0.1.2 is reconstructed in the samples manifest and stays unhashed here.
Appendix · Affected releases
- OSSF MAL-2026-4720 maps these checksums to the complete weavedb-lite-0.1.1.tgz npm archive.
- OSSF MAL-2026-4724 maps these checksums to the complete weavedb-sdk-base-0.21.1.tgz npm archive.
- OSSF MAL-2026-4690 maps these checksums to the complete test-weavedb-sdk-1.1.1.tgz npm archive.
- OSSF MAL-2026-4727 maps these checksums to the complete weavedb-warp-contracts-plugin-deploy-1.0.11.tgz npm archive.
- OSSF MAL-2026-4483 maps these checksums to the complete arnext-arkb-0.0.2.tgz npm archive.
- OSSF MAL-2026-4717 maps these checksums to the complete weavedb-console-0.2.1.tgz npm archive.
- OSSF MAL-2026-4718 maps these checksums to the complete weavedb-exm-sdk-0.7.4.tgz npm archive.
- OSSF MAL-2026-4538 maps these checksums to the complete create-arnext-app-0.0.10.tgz npm archive.
- OSSF MAL-2026-4726 maps these checksums to the complete weavedb-tools-0.45.3.tgz npm archive.
- OSSF MAL-2026-4545 maps these checksums to the complete cwao-tools-0.3.1.tgz npm archive.
- OSSF MAL-2026-4689 maps these checksums to the complete test-ajs-0.1.19.tgz npm archive.
- OSSF MAL-2026-4719 maps these checksums to the complete weavedb-exm-sdk-web-0.7.4.tgz npm archive.
- OSSF MAL-2026-4691 maps these checksums to the complete testnpmnmp-1.0.21.tgz npm archive.
- OSSF MAL-2026-4712 maps these checksums to the complete warp-contracts-plugin-deploy-test-3.0.1.tgz npm archive.
- OSSF MAL-2026-4546 maps these checksums to the complete cwao-units-0.8.3.tgz npm archive.
- OSSF MAL-2026-4486 maps these checksums to the complete atomic-notes-0.5.3.tgz npm archive.
- The SHA-256 identifies the complete 0.5.6 tarball retained by the official npm registry; its bytes also match npm's signed SHA-512 integrity record.
- OSSF MAL-2026-4544 maps the SHA-1 and SHA-512 checksums to the complete cwao-0.5.6.tgz npm archive.
- OSSF MAL-2026-4716 maps these checksums to the complete weavedb-client-0.45.3.tgz npm archive.
- OSSF MAL-2026-4722 maps these checksums to the complete weavedb-offchain-0.45.4.tgz npm archive.
- OSSF MAL-2026-4566 maps these checksums to the complete fpjson-lang-0.1.7.tgz npm archive.
- OSSF MAL-2026-5192 maps these checksums to the complete weavedb-contracts-0.45.2.tgz npm archive.
- OSSF MAL-2026-4721 maps these checksums to the complete weavedb-node-client-0.45.3.tgz npm archive.
- The SHA-256 identifies the complete 0.1.4 tarball retained by the official npm registry; its bytes also match npm's signed SHA-512 integrity record.
- OSSF MAL-2026-5189 maps the SHA-1 and SHA-512 checksums to the complete arjson-0.1.4.tgz npm archive.
- npmmirror retained npm's complete 0.3.2 version record and tarball. The 1,088,239-byte archive matches both the retained SHA-1 shasum and the signed SHA-512 integrity value; SHA-256 was measured over those verified bytes.
- The SHA-256 identifies the complete 0.8.5 tarball retained by the official npm registry; its bytes also match npm's signed SHA-512 integrity record.
- OSSF MAL-2026-4739 maps the SHA-1 and SHA-512 checksums to the complete zkjson-0.8.5.tgz npm archive.
- OSSF MAL-2026-4715 maps these checksums to the complete weavedb-base-0.45.3.tgz npm archive.
- OSSF MAL-2026-4725 maps these checksums to the complete weavedb-sdk-node-0.45.3.tgz npm archive.
- The SHA-256 identifies the complete 0.45.3 tarball retained by the official npm registry; its bytes also match npm's signed SHA-512 integrity record.
- OSSF MAL-2026-4723 maps the SHA-1 and SHA-512 checksums to the complete weavedb-sdk-0.45.3.tgz npm archive.
Indicators
- malware_familyIronWorm
- commit_authorclaude
- commit_authordependabot
References
- IronWorm: Shai-Hulud's rustier cousin - JFrog Security Researchresearch.jfrog.com
- IronWorm and New Miasma Worm Variant Hit npm in Supply Chain Attacks - The Hacker Newsthehackernews.com
- Rust-Written IronWorm Hits NPM Supply Chain - Dark Readingdarkreading.com
- IronWorm campaign - SafeDep Threat Intelligencesafedep.io
- OSSF malicious-packages databasegithub.com
- OSSF MAL-2026-4544 package-integrity record for cwao 0.5.6raw.githubusercontent.com
- OSSF MAL-2026-5189 package-integrity record for arjson 0.1.4raw.githubusercontent.com
- OSSF MAL-2026-4739 package-integrity record for zkjson 0.8.5raw.githubusercontent.com
- OSSF MAL-2026-4723 package-integrity record for weavedb-sdk 0.45.3raw.githubusercontent.com
- npmmirror retained npm metadata and dist integrity for hbsig 0.3.2registry.npmmirror.com
Source record: oss/attacks/ironworm-npm/meta.yaml