Threat Intelligence Report: Mini Shai-Hulud, Miasma, and Hades Malware Targeting Developer Ecosystems
A sophisticated new wave of supply-chain attacks—driven by the Mini Shai-Hulud, Miasma, and Hades malware families—is currently targeting the npm ecosystems of LeoPlatform and RStreams. This campaign has evolved beyond simple registry poisoning, moving into high-impact source-repository compromises that target the very tools developers rely on daily.
The attack surface is broad and multi-layered. By blending registry poisoning with install-time execution via binding.gyp, leveraging Bun-staged JavaScript loaders, and abusing GitHub Actions, the threat actors have built an execution pattern designed to harvest sensitive developer and CI/CD secrets while propagating laterally across registries and repositories.
Technical Breakdown: The “Phantom Gyp” Vector
The primary infection vector observed in the LeoPlatform wave is a technique we refer to as the “Phantom Gyp” pattern. Unlike traditional malicious packages that use highly visible preinstall or postinstall scripts in their package.json, these packages omit those hooks to evade basic static analysis. Instead, they include a binding.gyp file. Because node-gyp is invoked automatically during the installation process to compile native addons, the attacker can use this window to trigger shell command expansion and achieve arbitrary code execution.
Once the installation is triggered, the package’s index.js is replaced by a minimalist, multi-stage loader. This loader employs several layers of obfuscation to hinder forensic analysis:
- ROT-style shifting: A simple character rotation to mask the first-stage loader.
- AES-GCM Decryption: Highly secure decryption of embedded payload blobs.
- Runtime Reconstruction: Utilizing
javascript-obfuscatorpatterns to rebuild the malicious logic in memory.
Interestingly, the malware looks for the Bun runtime. If Bun is missing, the loader attempts to fetch or install it, subsequently executing the main payload via bun run. This is a strategic move: many existing Node.js security hooks and runtime protections have significantly weaker coverage when execution shifts to the Bun runtime.
Socket’s research links a rapid burst of activity on June 24, 2026, to an operational cluster previously known for targeting PyPI and bioinformatics research projects.

[email protected], a malicious package identified in the current wave.Credential Harvesting and Evasion
Once the Miasma/Hades payload is active, it begins an aggressive search for high-value credentials. The malware scans for:
- Cloud & Infrastructure: AWS, Azure, and GCP credentials; Docker and Kubernetes configurations; and HashiCorp Vault data.
- Development Secrets:
.envfiles, npm/PyPI tokens, GitHub tokens, and SSH keys. - Communication & Workflow: Slack and Twilio tokens, shell histories, and CI/CD secrets.
- IDE & AI Tools: Configuration files for IDEs and AI-driven coding assistants.
To maintain stealth, the malware performs environmental awareness checks. It probes for the presence of EDR and endpoint security tooling—including CrowdStrike, SentinelOne, Microsoft Defender, Carbon Black, osquery, Tanium, and Qualys—and employs locale-based guards to avoid executing in known forensic or sandbox environments.
Exfiltration is handled with extreme stealth. Instead of traditional outbound connections to suspicious IPs, the attackers use a “dead-drop” approach via the GitHub API. By creating repositories or uploading artifacts, they use commit messages and repo content as covert retrieval channels—a tactic seen previously in the RevokeAndItGoesKaboom campaign.
The Shai-Hulud Worm: GitHub Actions & IDE Weaponization
GitHub Actions are not just a target; they are a propagation mechanism. The malware specifically hunts for workflows responsible for publishing packages, attempting to siphon runner-scoped secrets directly from memory or the environment. Attackers have even pushed “poison” branches (e.g., snapshot-*) and fake Dependabot-like workflows containing large, obfuscated _index.js payloads to ensure persistence.

binding.gyp payload pattern.One particularly deceptive tactic involves using the name “Run Copilot” for GitHub Actions that actually exfiltrate secrets into uploaded artifacts. This tradecraft mirrors the codfish/semantic-release-action compromise, where attackers exploited mutable tags and Bun-run obfuscation to escalate impact.
The threat is not limited to Node.js. In the Verana Blockchain project, a Go module compromise was identified where payloads were hidden in a .claude folder. Here, the malware weaponizes developer workflows by using a VS Code “folder-open” task to invoke node .claude/setup.mjs, targeting the intersection of package ecosystems and AI coding assistants.
Mitigation and Response Strategy
If your environment has interacted with the affected packages, you must treat the entire system as compromised. We recommend the following immediate actions:
- Forensic Preservation: Do not simply wipe machines; preserve logs and memory for analysis.
- Identity Rotation: Rotate all exposed credentials (AWS, GitHub, npm, etc.) from a known-clean host.
- Environment Rebuild: Identify all impacted developer machines and CI runners, then rebuild them from known-good lockfiles.
- Repository Audit: Scrutinize your repos for injected workflows, unexpected
.github/setup.jsfiles, orphan branches, or unusual Bun usage.
For ongoing monitoring, you can follow the Socket tracking page for real-time updates on artifacts and related waves.
Indicators of Compromise (IoC)
| Package / File | Path / Item | SHA-256 Hash |
|---|---|---|
| Confirmed LeoPlatform/RStreams set | binding.gyp | 32d1bc728d8e504952083a6adc488c309a401c7df4dc8f47b382ce32e4aebe21 |
| [email protected] | index.js | 57ba86f6f0caaa580c1dccdf4ed7873d1470e5ea2f8e9ca7a989dc04899f13c0 |
| [email protected] | package.json | 4a0aa78757958683155a7b9289427fb829abcad1bf5ee6399eb73e8409b0bc11 |
| [email protected] | index.js | 026588d39b7c650b5c0dfbba6c6fcc0e7ec8e3b72ba8639012e7f71c708f2c3b |
| [email protected] | index.js | df9ea0c71574e11c93141ad2f018a63a5375cd6d69ca2f744732ad7814170657 |
| [email protected] | index.js | 1a3b9ed0b377f56f49b9a703612cf45e86ab7d100587e1e7a476d809fe337a8c |
| [email protected] | npm tarball | f565988f281bf77bcad26ea7f543617e53da4b62f5df63d4f7a89bae1729cf81 |
| [email protected] | npm tarball | a934a5bcf692b9d01e8129bf264be23809dfee464df471d75a9f3fa1bcede343 |
| [email protected] | npm tarball | f7c47be306351ffacd46584d2067f7be676dbfe17cd89ab4880632decfe18f3d |
| [email protected] | npm tarball | 3da2ca129c9920d9acd2e3477aee8f46b5a5f0e9537ad6e7b6ab1df1007adad1 |