{"id":"MAL-2026-6418","summary":"Malicious code in leo-aws (npm)","details":"The `leo-aws` 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.\n\nThe malicious payload is triggered automatically during `npm install` via a `binding.gyp` file using node-gyp command expansion (`\u003c!(node index.js \u003e /dev/null 2\u003e&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:\n\n- Credential theft: Targets npm, GitHub, PyPI, RubyGems, Kubernetes, HashiCorp Vault, AWS (IAM keys, Secrets Manager, IMDS), 1Password, JFrog Artifactory, and SSH keys.\n- AI tool targeting: Exfiltrates configuration files for Claude, Cursor, Gemini, and VS Code.\n- Worm propagation: Enumerates npm packages and auto-publishes version bumps to spread to other maintainers in the ecosystem.\n- GitHub persistence: Creates orphan `snapshot-\u003chex\u003e` branches with fake \"Dependabot Updates\" workflows to maintain access after initial compromise.\n\nAny 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.\n\n---\n_-= Per source details. Do not edit below this line.=-_\n\n## Source: amazon-inspector (914680f83c4971cb6bc16c3ef608f4c1e8a73a25769911d5d9076ad91c935f63)\nThe package contains a binding.gyp at the tarball root whose contents use GYP command-expansion syntax (\u003c!(...) / \u003c!@(...)) on line 6. npm implicitly runs `node-gyp rebuild` whenever a binding.gyp is present in the package, even without any declared install/postinstall script, and node-gyp's configure step evaluates \u003c!(...) expressions as shell commands. This causes the embedded command to execute on every `npm install` of leo-aws. The package ships no native C/C++ source files (no.c/.cc/.cpp/.h), so the binding.gyp has no legitimate build purpose — its only effect is to run the embedded shell command at install time. This is functionally equivalent to a postinstall hook and is a well-known supply-chain attack technique for hiding install-time code execution from cursory script-field inspection.\n","modified":"2026-06-25T08:01:27.347148685Z","published":"2026-06-24T23:04:55Z","database_specific":{"malicious-packages-origins":[{"sha256":"914680f83c4971cb6bc16c3ef608f4c1e8a73a25769911d5d9076ad91c935f63","id":"IN-MAL-2026-007471","source":"amazon-inspector","import_time":"2026-06-25T07:47:50.768854299Z","modified_time":"2026-06-25T06:30:31Z","versions":["2.0.4"]}],"iocs":{"urls":["https://safedep.io/miasma-worm-hits-leoplatform-20-npm-packages/"]}},"references":[{"type":"ARTICLE","url":"https://safedep.io/miasma-worm-hits-leoplatform-20-npm-packages/"},{"type":"PACKAGE","url":"https://www.npmjs.com/package/leo-aws/v/2.0.4"}],"affected":[{"package":{"name":"leo-aws","ecosystem":"npm","purl":"pkg:npm/leo-aws"},"versions":["2.0.4"],"database_specific":{"source":"https://github.com/ossf/malicious-packages/blob/main/osv/malicious/npm/leo-aws/MAL-2026-6418.json","cwes":[{"name":"Embedded Malicious Code","cweId":"CWE-506","description":"The product contains code that appears to be malicious in nature."},{"description":"The product contains code that appears to be malicious in nature.","cweId":"CWE-506","name":"Embedded Malicious Code"}],"indicators":{"package_integrity":[{"filename":"leo-aws-2.0.4.tgz","hashes":{"sha1":"1dcc0a39e1cd7293a9058cfc41e1afe8b397c943","sha512_sri":"sha512-Luw+cZtqqoRjRmSvjgcPYG/xQianu4NoE10qB4TwlJVcUoKjdl5bQa51hzAAUvitdncPT/mg4K+xBpGmlmeCeQ=="}}],"evidence_files":[{"sha256":"32d1bc728d8e504952083a6adc488c309a401c7df4dc8f47b382ce32e4aebe21","path":"binding.gyp","tlsh":"48c08c3ca9380d1029d958285168d402a4b142a3494e2a81fade60284fa840b2898bad"}]}}}],"schema_version":"1.7.5","credits":[{"name":"Amazon Inspector","contact":["inspector-research@amazon.com"],"type":"FINDER"},{"name":"SafeDep","contact":["https://safedep.io"],"type":"FINDER"}]}