MAL-2026-6430
Malicious code in leo-sdk (npm)
Details
The `leo-sdk` npm package was compromised as part of the Miasma worm campaign targeting the LeoPlatform npm ecosystem. On June 24, 2026, 20 LeoPlatform packages were published within a 3-second window by a threat actor who had taken over the npm account `czirker` belonging to the LeoPlatform organization.
The malicious payload is triggered automatically during `npm install` via a `binding.gyp` file using node-gyp command expansion (`<!(node index.js > /dev/null 2>&1 && echo stub.c)`), which bypasses lifecycle script scanners. The replaced `index.js` (~5.2 MB, obfuscated with ROT-N + AES-128-GCM encryption) deploys a multi-stage worm with the following capabilities:
- Credential theft: Targets npm, GitHub, PyPI, RubyGems, Kubernetes, HashiCorp Vault, AWS (IAM keys, Secrets Manager, IMDS), 1Password, JFrog Artifactory, and SSH keys. - AI tool targeting: Exfiltrates configuration files for Claude, Cursor, Gemini, and VS Code. - Worm propagation: Enumerates npm packages and auto-publishes version bumps to spread to other maintainers in the ecosystem. - GitHub persistence: Creates orphan `snapshot-<hex>` branches with fake "Dependabot Updates" workflows to maintain access after initial compromise.
Any system that installed this version should be considered fully compromised. Rotate all secrets immediately from a separate, clean machine. See the linked SafeDep report for full payload analysis, indicators of compromise, and remediation guidance.
--- _-= Per source details. Do not edit below this line.=-_
## Source: amazon-inspector (1919bbc80005a637a3e1161a28245bbe56baecb5a0d17e282cc5c2339e20b8d8) The package contains a binding.gyp at the repo root whose contents use GYP command-expansion syntax (`<!(...)`) inside its targets/sources configuration. npm implicitly invokes `node-gyp rebuild` whenever a binding.gyp is present — even without any declared install/postinstall script — and node-gyp/GYP evaluates `<!(...)` expressions as shell commands during the configure step. This means arbitrary code embedded in the binding.gyp's command-expansion expression runs on every `npm install` of leo-sdk, on the installer's machine, with the installer's privileges. The mechanism is functionally identical to a postinstall lifecycle hook but is easy to miss because no `scripts` entry advertises it. This is a known install-time RCE pattern (CWE-506); the binding.gyp file's only effective purpose under this shape is to execute its embedded shell command at install, not to build a real native addon.
Are you affected?
Enter the version of the package you're using.
Affected packages
No fixed version published yet for leo-sdk (npm). Pin to a known-safe version or switch to an alternative.