NEWSJACK · OCTOBER 2026 SUPPLY-CHAIN ATTACK

Shai-Hulud touchedone npm packagein October. Did it touch yours? — Cybersecurity News

On October 8, 2026, the npm package tensorlake@0.5.144 was published with a Shai-Hulud worm payload: a preinstall hook ran the moment anyone installed it — no import needed — and it harvested developer secrets. Run the 8 steps below against your own projects. 15 minutes, real commands, honest verdict.

This is a guided self-audit, not a forensic verdict. A clean checklist reduces uncertainty — it does not prove safety, and flagged static patterns do not prove malice. Only packages named in verified advisories are named here as confirmed-poisoned. If you installed a confirmed-poisoned release, skip to Step 8 and treat it as an incident.

What happened (verified)

Oct 7, 2026 ~01:20 UTC: malicious commits land on the tensorlake GitHub repo under a maintainer's name, not through a pull request.
Oct 8, 2026 01:12 UTC: the project's own release workflow publishes tensorlake@0.5.144 to npm with valid build provenance — the poison rides in through the front door.
The payload: a preinstall hook runs node lib/setup.mjs; the loader downloads the Bun runtime to dodge Node-focused detection, then executes lib/Math_Symbol.js (reported filename spellings include MathSymbol.js), an obfuscated ~856 KB credential stealer.
The haul: npm tokens, GitHub credentials, AWS/GCP/Azure cloud keys, Kubernetes and Vault secrets, SSH keys, crypto wallets, browser passwords, and AI-tool configs (.claude, .cursor, Kiro, Windsurf, Zed). Marker: globalThis.WORMTAG='tensrlake'.
Self-propagation: with a stolen npm token it republishes your packages with itself inside; it commits a .claude folder so it runs again when you open Claude Code; exfiltration goes to a public GitHub repo it creates ("Shai-Hulud: Here We Go Again") or its C2.
Aftermath: npm removed 0.5.144; the project's PR #1016 moved every package to 0.5.145 as the first clean release. The six tensorlake-native-*@0.5.144 binary packages needed unpublishing too.

Sources: Huntaegis incident write-up · GBHackers · Badger Signal · Anomali Cyber Watch · dev.to timeline.

The 8-step patient-zero self-audit

Run each command in your project root, then mark what you found. The real malicious-lifecycle-hook patterns below match Ingenious AI's npm-lifecycle-hook-auditor rules (WORMTAG marker, setup.mjs/Math_Symbol.js loaders, Bun-runtime invocation).

0 of 8 steps answered
1. Search your lockfiles for the poisoned release CRITICAL

npm removed tensorlake@0.5.144, but your lockfile may still pin it — or the six tensorlake-native-*@0.5.144 binary packages from the same release run.

grep -rn "tensorlake@0.5.144" package-lock.json pnpm-lock.yaml yarn.lock 2>/dev/null grep -rn "tensorlake-native" package-lock.json pnpm-lock.yaml yarn.lock 2>/dev/null
2. Enumerate lifecycle hooks across your dependency tree

Any package can declare preinstall/install/postinstall hooks. Most are benign — but this is how the worm runs, so look at every hit with fresh eyes.

grep -rn '"preinstall"\|"postinstall"' node_modules/*/package.json 2>/dev/null | head -40
3. Grep for the WORMTAG marker CRITICAL

The October tensorlake payload tagged itself with globalThis.WORMTAG='tensrlake'. A WORMTAG hit in installed code is a worm marker — case-insensitive.

grep -rni "WORMTAG" node_modules/ package-lock.json 2>/dev/null
4. Hunt the known loader filenames CRITICAL

The tensorlake loader chain used setup.mjs plus the ~856 KB second stage (reported spellings: Math_Symbol.js / MathSymbol.js).

find node_modules -name "setup.mjs" -o -name "Math_Symbol.js" -o -name "MathSymbol.js" 2>/dev/null
5. Flag Bun-runtime invocation and obfuscated payloads

The loader downloaded the Bun runtime specifically to dodge Node-focused detection. Bun in an install path deserves an explanation.

grep -rniE '\bbun\b' node_modules/*/package.json 2>/dev/null
6. Check for signs of exfiltration CRITICAL

The worm exfiltrates to a public GitHub repo it creates in your account ("Shai-Hulud: Here We Go Again") and republishes your packages using your stolen npm token. Look for repos and publishes you didn't make, and unexpected login sessions.

# GitHub: scan your repos for any you didn't create gh repo list --limit 100 --json name,createdAt,url | grep -i "shai\|hulud\|worm" # npm: check recent publishes of your packages npm view <your-package> time --json | tail -5
7. Review commits and CI logs around Oct 7–8, 2026

The tensorlake attack entered through commits pushed directly to main outside pull requests (~01:20 UTC Oct 7), then the project's own release pipeline shipped it. Audit your own repo the same way.

git log --since="2026-10-01" --until="2026-10-15" --format="%h %ad %an %s" --date=short
8. If anything flagged: remediation order matters

If you installed a confirmed-poisoned release: kill the worm's token-monitor process FIRST, then rotate credentials. Security researchers documented a dead-man switch — revoking a stolen GitHub token while the monitor still runs triggers a home-directory wipe. Rotate npm, GitHub, cloud, Kubernetes, Vault and SSH credentials from a clean machine, and rebuild from a trusted source. Future installs: npm config set ignore-scripts true, pin exact versions, and never npm-install on the machine that holds production secrets.

SELF-AUDIT VERDICT

This verdict reflects your self-reported checklist answers. It is not a forensic finding: a CLEAN result does not certify your install chain, and an INVESTIGATE result does not prove compromise. Automated help: npm-lifecycle-hook-auditor (Python, stdlib only).

Why lifecycle hooks are the weak link

Vibe-coded? Audit the code you shipped. AI-generated code pulls dependencies you never reviewed. Vibe-Code Audit by Ingenious AI scans what your AI assistant actually wrote — including the dependency chains it quietly added.
Audit my AI-written code → Vibe-Code Audit (early access) See all 11 Ingenious AI platforms →

More from Ingenious AI

FROM INGENIOUS AI
Ingenious AI builds 11 AI security platforms — disclosure compliance, rogue-agent defense, breach hunting, agent oversight, and more.
All 11 platforms: DisclosureGuard  ·  ModelMinder  ·  TermsWatch  ·  Vibe-Code Audit  ·  Rogue-Agent Defense  ·  BreachHunter  ·  ChatBreaker  ·  Agent Flight Recorder  ·  Agent Auth Gateway  ·  DomainGuard  ·  ContentCraft AI
Our platforms are being upgraded and return November 1 — get early access now:
Get early access on WhatsApp →
Share this self-audit: XLinkedInReddit

What does patient zero mean in this cybersecurity news story?

The first infected install. In the October 2026 wave, a published npm package shipped with a Shai-Hulud worm payload in its preinstall hook — every developer who installed it became a carrier, leaking credentials to the attackers. Finding your patient zero means tracing install timelines against the known malicious versions, then rotating every secret that machine ever touched.

Frequently asked questions

What is the Shai-Hulud npm worm?

Shai-Hulud is a self-replicating npm supply-chain worm. It compromises packages by adding malicious lifecycle hooks (preinstall/install/postinstall scripts) so the payload runs at install time — before any application code executes. The October 2026 tensorlake incident (version 0.5.144) used a preinstall hook running node lib/setup.mjs, which downloaded the Bun runtime and executed an obfuscated ~856 KB payload harvesting developer credentials.

Was tensorlake 0.5.144 the only poisoned package?

No. The same release run also published six tensorlake-native-*@0.5.144 binary packages, and an earlier August 2026 campaign using the same worm family reportedly affected at least 444 packages across 1,381 versions. Only packages named in verified advisories should be treated as confirmed — this page names only those.

How do I check whether my install chain touched a poisoned package?

Start with your lockfiles: grep for the poisoned version string (e.g. tensorlake@0.5.144). Then enumerate lifecycle hooks in your dependency tree, grep installed files for the worm's marker (WORMTAG) and known loader filenames (setup.mjs, Math_Symbol.js), flag Bun-runtime invocation, and review commits and CI logs around the incident window. The 8-step checklist above is a guided self-audit — not a forensic verdict.

I installed tensorlake 0.5.144 — what do I do first?

Treat the machine as fully compromised. The critical order from security researchers: kill the worm's token-monitor process FIRST, then rotate credentials — revoking a stolen GitHub token while the monitor still runs has been documented to trigger a home-directory wipe. Rotate npm, GitHub, cloud, Kubernetes, Vault and SSH credentials from a clean machine, and rebuild from a trusted source.

Related checks