Your RSA-2048 keys break in 2030. Find every one of them before attackers do.
Malicious package

ulid-xyznpm

ulid-xyz is a confirmed malicious npm package (MAL-2026-6672) that steals credentials and exfiltrates sensitive data (malicious versions 2.12.1, 2.12.2, 2.12.3…). Do not install it — remove it immediately and rotate any exposed credentials.

Malicious code in ulid-xyz (npm)

MAL-2026-6672
Immediate action
Remove the package, then rotate any secrets the build/runtime could reach.
npm uninstall ulid-xyz

What this malware does

ulid-xyz is a typosquat of the popular ulid library (sortable unique IDs) and is a cross-platform Remote Access Trojan delivered via a postinstall hook. The package.json postinstall superficially looks like an inline node -e guard that checks for the existence of a dist file, but it actually launches dist/node/utils.js as a detached background process, which in turn runs dist/node/payload.js -- a 467 KB bundled RAT. payload.js decodes XOR+base64-obfuscated configuration (_CFG.WS / _CFG.HTTP) to beacon to a hardcoded attacker-controlled C2 over WebSocket at ws://95.216.232.162:8010/ (with an HTTP fallback at http://95.216.232.162:8010/), establishing a WebSocket RAT channel. It installs persistence on all three major operating systems under the stem MicrosoftSystem64: on Windows under %LOCALAPPDATA%\MicrosoftSystem64; on macOS under ~/Library/Application Support/MicrosoftSystem64 plus a LaunchAgent at ~/Library/LaunchAgents/com.launchkeeper.MicrosoftSystem64.plist; and on Linux under ~/.local/share/MicrosoftSystem64. The install-time detached spawn (process management capability) and the ~8x package size spike (64 KB to 536 KB) correspond to the bundled RAT payload -- behavior a ULID library has no legitimate need for. All versions of ulid-xyz were published by the same actor (iloiyxo643 / [email protected], a disposable email address) and are considered malicious.

Package publishes as 'ulid-xyz' — a name edit away from the established 'ulidx' / 'ulid' libraries — and its README instructs users to npm install index-ulid and import { ulid } from "index-ulid", pointing at a second confusable name maintained by the same author. The declared homepage links to the canonical ulid repository (github.com/ulid/javascript), reinforcing the impersonation. package.json declares scripts.postinstall that runs node dist/node/utils.js after a required-files guard, but dist/node/utils.js is absent from this tarball — only dist/node/index.cjs and dist/node/index.js ship. As published, the guard throws and the postinstall is inert, so no malicious code executes on install in this version. The wired-but-missing lifecycle target combined with the confusable name and a bloated runtime dependency list (pino, ws, zod, esbuild, tsup, ts-node, typescript, @types/node, @types/ws, and a meta postinstall package — none required for ULID generation, where the legitimate ulidx ships zero runtime deps) is consistent with a dormant-dropper staging pattern: ship a benign tarball under a confusable name, then publish a future version that fills in the postinstall target. No exfiltration, no install-time RCE, and no silent-relay are present in the current code, so a public block would overclaim the present-version harm. Routing to human review for confusion-risk assessment and so a reviewer can monitor future versions of this name.

Any computer that has this package installed or running should be considered fully compromised. All secrets and keys stored on that computer should be rotated immediately from a different computer. The package should be removed, but as full control of the computer may have been given to an outside entity, there is no guarantee that removing the package will remove all malicious software resulting from installing it.

Malicious versions

9 flagged
2.12.12.12.22.12.33.1.03.2.03.2.13.2.23.2.33.2.4

Indicators of compromise (SHA-256)

5bf783a4cfc3bed5bff2b0fb13d8a258b73975f26522a02835d0ceca6617a7b3
7a5a0d54d479c79e864c40664737bacecb36d3db5f2a9e057a675f2676fbf64e
8813adaf661e003f6fd912fb4ccb2e5ab0e03ad0f59b22bcd383e437809a39a5
23041702700830f3caa094b14bf923ac78f81d6d0cef96ec784e948dbe4fc705
4694d7ae5e45aba5bd778dfb392fbb5f74eb656d5e8776f5d764fcdf14752199
5b10656015ed6acb83ec8adc3c6d2df6f689fa4df07d9919d960601f37925bfe
dd2787ff09af17aca56837745858f6000ae5807fb4b2533af5ee9894eda025de
99061d362d2397b2f7764034eb262faeff455cd9a844857362e8856503d7842f
9ceddd9d7a11efd9e91cd3311d4493ae74b8eea902c89c50f9a34ecff1f991a7
145986a950881e6fcf9c8e4c76dbb633b8ffa46de560e864c9ff6bb15d40adf6

Detection & response playbook

Credential / info stealer
  1. Find it

    Scan your lockfiles (package-lock.json, pnpm-lock.yaml, yarn.lock, requirements.txt, poetry.lock, etc.) and build artifacts for ulid-xyz (9 malicious versions). O3 Security's supply-chain scanner checks every dependency against known-malicious package intelligence at install time and in CI, flagging ulid-xyz across your stack and pipelines.

  2. If you installed it — respond

    ulid-xyz is built to steal secrets, so assume every credential the build or runtime could read is compromised. Remove it from your project and lockfile, then rotate ALL exposed secrets — npm/registry tokens, cloud keys, CI/CD secrets, SSH keys, and any .env values — from a known-clean machine. Audit logs for unauthorized use of those credentials.

  3. Did it already run?

    If ulid-xyz was ever installed, its post-install/runtime payload may have already executed. O3's L7 egress monitoring and runtime eBPF sensors detect the credential exfiltration or command-and-control callback after install and block the malicious outbound channel, so you catch and contain the actual compromise — not just the presence of the package.

  4. How O3 protects you

    O3 blocks ulid-xyz before install through its supply-chain scanner, and if it has already run, detects and severs the exfiltration or C2 callback at runtime through L7 egress monitoring and eBPF.

Frequently asked questions

No. ulid-xyz on npm has been identified as a malicious package (versions 2.12.1, 2.12.2, 2.12.3, 3.1.0, 3.2.0, 3.2.1, 3.2.2, 3.2.3, and 1 more flagged). It should be removed immediately — do not install or keep it in your dependency tree.

Campaign

IN-MAL-2026-008956IN-MAL-2026-008995IN-MAL-2026-008992IN-MAL-2026-008979IN-MAL-2026-008963IN-MAL-2026-008964IN-MAL-2026-009198IN-MAL-2026-009199IN-MAL-2026-009200GHSA-56hj-rr4f-w39g

References

Credits

  • Amazon Inspector · finder
  • SafeDep · finder

Detect & block this

O3 blocks ulid-xyz-class packages before install and in CI — and if it already ran, its runtime egress monitoring catches the credential exfiltration and severs the channel.

Explore

ulid-xyz (npm) malicious package — MAL-2026-6672 | O3 Security