Miasma-family npm worm tested in public: 19 packages, credential theft, wiper on token revocation, load-time addon trigger
An operator is publicly testing a Miasma-family npm worm. Between 19 and 27 October 2026, npm received 19 packages from the same operator, with eight published by the accounts alexjoipamiba, testnewtestme, iobandamwer and testsecuiitytestme. The malicious versions steal credentials, spread to other packages and repositories, and install a wiper that runs rm -rf ~/ when the victim revokes the stolen GitHub token. SafeDep found no compromised third-party packages or victims as of 22 October, and all observed activity belongs to the operator's own test accounts. The worm shares code with Miasma "Phantom Gyp" and adds the token-revocation wiper from Mini Shai-Hulud, but SafeDep has not confirmed its exact lineage.
Detalhes técnicos
- Triggers: (1)
binding.gypwith asourcesfield that runsnode index.js(alexjoipamiba, testnewtestme); (2) apostinstallscript that loads a native addon (addon.nodeoraddon_win.node) and callsinit()(iobandamwer); (3) from 27 October, the addon starts the worm fromnapi_register_module_v1when the package is imported, so--ignore-scriptsdoes not protect (testsecuiitytestme). Versions 1.0.2 and 1.0.3 also usepostinstall: node-gyp-build. - Loader: the addon decodes
.napi_cachewith a single-byte XOR key 0x96, and the loader runs the payload with Bun. The testsecuiitytestme builds use a new loader with a 32-byte XOR key and Brotli. - Evasion: exits on Russian and CIS locales and in known sandboxes. In GitHub Actions it kills StepSecurity Harden-Runner via docker.sock and redirects *.stepsecurity.io to localhost.
- Credential theft: SSH keys, npm, PyPI and Git credentials, .env files, browser logins, AI tool credentials (Claude, Codex, Gemini, Copilot), AWS/GCP/Azure/Vault/Kubernetes secrets, and GitHub Actions secrets from Runner.Worker memory.
- Exfiltration: encrypted commits to a new public repo on the victim's account (for example smart-workers-48213, description project-utils), with commit messages starting
AutoSyncComplete:. Fallback endpoint is hxxps://aiarmor[.]website/v1/api. It also injects a GitLab CI job named cache_sync that requests npm and PyPI OIDC tokens. - Propagation: republishes patched npm packages, PyPI, RubyGems and JFrog packages. It commits a fake CodeQL workflow and AI agent files (.claude/settings.json, .cursor/mcp.json, CLAUDE.md, AGENTS.md, .vscode/tasks.json) plus .github/init.js and init.ps1. It spreads over SSH to hosts in known_hosts.
- Persistence and wiper: net-health-checker polls the stolen token every 45 seconds for 48 hours and runs
rm -rf ~/; rm -rf ~/Documentson a 401 or 403. pkg-runtime runs sync.py hourly, searches commits for msync-3f7a, and runs RSA-signed Python scripts. - Infrastructure links: the GitHub account CementBeetleSteeple shares an email with the npm account testnewtestme, and the related account Meteordrewarm ran the first exfiltration test on 19 September. npm removed earlier packages (including testmgkregme) and replaced some with 0.0.1-security placeholders.
Remediação
- Disconnect the host from the network, remove persistence first (systemd units and scripts on Linux, LaunchAgents on macOS), and reinstall the operating system.
- Rotate all credentials: Git hosts, package registries, cloud, Vault, Kubernetes, SSH and AI providers.
- Check accounts for project-utils repositories, unexpected patch releases, agent-file commits and AutoSyncComplete: commits. Check npm packages for unexpected addon.node, addon_win.node, prebuilds/*/node.napi.node or .napi_cache files.
- Detection rules should cover all three triggers, not only binding.gyp. Do not clone CementBeetleSteeple repositories.
Linha do tempo
-
Miasma-family npm worm tested in public: 19 packages, credential theft, wiper on token revocation, load-time addon trigger
ler a análise desta fonte ocultar
An operator is publicly testing a Miasma-family npm worm. Between 19 and 27 October 2026, npm received 19 packages from the same operator, with eight published by the accounts alexjoipamiba, testnewtestme, iobandamwer and testsecuiitytestme. The malicious versions steal credentials, spread to other packages and repositories, and install a wiper that runs
rm -rf ~/when the victim revokes the stolen GitHub token. SafeDep found no compromised third-party packages or victims as of 22 October, and all observed activity belongs to the operator's own test accounts. The worm shares code with Miasma "Phantom Gyp" and adds the token-revocation wiper from Mini Shai-Hulud, but SafeDep has not confirmed its exact lineage.Technical Details
- Triggers: (1)
binding.gypwith asourcesfield that runsnode index.js(alexjoipamiba, testnewtestme); (2) apostinstallscript that loads a native addon (addon.nodeoraddon_win.node) and callsinit()(iobandamwer); (3) from 27 October, the addon starts the worm fromnapi_register_module_v1when the package is imported, so--ignore-scriptsdoes not protect (testsecuiitytestme). Versions 1.0.2 and 1.0.3 also usepostinstall: node-gyp-build. - Loader: the addon decodes
.napi_cachewith a single-byte XOR key 0x96, and the loader runs the payload with Bun. The testsecuiitytestme builds use a new loader with a 32-byte XOR key and Brotli. - Evasion: exits on Russian and CIS locales and in known sandboxes. In GitHub Actions it kills StepSecurity Harden-Runner via docker.sock and redirects *.stepsecurity.io to localhost.
- Credential theft: SSH keys, npm, PyPI and Git credentials, .env files, browser logins, AI tool credentials (Claude, Codex, Gemini, Copilot), AWS/GCP/Azure/Vault/Kubernetes secrets, and GitHub Actions secrets from Runner.Worker memory.
- Exfiltration: encrypted commits to a new public repo on the victim's account (for example smart-workers-48213, description project-utils), with commit messages starting
AutoSyncComplete:. Fallback endpoint is hxxps://aiarmor[.]website/v1/api. It also injects a GitLab CI job named cache_sync that requests npm and PyPI OIDC tokens. - Propagation: republishes patched npm packages, PyPI, RubyGems and JFrog packages. It commits a fake CodeQL workflow and AI agent files (.claude/settings.json, .cursor/mcp.json, CLAUDE.md, AGENTS.md, .vscode/tasks.json) plus .github/init.js and init.ps1. It spreads over SSH to hosts in known_hosts.
- Persistence and wiper: net-health-checker polls the stolen token every 45 seconds for 48 hours and runs
rm -rf ~/; rm -rf ~/Documentson a 401 or 403. pkg-runtime runs sync.py hourly, searches commits for msync-3f7a, and runs RSA-signed Python scripts. - Infrastructure links: the GitHub account CementBeetleSteeple shares an email with the npm account testnewtestme, and the related account Meteordrewarm ran the first exfiltration test on 19 September. npm removed earlier packages (including testmgkregme) and replaced some with 0.0.1-security placeholders.
Remediation
- Disconnect the host from the network, remove persistence first (systemd units and scripts on Linux, LaunchAgents on macOS), and reinstall the operating system.
- Rotate all credentials: Git hosts, package registries, cloud, Vault, Kubernetes, SSH and AI providers.
- Check accounts for project-utils repositories, unexpected patch releases, agent-file commits and AutoSyncComplete: commits. Check npm packages for unexpected addon.node, addon_win.node, prebuilds/*/node.napi.node or .napi_cache files.
- Detection rules should cover all three triggers, not only binding.gyp. Do not clone CementBeetleSteeple repositories.
- Triggers: (1)