Open Source · · 2 days

Miasma poisoned LeoPlatform npm and jumped to a Go module

In late June 2026 the Miasma worm republished 23 LeoPlatform and RStreams npm packages with a malicious binding.gyp, then reached the Verana Blockchain Go module. It was the campaign's first move outside npm and into the Go ecosystem.

Part of Miasma worm burrowed through npm for two months campaign

A late-June 2026 wave of the Miasma worm poisoned 23 npm packages belonging to the LeoPlatform and RStreams data-streaming projects, along with three packages published by the account llxlr. Socket, which analyzed the wave, also found compromise indicators in a Go module for the Verana Blockchain project. That made it the first time the campaign reached outside npm.

LeoPlatform and RStreams publish serverless data-streaming libraries for AWS. The malicious releases went out in a tight window, inserted as new patch versions across every supported major release series at once, so a project pinned to any maintained line would pick one up. The delivery reused the technique from the June 3 wave: a weaponized binding.gyp that runs during npm install when node-gyp evaluates it, rather than a lifecycle script that an install-time scanner would flag.

From there the chain ran through a ROT Caesar layer, AES-GCM decryption, and a downloaded Bun runtime used to execute the JavaScript payload outside Node's own security hooks. It collected npm tokens, GitHub secrets, SSH keys, and cloud credentials, and searched for GitHub Actions workflows with publishing permissions to extract more. The marker string RevokeAndItGoesKaboom tied the wave to earlier GitHub Actions compromises in the same family.

The persistence is what distinguishes this wave. Rather than relying on the package staying installed, the malware wrote hooks into developer tooling configuration for Claude, VS Code, Cursor, and Copilot, staging payloads in a .claude folder with a VS Code folder-open task that invokes node .claude/setup.mjs. A developer who merely opened a poisoned repository later would execute it, which extends the blast radius well past whoever ran the original install. Socket advised rotating exposed credentials from a clean machine and auditing repositories for injected workflows, unexpected branches, and .claude/ or .github/ configuration files. Researchers track the family under the overlapping names Mini Shai-Hulud, Miasma, and Hades.

Notes

  • This wave is the Miasma campaign's first move outside npm. The Verana Blockchain Go module is a separate project from LeoPlatform and is recorded here as an artifact of the same wave because published reporting treats them together and the Verana-specific evidence is limited to compromise indicators.
  • Sources differ on timing. The Hacker News places the npm releases on 2026-06-24, while Socket describes all compromised versions being published within a 30-second window on 2026-06-26. Both dates are retained in the range.
  • The affected package count is 23 across LeoPlatform and RStreams, plus three packages published by the llxlr account. Socket enumerated the package names and the single malicious version published for each, which are recorded on the artifacts here. Three of the 23 are hexo, prism, and solo-nav packages rather than LeoPlatform or RStreams ones, matching the separately reported llxlr activity.
  • Researchers use Mini Shai-Hulud, Miasma, and Hades for overlapping parts of this family. The binding.gyp delivery matches the 2026-06-03 wave recorded at [[vapi-server-sdk]].
  • StepSecurity's contemporaneous npm pack capture of leo-logger 1.0.8 was recovered from its still-live GitHub Actions artifact. Its SHA-1 and SHA-512 match the OSSF archive checksums, so the retained ordinary .tgz is byte-for-byte the published archive; SHA-256 was measured here.

Appendix · Affected releases

1.0.4 no sample yet
  • OSSF MAL-2026-6491 maps these checksums to the complete hexo-deployer-wrangler-1.0.4.tgz npm archive.
0.1.10 no sample yet
  • OSSF MAL-2026-6492 maps these checksums to the complete hexo-shoka-swiper-0.1.10.tgz npm archive.
leo-auth npm
4.0.6 no sample yet
  • OSSF MAL-2026-6417 maps these checksums to the complete leo-auth-4.0.6.tgz npm archive.
leo-aws npm
2.0.4 no sample yet
  • OSSF MAL-2026-6418 maps these checksums to the complete leo-aws-2.0.4.tgz npm archive.
leo-cache npm
1.0.2 no sample yet
  • OSSF MAL-2026-6419 maps these checksums to the complete leo-cache-1.0.2.tgz npm archive.
0.0.2 no sample yet
  • OSSF MAL-2026-6420 maps these checksums to the complete leo-cdk-lib-0.0.2.tgz npm archive.
leo-cli npm
3.0.3 no sample yet
  • OSSF MAL-2026-6421 maps these checksums to the complete leo-cli-3.0.3.tgz npm archive.
1.1.1 no sample yet
  • OSSF MAL-2026-6422 maps these checksums to the complete leo-config-1.1.1.tgz npm archive.
2.0.6 no sample yet
  • OSSF MAL-2026-6423 maps these checksums to the complete leo-connector-elasticsearch-2.0.6.tgz npm archive.
3.0.8 no sample yet
  • OSSF MAL-2026-6424 maps these checksums to the complete leo-connector-mongo-3.0.8.tgz npm archive.
3.0.3 no sample yet
  • OSSF MAL-2026-6425 maps these checksums to the complete leo-connector-mysql-3.0.3.tgz npm archive.
2.0.1 no sample yet
  • OSSF MAL-2026-6426 maps these checksums to the complete leo-connector-oracle-2.0.1.tgz npm archive.
3.0.6 no sample yet
  • OSSF MAL-2026-6427 maps these checksums to the complete leo-connector-redshift-3.0.6.tgz npm archive.
leo-cron npm
2.0.2 no sample yet
  • OSSF MAL-2026-6428 maps these checksums to the complete leo-cron-2.0.2.tgz npm archive.
1.0.8 sha256 3967738a…db301304 download unavailable
  • OSSF MAL-2026-6429 maps the SHA-1 and SHA-512 to the complete leo-logger-1.0.8.tgz npm archive. Both match the StepSecurity-captured bytes; the SHA-256 was measured from that verified archive.
leo-sdk npm
6.0.19 no sample yet
  • OSSF MAL-2026-6430 maps these checksums to the complete leo-sdk-6.0.19.tgz npm archive.
2.0.1 no sample yet
  • OSSF MAL-2026-6431 maps these checksums to the complete leo-streams-2.0.1.tgz npm archive.
1.0.1 no sample yet
  • OSSF MAL-2026-6493 maps these checksums to the complete prism-silq-1.0.1.tgz npm archive.
2.0.2 no sample yet
  • OSSF MAL-2026-6432 maps these checksums to the complete rstreams-metrics-2.0.2.tgz npm archive.
1.0.1 no sample yet
  • OSSF MAL-2026-6433 maps these checksums to the complete rstreams-shard-util-1.0.1.tgz npm archive.
2.0.4 no sample yet
  • OSSF MAL-2026-6434 maps these checksums to the complete serverless-convention-2.0.4.tgz npm archive.
3.0.14 no sample yet
  • OSSF MAL-2026-6435 maps these checksums to the complete serverless-leo-3.0.14.tgz npm archive.
solo-nav npm
1.0.1 no sample yet
  • OSSF MAL-2026-6436 maps these checksums to the complete solo-nav-1.0.1.tgz npm archive.
v0.10.1-dev.20 no sample yet
  • Socket staged payloads in a .claude folder with a VS Code folder-open task invoking node .claude/setup.mjs. The recorded SHA-256 is the module archive.

Indicators

  • malware_familyMiasma
  • filebinding.gyp
  • file.claude/setup.mjs
  • stringRevokeAndItGoesKaboom
  • accountnpm: llxlr

References

  1. Miasma Mini Shai-Hulud Hits LeoPlatform npm Packages and Go Ecosystem - Socketsocket.dev
  2. Miasma Malware Targets npm Packages and GitHub Actions in Supply Chain Attack - The Hacker Newsthehackernews.com
  3. Mini Shai-Hulud Worm Poisons LeoPlatform npm Packages to Steal Developer and CI/CD Secrets - GBHackersgbhackers.com
  4. Shai-Hulud Miasma Supply Chain Attack On LeoPlatform - CyberSecureFoxcybersecurefox.com
  5. OSSF malicious-packages databasegithub.com
  6. Immutable StepSecurity workflow that captured leo-logger 1.0.8 with npm packgithub.com
  7. Successful StepSecurity leo-logger capture rungithub.com
  8. GitHub Actions metadata for the retained leo-logger-tarballs artifactapi.github.com

Source record: oss/attacks/leoplatform-rstreams/meta.yaml