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-obfuscator patterns 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.

Socket AI Scanner analysis of leo-aws@2.0.4
Socket AI Scanner’s analysis of [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: .env files, 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.

Execution flow of binding.gyp
Execution flow showing the shared 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:

  1. Forensic Preservation: Do not simply wipe machines; preserve logs and memory for analysis.
  2. Identity Rotation: Rotate all exposed credentials (AWS, GitHub, npm, etc.) from a known-clean host.
  3. Environment Rebuild: Identify all impacted developer machines and CI runners, then rebuild them from known-good lockfiles.
  4. Repository Audit: Scrutinize your repos for injected workflows, unexpected .github/setup.js files, 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

 

Related Articles

Back to top button