IronWorm
IronWorm is a custom Rust-based infostealer and self-propagating software supply-chain worm discovered by JFrog and distributed via malicious npm packages, including packages published from the compromised asteroiddao account. It targets software developers, with reporting indicating a particular focus on crypto and web3 developers. Infection occurs through trojanized npm package versions that execute a hidden Linux ELF binary via npm preinstall or postinstall hooks, often placed under paths such as tools/setup or .github/scripts/precheck. The malware steals a broad set of developer secrets, including API keys, cloud credentials, SSH keys, npm publishing tokens, CI/CD secrets, cryptocurrency wallet data, and other credentials from 86 environment variables and more than 20 credential file paths such as ~/.aws/credentials, ~/.kube/config, ~/.docker/config.json, ~/.claude/.credentials.json, ~/.codex/auth.json, ~/Cursor/auth.json, and ~/.gemini/settings.json. Reported targets include AWS, GCP, Azure, Vault, Kubernetes, Docker, GitHub, npm, and multiple AI providers, and it also contains dedicated modules for Exodus wallet credential and seed capture plus Kubernetes and Vault secret harvesting. IronWorm communicates with its operator over Tor, beaconing to an /api/agent endpoint, and supports secret upload, file download, and remote shell execution. For stealth and persistence, it uses a modified UPX-packed Linux ELF with overwritten UPX markers, per-call-site string decryption, and an embedded eBPF rootkit that hides processes and TCP connections, rewrites /proc and netlink-derived views, and kills ptrace attempts with SIGKILL. The malware propagates by reusing stolen credentials to push malicious, backdated commits into accessible GitHub repositories and to publish trojanized package updates to npm; observed spoofed identities included claude, dependabot, renovate, and github-actions. In CI environments it can abuse npm Trusted Publishing OIDC flows to mint short-lived publish tokens without stored npm credentials. Reporting linked the campaign to at least 36-37 malicious npm packages and 57 malicious code changes across repositories in nine GitHub organizations including ocrybit, asteroid-dao, alisista, warashibe, kakedashi-hacker, weavedb, ArweaveOasis, arthursimao, and mlebjerg. Notable indicators mentioned in the reporting include the fake commit author email claude@users.noreply.github.com, the Tor C2 path /api/agent, and the Ethereum address 0x7e28D9889f414B06c19a22A9Bd316f0AC279a4d6 derived from a hardcoded wallet recovery phrase embedded in the malware.
Hunt this family in your stack
Mallory pivots from this family to the IOCs, detections, and named campaigns that touch your stack, and pages you when something new lands.
Groups observed using it
1 distinct threat actor attributed by public researchers. Open in Mallory to see the full evidence chain and overlapping campaigns.
A new supply-chain attack has infected 36 packages on the Node Package Manager (npm) index with infostealer malware called IronWorm. The malware targets 86 environment variables and 20 credential files... According to researchers at JFrog, IronWorm is written in Rust, hides behind an eBPF kernel rootkit, and communicates with the operator over the Tor network.
Techniques & procedures
30 distinct techniques documented for this family, organized by ATT&CK tactic.
Initial Access
3 techniquesJFrog identified the activity while investigating suspicious behavior linked to a developer account within the Arweave/WeaveDB open source ecosystem.
The campaign, which JFrog has dubbed "IronWorm," targets developers through compromised npm publishing workflows and malicious package updates.
The attack is built to spread itself through trusted developer workflows... When the malware runs inside a CI environment, it uses npm’s own Trusted Publishing flow to get short-lived publish credentials.
Execution
4 techniquesThe developer or CI runner executes npm install ... The preinstall script ./tools/setup fires before npm resolves dependencies. No build step, no manual confirmation, no user interaction. | The supported command set is intentionally small: upload extracted credentials, drop a file from the attacker-controlled server, or execute a remote shell command on the infected host.
The package.json gave away the trick: { "scripts" : { "preinstall" : "./tools/setup" } } preinstall runs before npm even starts resolving dependencies.
The package.json gave away the trick: { "name" : "weavedb-sdk" , "version" : "0.45.3" , "scripts" : { "preinstall" : "./tools/setup" } } preinstall runs before npm even starts resolving dependencies. Type npm install , and the binary executes
Persistence
2 techniquesJFrog identified the activity while investigating suspicious behavior linked to a developer account within the Arweave/WeaveDB open source ecosystem.
Privilege Escalation
1 techniqueStealth
10 techniquesThe security vendor's analysis showed IronWorm uses a rootkit that abuses the Linux kernel's extended Berkeley Packet Filter (eBPF) to hide malicious processes, files, network activity, and other behavior from security systems.
The sample was a Linux ELF executable packed with a lightly modified UPX stub... The sample also hid most of its useful strings... each call site used its own parameters.
This was committed under the author name claude <claude@users.noreply.github.com> , mimicking an AI coding assistant... Workflow commits are using a rotating cast of familiar automation identities - dependabot , renovate , github-actions | The payload was placed under an innocuous-looking path such as tools/setup or .github/scripts/precheck . This was committed under the author name claude <claude@users.noreply.github.com> ... Workflow commits are using a rotating cast of familiar automation identities - dependabot , renovate , github-actions.
the disassembly confirmed the trick: the malware copies the timestamp of the repository's most recent real commit, so the malicious change appears to have been made whenever the project was last legitimately touched.
JFrog identified the activity while investigating suspicious behavior linked to a developer account within the Arweave/WeaveDB open source ecosystem.
The rootkit parses /proc/net/tcp as it is read and removes rows belonging to hidden sockets. Similar filtering applies to the netlink interface used by ss, so the implant’s Tor connections disappear | The rootkit hides processes by rewriting /proc directory listings in place, removing PIDs on a hidden-set watchlist before userland tools can see them.
When anything in /proc was listed , the rootkit rewrote the results in place, removing hidden PIDs before userland tools could see them. | The same hiding strategy extended to the network. The rootkit parsed /proc/net/tcp as it was read and removed rows belonging to hidden sockets. It also applied similar filtering to the netlink interface used by tools like ss
The rootkit parsed /proc/net/tcp as it was read and removed rows belonging to hidden sockets. It also applied similar filtering to the netlink interface used by tools like ss
Defense Impairment
1 techniqueCredential Access
6 techniquesThe credential sweep is exhaustive. The binary reaches for 86 environment variables spanning every major platform... source-control and package-registry tokens, CI/CD systems, messaging platforms, Vault and Kubernetes. | If the repository already had GitHub Actions workflows... it replaced an existing one -swapping a real workflow for a secret-exfiltration job... The ${{ toJSON(secrets) }} expression serializes the secrets available to the workflow run into a single value
The malware scans for 86 different environment variables covering cloud platforms, databases, CI/CD systems, source control tokens, and AI service API keys. It also reads more than 20 credential file paths from disk, including wallet configs and authentication files.
The binary reaches for 86 environment variables spanning every major platform a developer touches: the cloud providers, object storage, databases, source-control and package-registry tokens, CI/CD systems
It goes after files, too: more than twenty credential paths, including ones for tools that barely existed a year ago ... alongside the classics like ~/.aws/credentials , ~/.kube/config , and ~/.docker/config.json . | The credential sweep is exhaustive... It goes after files, too: more than twenty credential paths, including... ~/.aws/credentials , ~/.kube/config , and ~/.docker/config.json
One of them targets the Exodus desktop wallet by injecting a JavaScript hook into the application... Its goal is not subtle: capture the wallet password and seed mnemonic.
The malware, written in Rust, harvests a wide range of developer secrets, including API keys, cloud credentials, SSH keys, and npm publishing tokens, and reuses them to spread further across the software supply chain.
Discovery
3 techniquesAnother, running inside a Kubernetes pod, reads the service-account token, walks the namespaces, and dumps every Secret it can reach and if it finds a Vault instance, it logs in with that same token and enumerates the secret backends.
Another, running inside a Kubernetes pod, reads the service-account token, walks the namespaces, and dumps every Secret it can reach
Collection
1 techniqueThe ${{ toJSON(secrets) }} expression serializes the secrets available to the workflow run into a single value; the next step writes it to a file with a harmless-looking name.
Command and Control
4 techniquesThen it beacons out to an endpoint called /api/agent , and waits for orders. The conversation itself is plain HTTP wrapped inside the Tor tunnel
Then it beacons out to an endpoint called /api/agent ... The conversation itself is plain HTTP wrapped inside the Tor tunnel
For its command channel, the malware downloads the Tor expert bundle and its libraries, writes its own torrc , starts the daemon, and waits for the circuit to come up.
The commands are limited: uploading extracted secrets, drop the file from the malicious controlled server or running a remote shell on the infected machine.
Exfiltration
2 techniquesThe commands are limited: uploading extracted secrets... Another piece of code suggests a possible fallback path... The agent uploads it to temp.sh ... and reports the resulting link back over C2.
The agent uploads it to temp.sh , a public file host, which is tunneled through the same Tor circuit, and reports the resulting link back over C2. | the final step uploads that file as a build artifact, where it can be downloaded by anyone with sufficient access... Another piece of code suggests a possible fallback path... The agent uploads it to temp.sh , a public file host
IOCs tracked for this family
9 indicators attributed across vendor reports, sandbox runs, and researcher write-ups. Full values are available in Mallory.
IPs, domains, and DNS infrastructure linked to this family.
File hashes (MD5, SHA-1, SHA-256) from samples and reports.
Other indicator types observed in public reporting.
Recent activity
6 sources tracked across advisories, community write-ups, and news. New activity surfaces here as Mallory finds it.
A custom Rust-based infostealer delivered through poisoned npm packages that targets software developers. It steals credentials, API keys, wallet recovery phrases, Kubernetes secrets, and Exodus wallet data; uses an eBPF kernel-level rootkit for stealth; communicates over Tor; and self-replicates by abusing compromised GitHub repositories and npm Trusted Publishing workflows to spread trojanized packages.
A Rust-built npm supply chain worm delivered via malicious package preinstall hooks. It steals credentials from environment variables and files, deploys an embedded eBPF rootkit for stealth, uses Tor for C2, self-replicates through npm Trusted Publishing OIDC flows in CI, poisons GitHub repositories with malicious commits/workflows, and includes an Exodus wallet theft module plus Kubernetes/Vault secret harvesting.
Rust-based infostealer used in an npm supply-chain attack. It steals environment variables, credential files, SSH keys, wallet files, and publishing secrets, self-propagates by abusing stolen npm credentials to publish trojanized packages, and uses an eBPF kernel rootkit plus Tor communications for stealth.
A custom Rust-written malware implant targeting developers and npm supply chains. It steals developer secrets, uses them to propagate through trusted software workflows, employs an eBPF-based rootkit for stealth, and uses Tor-based C2 for covert communications.
The version that knows your environment.
Match every observed IP, domain, and hash against your live telemetry.
Named campaigns wielding this family, with evidence pinned to each claim.
CVEs this family uses for access and lateral movement.
YARA, Sigma, Snort, and vendor rules, auto-deployed to your SIEM.
Every documented technique, ranked by evidence weight.
Reddit, Mastodon, and CTI community discussion around this family.