
Controllo IOC per l'attacco alla supply chain npm TanStack/Mini Shai-Hulud (CVE-2026-45321)
curl -fsSL https://raw.githubusercontent.com/nkopylov/tanscript-exploit-check/main/check-tanstack-exploit.sh | bash
Oppure clona ed esegui localmente:
git clone https://github.com/nkopylov/tanscript-exploit-check.git
cd tanscript-exploit-check
./check-tanstack-exploit.sh [project_dir ...]
Questo controllore copre due ondate della campagna di attacco alla supply chain Mini Shai-Hulud di TeamPCP:
L'11 maggio 2026 (19:20-19:26 UTC), un attaccante ha pubblicato 84 versioni dannose su 42 pacchetti npm @tanstack/* in una finestra di 6 minuti. L'attacco ha colpito anche pacchetti di Mistral AI, UiPath, OpenSearch e altri — oltre 170 pacchetti in totale tra npm e PyPI.
Non sono state rubate credenziali dei maintainer. L'attaccante ha sfruttato la stessa catena di fiducia CI/CD tramite un attacco in 3 fasi:
pull_request_target — Un fork GitHub usa e getta ha aperto una PR che eseguiva codice dell'attaccante nel contesto di sicurezza del repository di baseIl 19 maggio 2026 (01:39-02:06 UTC), l'account npm atool compromesso ([email protected]) ha pubblicato 637 versioni dannose su 314 pacchetti in due ondate automatizzate. I target ad alto impatto includono:
size-sensor (4.2M download al mese)echarts-for-react (3.8M download al mese)@antv/scale (2.2M download al mese)timeago.js (1.15M download al mese)@antv/* e altriQuesta ondata ha utilizzato un payload basato su Bun (index.js da 498KB) attivato tramite "preinstall": "bun run index.js", con un payload di seconda fase nascosto in commit impostori pushati nel repository GitHub antvis/G2 tramite lo sfruttamento della condivisione degli oggetti dei fork.
Entrambe le ondate usano la stessa famiglia di toolkit "Mini Shai-Hulud":
gh-token-monitor (Ondata 1) e kitty-monitor (Ondata 2) tramite LaunchAgent/systemd; hook in .claude/settings.json e .vscode/tasks.jsontoJSON(secrets), scambio di token OIDC npmrm -rf ~/ se il token GitHub viene revocato mentre il demone è attivofiredalazer, comandi firmati RSA-PSS| # | Controllo | Descrizione |
|---|---|---|
| 1 | Dead-man's switch | Demoni di persistenza: gh-token-monitor (Ondata 1), kitty-monitor (Ondata 2) |
| 2 | Processi malevoli | Nomi di processo noti dell'attaccante (entrambe le ondate) |
| 3 | File payload | File malevoli noti per nome e hash SHA-256 (4 hash) |
| 4 | Hook di Claude Code | Hook iniettati in .claude/settings.json + euristica generica SessionStart |
| 5 | Task di VS Code | Task iniettati in .vscode/tasks.json + euristica generica runOn: folderOpen |
| 6 | GitHub Actions | toJSON(secrets) in qualsiasi workflow + avviso pull_request_target |
| 7 | Lockfile npm | Versioni di pacchetti compromesse nei lockfile |
| 8 | optionalDependencies | @tanstack/setup e @antv/setup malevoli + 4 SHA di commit impostori |
| 9 | Connessioni di rete | Connessioni attive verso l'infrastruttura C2 (5 domini/IP) |
| 10 | Cache DNS | Risoluzione precedente dei domini dell'attaccante (4 domini) |
| 11 | Branch Git | Pattern di denominazione dei branch dell'attaccante a tema Dune |
| 12 | Script di ciclo di vita | Euristica: bun run in preinstall/postinstall (pacchetti installati) |
| 13 | C2 dead-drop | Parola chiave firedalazer e marcatori "Shai-Hulud" nella cronologia git |
| 14 | Dipendenze GitHub | Euristica: dipendenze github: ancorate a uno SHA di commit in optionalDeps |
Solo @tanstack/router* e @tanstack/start* sono stati colpiti. NON colpiti: @tanstack/query*, @tanstack/table*, @tanstack/form*, @tanstack/virtual*, @tanstack/store.
| Pacchetto | Versioni dannose | Prima versione sicura |
|---|---|---|
@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 |
Vedi la advisory completa per tutti i 42 pacchetti.
Tutti i pacchetti pubblicati dall'utente npm atool ([email protected]) hanno ricevuto versioni dannose il 19 maggio 2026. I pacchetti ad alto impatto includono:
| Pacchetto | Download mensili |
|---|---|
size-sensor | 4.2M |
echarts-for-react | 3.8M |
@antv/scale | 2.2M |
timeago.js | 1.15M |
Più altri 310+ pacchetti principalmente nell'ambito @antv/* (@antv/g2, @antv/g6, @antv/l7, @antv/s2, @antv/x6, @antv/f2, ecc.), ai-figure, timeago-react, jest-canvas-mock, jest-date-mock e altri.
Vedi l'analisi SafeDep per l'elenco completo.
CRITICO: disattiva il dead-man's switch PRIMA di revocare qualsiasi token. Il malware cancella
$HOMEse i token vengono revocati mentre il demone è attivo.
gh-token-monitor E kitty-monitor) e rimuovi i servizi LaunchAgent/systemd.claude/router_runtime.js, .vscode/setup.mjs, ~/.local/share/kitty/cat.py, /var/tmp/.gh_update_state, ecc.)node_modules e i lockfile, reinstalla con --ignore-scriptsapi.masscan.cloud, filev2.getsession.org, git-tanstack.com, t.m-kosche.com)