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.

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

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-009200

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