Qualsiasi ambiente di sviluppo che ha installato o importato uno dei 172 pacchetti npm o PyPI compromessi pubblicati a partire dal 11 maggio 2026 dovrebbe essere considerato potenzialmente compromesso. Il worm Shai-Hulud, che ha compromesso ambienti di sviluppo, preleva credenziali da oltre 100 percorsi di file su workstation degli sviluppatori, tra cui chiavi AWS, chiavi private SSH, token npm, token GitHub PAT, token HashiCorp Vault, account di servizi Kubernetes, configurazioni Docker, cronologia Shell e portafogli crittografico. Per la prima volta in una campagna di TeamPCP, il worm mira anche ai gestori di password come 1Password e Bitwarden, come riferito da SecurityWeek.
Il worm ruba configurazioni degli agenti AI come Claude e Kiro, incluse le token di autenticazione delle risorse esterne ad esse collegate. Il worm non si rimuove quando il pacchetto è eliminato.
Persistenti e difficili da rimuovere
Il worm stabilisce la sua presenza in Claude Code (.claude/settings.json) e VS Code (.vscode/tasks.json con runOn: folderOpen), che si eseguono ogni volta che un progetto è aperto, e introduce un demone di sistema (macOS LaunchAgent / Linux systemd) che sopravvive ai riavvii. Questi si trovano all’interno dell’albero del progetto e non in node_modules. Rimuovere il pacchetto non li cancella.
Sui runner CI, il worm legge direttamente la memoria del processo runner attraverso /proc/pid/mem per estrarre gli segreti, incluso quelli mascherati, sui runner basati su Linux. Se i token vengono revocati prima dell'isolamento della macchina, come evidenziato dall'analisi Wiz, un demone distruttivo cancella la directory home.
Distribuzione globale e velocità di espansione
Tra le ore 19:20 e 19:26 UTC del 11 maggio 2026, il worm Shai-Hulud ha pubblicato 84 versioni maliziose su 42 pacchetti @tanstack/*. I dati di Mend rivelano che la campagna ha interessato 172 pacchetti in 403 versioni maliziose entro 48 ore, distribuendosi attraverso npm e PyPI. Un singolo pacchetto, @tanstack/react-router, riceve 12.7 milioni di download settimanali, come riporta il CVE-2026-45321 con un punteggio CVSS 9.6.
Ox Security ha riferito 518 milioni di download totali interessati. Ogni versione malevola contiene un’attestazione provenance SLSA al livello 3. L'attestazione provenance era reale; i pacchetti erano però compromessi.
Fallacia di controllo di accesso
Peyton Kennedy, ricercatore senior presso Endor Labs, ha dichiarato a VentureBeat che “Tanstack aveva l'impostazione corretta in carta: pubblicazione fidata con OIDC, attestazione della provenienza, 2FA su ogni account di mantenimento. L'attacco ha funzionato comunque.” Kennedy ha evidenziato che la tecnica commit orfani mostra che il controllo essenziale non è la provenienza né la 2FA, bensì l’ambito del token OIDC. Se il canale di pubblicazione fiducia l'intero repository invece di Workflow specifico su branch specifici, un commit senza storia e senza branch associato è sufficiente per ottenere un token di pubblicazione. Questa è una correzione di configurazione a una sola linea.
Sfrutti tre vulnerabilità in un solo worm certificato
Catena di controllo compromessa
Il post-mortem di TanStack ha definito chiaramente la catena di comando dell’attacco. Il 10 maggio, il malintenzionati hanno forchettato TanStack/router chiamandolo zblgg/configuration per evitare la ricerca da parte di fork-list come indicato da un’analisi di Snyk. Un pull request ha attivato un workflow pullrequesttarget che ha eseguito il codice del forcone, permettendo all'attaccante l'esecuzione su runner di TanStack. Il cache GitHub Actions è stato posizionato. Quando uno sviluppatore autorizzato ha unito main, il workflow di rilascio ha ripristinato il cache avvelenato, ed il codice del malintenzionato ha letto /proc/pid/mem, ha estratto il token OIDC, e ha POSTato direttamente su registry.npmjs.org. I test sono falliti. La pubblicazione è stata saltata. D’altra parte, 84 pacchetti firmati hanno raggiunto comunque il registro.
“Ogni vulnerabilità attraversa la barriera di fiducia assunta dagli altri”, afferma il post-mortem. Tecniche di aggressioni precedentemente conosciute in contesti diversi, come l'attacco tj-actions/changed-files del marzo 2025, sono state riconsiderate e applicate in nuovo contesto.
Attacco da PyPI dentro npm in ore
Microsoft Threat Intelligence ha confermato che il pacchetto PyPI mistralai v2.4.6 esegue payload su import (non installazione), scaricandolo mascherato come Hugging Face Transformers.
L’analisi di Security di Mistral AI ha confermato l’impatto. I pacchetti npm compromessi erano disponibili tra le ore 22:45 UTC del 11 maggio e 01:53 UTC del 12 maggio (circa 3 ore). La release PyPI mistralai==2.4.6 è in quarantena. Mistral ha affermato che un dispositivo sviluppatore interessato aveva portato alla situazione, ma nessuna infrastruttura Mistral è stata compromessa.
SafeDep ha confermato che Mistral non ha mai rilasciato la v2.4.6; nessun commit per il giorno 11 e nessun tag esiste. Wiz ha documentato l’intera area interessata: 65 pacchetti UiPath, SDK Mistral AI, OpenSearch, Guardrails AI, 20 pacchetti Squawk.
StepSecurity attribuisce la campagna a TeamPCP, basandosi sovrapposizioni della catena strumentale con precedenti ondate Shai-Hulud e compromessi Bitwarden CLI/Trivy. Il worm esegue sotto Bun invece che Node.js per evitare il monitoraggio sulla sicurezza di Node.js.
Il worm si inserisce all’interno dell’ambiente AI
L’attaccante ha trattato gli agenti AI di programmazione come parte del trust environment eseguibile. L’analisi tecnica di Socket del payload 2.3 MB di router_init.js ha identificato dieci classi di raccolta di credenziali in esecuzione in parallelo. Il worm crea persistenza all’interno delle directory .claude/ e .vscode/, hooking SessionStart di Claude Code e il runner task di apertura di folder di VS Code.
L’analisi di deobfuscation di StepSecurity ha confermato che il worm raccoglie anche configurazioni del server MCP di Claude e Kiro