
IOC-Checker für den TanStack/Mini Shai-Hulud npm-Lieferkettenangriff (CVE-2026-45321)
curl -fsSL https://raw.githubusercontent.com/nkopylov/tanscript-exploit-check/main/check-tanstack-exploit.sh | bash
Oder klonen und lokal ausführen:
git clone https://github.com/nkopylov/tanscript-exploit-check.git
cd tanscript-exploit-check
./check-tanstack-exploit.sh [Projektverzeichnis ...]
Dieser Checker deckt zwei Wellen der Mini-Shai-Hulud-Supply-Chain-Angriffskampagne von TeamPCP ab:
Am 11. Mai 2026 (19:20–19:26 UTC) veröffentlichte ein Angreifer 84 bösartige Versionen über 42 @tanstack/* npm-Pakete in einem 6-Minuten-Fenster. Der Angriff traf auch Pakete von Mistral AI, UiPath, OpenSearch und anderen – insgesamt über 170 Pakete über npm und PyPI.
Es wurden keine Anmeldedaten von Maintainern gestohlen. Der Angreifer nutzte die CI/CD-Vertrauenskette selbst aus, und zwar über einen 3-stufigen Angriff:
pull_request_target-Exploit – Ein Wegwerf-GitHub-Fork eröffnete einen PR, der Angreifercode im Sicherheitskontext des Basis-Repositorys ausführteAm 19. Mai 2026 (01:39–02:06 UTC) veröffentlichte das kompromittierte npm-Konto atool ([email protected]) 637 bösartige Versionen über 314 Pakete in zwei automatisierten Wellen. Zu den stark betroffenen Zielen gehören:
size-sensor (4,2 Mio. Downloads/Monat)echarts-for-react (3,8 Mio. Downloads/Monat)@antv/scale (2,2 Mio. Downloads/Monat)timeago.js (1,15 Mio. Downloads/Monat)@antv/*- und andere PaketeDiese Welle verwendete eine Bun-basierte Payload (498 KB index.js), ausgelöst über "preinstall": "bun run index.js", mit einer zweiten Stufe, die in impostor-Commits versteckt war, die über den Fork-Objekt-Sharing-Exploit in das GitHub-Repo antvis/G2 gepusht wurden.
Beide Wellen verwenden dieselbe „Mini Shai-Hulud“-Toolkit-Familie:
gh-token-monitor (Welle 1) und kitty-monitor (Welle 2) Daemons via LaunchAgent/systemd; Hooks in .claude/settings.json und .vscode/tasks.jsontoJSON(secrets) ausgibt, npm OIDC-Token-Austauschrm -rf ~/ falls GitHub-Token widerrufen wird, während der Daemon aktiv istfiredalazer, RSA-PSS-signierte BefehleNur @tanstack/router* und @tanstack/start* waren betroffen. NICHT betroffen: @tanstack/query*, @tanstack/table*, @tanstack/form*, @tanstack/virtual*, @tanstack/store.
Siehe die vollständige Sicherheitswarnung für alle 42 Pakete.
Alle vom npm-Benutzer atool ([email protected]) veröffentlichten Pakete erhielten am 19. Mai 2026 bösartige Versionen. Zu den stark betroffenen Paketen gehören:
| Paket | Monatliche Downloads |
|---|---|
size-sensor | 4,2 Mio. |
echarts-for-react | 3,8 Mio. |
@antv/scale | 2,2 Mio. |
Plus 310+ Pakete hauptsächlich im @antv/*-Scope (@antv/g2, @antv/g6, @antv/l7, @antv/s2, @antv/x6, @antv/f2, usw.), ai-figure, timeago-react, jest-canvas-mock, jest-date-mock und andere.
Siehe den SafeDep-Bericht für die vollständige Liste.
KRITISCH: Deaktivieren Sie den Totmannschalter, BEVOR Sie Token widerrufen. Die Malware löscht
$HOME, wenn Token widerrufen werden, während der Daemon aktiv ist.
gh-token-monitor UND kitty-monitor) und entfernen Sie LaunchAgent/systemd-Dienste.claude/router_runtime.js, .vscode/setup.mjs, ~/.local/share/kitty/cat.py, /var/tmp/.gh_update_state, usw.)node_modules und Lockfiles, installieren Sie neu mit --ignore-scriptsapi.masscan.cloud, filev2.getsession.org, git-tanstack.com, t.m-kosche.com)Kopieren Sie diese Prompts in Ihren KI-Codierungsagenten (Claude Code, Cursor, Cline/OpenClaw, Windsurf, Hermes usw.), um Ihr Projekt gegen Supply-Chain-Angriffe wie diesen zu härten.
Härten Sie die npm-Konfiguration dieses Projekts gegen Supply-Chain-Angriffe. Führen Sie Folgendes aus:
Exakte Versionen festlegen: Entfernen Sie alle
^- und~-Präfixe von jeder Abhängigkeit inpackage.json, sodassnpm installniemals stillschweigend eine neu veröffentlichte Version zieht.Postinstall-Skripte standardmäßig deaktivieren: Fügen Sie
ignore-scripts=truezur.npmrchinzu. Fügen Sie dann ein explizites"preinstall"-Skript inpackage.jsonhinzu, das nur die bekannten sicheren Lebenszyklus-Skripte ausführt, die dieses Projekt tatsächlich benötigt (falls vorhanden).Lockfile-only-Installationen in CI erzwingen: Stellen Sie sicher, dass CI
npm ci(nichtnpm install) verwendet. Falls eine CI-Konfigurationsdatei vorhanden ist, überprüfen Sie dies. Falls nicht, notieren Sie es als manuellen Schritt.Provenance-Verifizierung hinzufügen: Fügen Sie
npm audit signaturesals Schritt in der CI-Pipeline und als Pre-Push-Git-Hook hinzu.
Überprüfen und härten Sie die KI-Codierungsagenten-Konfiguration dieses Projekts gegen Supply-Chain-Injektionsangriffe (wie die TanStack/Mini-Shai-Hulud-Kampagne, die bösartige Hooks in
.claude/settings.jsonund.vscode/tasks.jsoninjiziert hat). Führen Sie Folgendes aus:Claude Code (
.claude/):
- Überprüfen Sie
.claude/settings.jsonund.claude/settings.local.jsonaufhooks-Einträge, die Shell-Befehle ausführen. Markieren Sie alles, was.js,.mjsoder.sh-Dateien ausführt – insbesondere aus.claude/,.vscode/odernode_modules/.- Entfernen Sie alle Hooks, die Sie keinem legitimen, benutzerdefinierten Zweck zuordnen können.
- Fügen Sie eine -Regel hinzu, um zu verhindern, dass committet wird (es sollte lokal bleiben).
Überprüfen und härten Sie die GitHub Actions-Konfiguration in diesem Repository gegen CI/CD-Supply-Chain-Angriffe. Führen Sie Folgendes aus:
Entfernen oder umbauen Sie alle
pull_request_target-Trigger – diese führen Workflow-Code im Kontext des Basis-Repositorys mit Zugriff auf Geheimnisse aus, selbst wenn sie von einem Fork ausgelöst werden. Ersetzen Sie durchpull_request+ einen separaten, genehmigungsgesteuerten Workflow falls nötig.Pinnen Sie alle Drittanbieter-Aktionen auf vollständige Commit-SHAs (nicht Tags oder Branches). Ersetzen Sie zum Beispiel
actions/checkout@v4durchactions/checkout@<vollständiger-sha>. Fügen Sie einen Kommentar mit dem Tag zur Lesbarkeit hinzu.Wenden Sie das Prinzip der geringsten Rechte auf jeden Workflow an. Fügen Sie explizite
permissions:-Blöcke hinzu. Die meisten Workflows benötigen nurcontents: read. Publish-Workflows benötigenid-token: write– und sonst nichts.Cache-Bereich einschränken: Wenn
actions/cacheverwendet wird, stellen Sie sicher, dass Cache-Keys branch-begrenzt sind, um Cross-Branch-Poisoning zu verhindern. Fügen Sierestore-keysvorsichtig hinzu – stellen Sie keine Caches von nicht vertrauenswürdigen Branches wieder her.
MIT
| # | Prüfung | Beschreibung |
|---|
| 1 | Totmannschalter | Persistenz-Daemons: gh-token-monitor (Welle 1), kitty-monitor (Welle 2) |
| 2 | Bösartige Prozesse | Bekannte Angreifer-Prozessnamen (beide Wellen) |
| 3 | Payload-Dateien | Bekannte bösartige Dateien nach Name und SHA-256-Hash (4 Hashes) |
| 4 | Claude Code Hooks | Injizierte Hooks in .claude/settings.json + generische SessionStart-Heuristik |
| 5 | VS Code Tasks | Injizierte Tasks in .vscode/tasks.json + generische runOn: folderOpen-Heuristik |
| 6 | GitHub Actions | toJSON(secrets) in jedem Workflow + pull_request_target-Warnung |
| 7 | npm Lockfiles | Kompromittierte Paketversionen in Lockfiles |
| 8 | optionalDependencies | Bösartiges @tanstack/setup und @antv/setup + 4 Impostor-Commit-SHAs |
| 9 | Netzwerkverbindungen | Aktive Verbindungen zur C2-Infrastruktur (5 Domains/IPs) |
| 10 | DNS-Cache | Frühere Auflösung von Angreifer-Domains (4 Domains) |
| 11 | Git-Branches | Dune-thematisiertes Branch-Namensmuster des Angreifers |
| 12 | Lebenszyklus-Skripte | Heuristik: bun run in preinstall/postinstall (installierte Pakete) |
| 13 | Dead-Drop C2 | firedalazer-Schlüsselwort und „Shai-Hulud“-Marker in der Git-Historie |
| 14 | GitHub-Abhängigkeiten | Heuristik: github:-Abhängigkeiten, die auf Commit-SHA in optionalDeps festgepinnt sind |
| Paket | Bösartige Versionen | Erste sichere Version |
|---|
@tanstack/react-router | 1.169.5, 1.169.8 | 1.169.9 |
@tanstack/router-core | 1.169.5, 1.169.8 | 1.169.9 |
@tanstack/vue-router | 1.169.5, 1.169.8 | 1.169.9 |
@tanstack/solid-router | 1.169.5, 1.169.8 | 1.169.9 |
@tanstack/react-start | 1.167.68, 1.167.71 | 1.167.72 |
@tanstack/router-plugin | 1.167.38, 1.167.41 | 1.167.42 |
timeago.js | 1,15 Mio. |
Ein Update-Policy-Skript erstellen: Erstellen Sie ein scripts/safe-update.sh, das:
npm view <pkg> time --json)npm install <pkg>@latest --save-exact ausÄndern Sie keinen Anwendungscode. Berühren Sie nur Konfigurationsdateien, .npmrc, package.json-Skripte und CI-Konfiguration.
.gitignore.claude/settings.local.jsonVS Code (.vscode/):
.vscode/tasks.json und .vscode/launch.json auf Tasks, die unerwartete Skripte oder Binärdateien ausführen.setup.mjs, router_runtime.js oder andere Namen verweisen, die nicht zu diesem Projekt gehören..vscode/extensions.json auf Erweiterungen, die Sie nicht erkennen.Cursor (.cursor/):
.cursor/settings.json und alle Regeln-Dateien auf injizierte Befehle oder Hooks..vscode/-Konfiguration.Allgemein:
preinstall, postinstall, prepare oder prestart-Skripte in package.json, die Sie nicht geschrieben haben. Markieren Sie verdächtige..github/workflows/ auf Workflows, die pull_request_target verwenden – markieren Sie dies als Sicherheitsrisiko mit einem Kommentar, der erklärt warum..gitignore Agenten-Sitzungsdateien ausschließt, die Anmeldedaten preisgeben könnten (.claude/projects/, .cursor/logs/, usw.).Melden Sie, was Sie gefunden und was Sie geändert haben. Ändern Sie keinen Anwendungscode.
Fügen Sie StepSecurity Harden-Runner als ersten Schritt in jedem Job hinzu: step-security/harden-runner@v2 mit egress-policy: audit (oder block, wenn Sie Ihre erlaubten Endpunkte kennen).
Überprüfen Sie auf Geheimnisse in Workflow-Logs: Stellen Sie sicher, dass kein Workflow-Schritt ${{ secrets.* }} oder ${{ toJSON(secrets) }} auf stdout ausgibt.
Melden Sie alle Änderungen. Ändern Sie keinen Anwendungscode.