
Rileva CVE-2026-45321 (compromissione della supply chain di TanStack) e artefatti del worm Mini Shai-Hulud. Scansiona node_modules, file di lock, hook di persistenza (Claude Code, VS Code, systemd, LaunchAgent), workflow GitHub, cronologia Git, domini C2 e configurazioni dei tool AI.
⚠️ Disclaimer: Questo strumento è stato creato per il mio caso d'uso personale. Tutti gli indicatori derivano dalle seguenti fonti advisory:
Se emergono nuovi IOC, varianti di payload o infrastrutture dell'attaccante dopo l'ultimo aggiornamento, non verranno rilevati. Effettua sempre un riscontro incrociato con gli advisory pubblicati più recenti.
Rileva il compromesso della supply chain di TanStack (CVE-2026-45321) e i relativi artefatti del worm Mini Shai-Hulud in un checkout locale del progetto.
Lo script è pensato per un triage rapido nei checkout dei sorgenti, nei job CI e nelle build Docker. Un risultato pulito significa che nessuno degli indicatori noti elencati di seguito è stato trovato. Non è un'indagine forense completa né una garanzia che una macchina non sia mai stata esposta.
| Categoria | Dettagli |
|---|
| Pacchetti compromessi | Tutti i 42 pacchetti @tanstack/* + 20 vittime secondarie propagate dal worm (@mistralai, @opensearch-project, @draftlab, safe-action, ecc.) |
| Scansione lockfile | pnpm-lock.yaml, yarn.lock, bun.lock, bun.lockb, package-lock.json, incluse le voci packages multilinea di npm v3 e le sezioni selettore/versione di Yarn v1 |
| File payload | router_init.js, tanstack_runner.js in node_modules con verifica SHA-256; sia le corrispondenze esatte di hash sia gli hash non corrispondenti fanno fallire la scansione |
| Vettore di infezione | @tanstack/setup come optionalDependency in qualsiasi pacchetto installato |
| Persistenza | Hook Claude Code SessionStart sia nelle impostazioni di progetto sia in quelle home, attività VS Code folderOpen, gh-token-monitor (LaunchAgent + systemd), workflow GitHub dannosi |
| Artefatti su disco | .claude/router_runtime.js, .claude/setup.mjs, .vscode/setup.mjs, gh-token-monitor.sh, com.user.gh-token-monitor.plist |
| IOC sorgente | Hash dei commit dell'attaccante, domini C2 (api.masscan.cloud, git-tanstack.com), endpoint Session Protocol, salt PBKDF2, stringhe della campagna |
| Storico Git | Commit con autore [email protected] |
| Pattern dei branch | dependabot/github_actions/format/* e dependabout/*/setup-formatter |
| Configurazioni AI tool | .claude/mcp.json e .kiro/settings/mcp.json manomessi |
| Processi in esecuzione | Payload daemonizzato e processi gh-token-monitor |
| Token npm | Token contrassegnati da riscatto (IfYouRevokeThisTokenItWillWipeTheComputerOfTheOwner) |
pnpm, yarn, bun, poi npm). Se un repository contiene intenzionalmente più lockfile, scansiona separatamente ogni stato rilevante del package manager.npm è disponibile e sufficientemente autenticato per npm token list.HOME corrente del processo che esegue lo script. In CI o nei container, questa potrebbe differire dalla directory home di una workstation di sviluppo.# Scan current directory
bash check-tanstack-compromise.sh .
# Scan a specific project
bash check-tanstack-compromise.sh /path/to/project
# One-liner (curl)
curl -sL https://raw.githubusercontent.com/ry-allan/tanstack-compromise-checker/main/check-tanstack-compromise.sh | bash
Codice di uscita 0 = nessun indicatore coperto trovato.
Codice di uscita 1 = compromissione coperta o indicatore di payload sospetto trovato.
═══════════════════════════════════════════════════════════════
TanStack Supply Chain Compromise Check (CVE-2026-45321)
═══════════════════════════════════════════════════════════════
Advisory: GHSA-g7cv-rxg3-hmpx
Reference: https://snyk.io/blog/tanstack-npm-packages-compromised/
Deep dive: https://www.stepsecurity.io/blog/mini-shai-hulud-is-back-…
[*] Scanning: /Users/xxxxx/repos/xxxxx
[*] Package manager: pnpm (pnpm-lock.yaml)
[*] Checking installed TanStack packages against 42 known-compromised versions…
[*] Checking worm-propagated secondary victims (Mini Shai-Hulud)…
[*] Packages: @mistralai, @opensearch-project, @draftlab, @draftauth,
[*] @dirigible-ai, safe-action, cmux-agent-mcp, nextmove-mcp,
[*] git-git-git, git-branch-selector, agentwork-cli, ml-toolkit-ts,
[*] wot-api, cross-stitch, ts-dna
[*] Scanning lockfile for known-compromised versions (pnpm-lock.yaml)…
[✓] No compromised versions in lockfile
[*] Checking for persistence artifacts (payload files, hooks, services, C2)…
[✓] No malicious author commits in git history
───────────────────────────────────────────────────────────────
[✓] No compromise detected.
Installa Aikido Safe Chain per scansionare automaticamente ogni installazione di pacchetti alla ricerca di malware:
curl -fsSL https://github.com/AikidoSec/safe-chain/releases/latest/download/install-safe-chain.sh | sh
Riavvia il terminale dopo l'installazione. Safe Chain avvolge npm, npx, yarn, pnpm, pip, uv e altri — bloccando i pacchetti più recenti di 48 ore e le versioni note come dannose prima che raggiungano il disco. Non sono richiesti token né configurazione.
Il Dockerfile di integrazione crea solo fixture sintetiche. Non scarica pacchetti compromessi reali.
La fixture principale verifica che tutti i 33 messaggi di rilevamento vengano attivati tra manifest dei pacchetti, lockfile, artefatti di persistenza, workflow, storico Git, IOC sorgente, nomi file dei payload, configurazioni degli AI tool e output di remediation:
docker build -f integration.Dockerfile -t tanstack-check-test .
La build Docker include anche una copertura di regressione mirata per:
package-lock.json v3 in cui il nome del pacchetto e la versione compromessa compaiono su righe separate.version compromessa compaiono su righe separate.router_init.js con hash non corrispondente che restituiscono codice di uscita 1.SessionStart a livello home anche quando esiste un .claude/settings.json pulito a livello di progetto.Dopo la build, il comando dell'immagine può essere eseguito direttamente:
docker run --rm tanstack-check-test