Oltre 400 pacchetti npm compromessi. Sì, avete letto bene: quattrocento. E tutto è partito da un singolo account GitHub di un maintainer che gestiva Keyv e Cacheable, due ecosistemi piuttosto popolari nel mondo npm.
Il 4 agosto 2026, alle 9:00 UTC, qualcuno con credenziali rubate ha iniziato a pubblicare versioni malevole di keyv. Prima ha inserito payload di persistenza nell’IDE direttamente nel repository, poi ha fatto partire la versione 6.0.0 con il malware incluso. Da lì, effetto domino.
Il worm che si auto-propaga
Questo non è un attacco isolato. Il payload è un discendente della famiglia malware ‘Mini’ Shai-Hulud — lo stesso ceppo visto nelle campagne TeamPCP e antv. Però stavolta gli operatori hanno fatto upgrade significativi.
Il malware va a caccia di tutto ciò che può servire: credenziali cloud (AWS, Azure, GCP, ma anche Alibaba e Tencent), secret degli sviluppatori, configurazioni AI (Claude, OpenAI, Cursor, Gemini), wallet crypto (Foundry, Solana, Monero), secret di CI/CD (Jenkins, Argo CD, Harbor). Esfiltra via repository GitHub creati con identità rubate, con tanto di descrizione predefinita: ‘Shai-Hulud: Here We Go Again’. Sottile, no?
La persistenza? Viene garantita tramite hook in Claude Code e file tasks.json di VS Code. Ogni volta che riavvii l’ambiente, il malware riparte.
Le novità rispetto alla versione open source
Perché sì, esiste una versione open source pubblica di Shai-Hulud pubblicata da TeamPCP. Questa variante però introduce alcune modifiche chiave:
Smart contract Ethereum per i C2. Invece di hard-codare i domini di command-and-control nel payload, il malware li recupera da un contratto Ethereum (StringListStore) tramite chiamata eth_call. Inizialmente configurato con tre domini, poi aggiornato per restituire solo npm-cache[.]com. Il wallet del proprietario del contratto? Già segnalato in passato per attività di scam. Che sorpresa.
Dead-man switch selettivo. Il C2 può rispondere con un codice che arma uno switch basato sulla revoca di un token GitHub. Se il token viene revocato — magari perché qualcuno si accorge della compromissione — scatta qualcosa. Cosa esattamente? Non ancora chiaro, ma la logica è inquietante.
Fingerprinting delle macchine. Ogni sistema compromesso invia un hash SHA256 di proprietà concatenate del sistema. Questo permette agli attaccanti di profilare le vittime e potenzialmente inviare comandi personalizzati o attivare payload mirati.
Expansion dei target. Quasi il 70% in più di file presi di mira rispetto alla versione precedente. Ora include anche /etc/shadow, le master.key di Jenkins, config di Alibaba Cloud, keystore Monero. Un menu completo.
Il messaggio intimidatorio nei commit iniziali? IfYouBlockThisAPIKeyItWillCrashTheLiveProductionServersOfAllThirdPartyClients. Tradotto: ‘Se blocchi questa chiave API, crashi i server di produzione di tutti i client terzi’. Bluff o minaccia reale? Difficile dirlo, ma il fatto che abbiano lasciato questo messaggio la dice lunga sul tono della campagna.
Cosa fare se siete stati colpiti
Wiz Research, che sta seguendo l’evoluzione dell’attacco in tempo reale, ha pubblicato una lista completa dei pacchetti compromessi su GitHub. Tra i più noti: @cacheable/utils, cache-manager, cacheable-request, diversi pacchetti dell’ecosistema Ornikar, plugin Qlik, e ovviamente keyv stesso.
Se uno di questi pacchetti era nei vostri node_modules, le azioni sono chiare:
- Rimuovete immediatamente le versioni compromesse da dev, build e CI/CD.
- Trattate i sistemi come compromessi. Rebuild completo se il pacchetto è stato installato.
- Rotate di tutte le credenziali: token GitHub, chiavi SSH, config Kubernetes, Terraform, cloud provider, tutto.
- Controllate i log per accessi non autorizzati o attività anomale subito dopo l’installazione.
- Monitorate gli IOC pubblicati: domini come
npm-cache[.]com,pypi-get[.]com,js-mirror[.]com, user-agentBun/1.3.13, artefatti in/tmp/bun-dl-*enode_modules/keyv/Math_Symbol.js.
Prevalenza e impatto
Al momento della pubblicazione dell’analisi — aggiornata più volte nel corso della giornata del 4 agosto — Wiz aveva identificato oltre 400 pacchetti npm distinti colpiti dal worm. Il numero continua a crescere. La propagazione è stata rapida: dal primo commit malevolo alle 9:00 UTC, in poche ore centinaia di pacchetti downstream hanno ereditato il payload.
Alcuni pacchetti compromessi hanno milioni di download. Altri sono di nicchia ma usati in pipeline critiche. Il punto è che l’effetto leva del supply chain attack — soprattutto in un ecosistema denso come npm — è devastante.
Lezioni per i team di sicurezza
Questo attacco conferma alcune cose che sapevamo già, ma che continuiamo a ignorare:
Gli account dei maintainer sono single point of failure. MFA obbligatoria, chiavi hardware, review dei commit critici — non sono optional.
Il malware evolve velocemente. Shai-Hulud è passato da prototipo open source a variante con smart contract Ethereum e dead-man switch in poco tempo. Le difese devono evolvere altrettanto rapidamente.
La superficie d’attacco si è espansa. Non parliamo più solo di AWS o GCP: ora ci sono Alibaba Cloud, Tencent, secret di AI agent, wallet crypto, /etc/shadow. Se ha valore, è un target.
Il supply chain non è un problema futuro. È un problema adesso. Dependency allowlisting, verifica dell’integrità dei pacchetti, controlli di provenienza — devono diventare standard, non eccezioni.
Wiz continuerà ad aggiornare l’analisi man mano che emergono nuovi dettagli. Nel frattempo, se gestite infrastrutture che usano npm, è il momento di controllare i package.json e di incrociare le dita che keyv non fosse nelle dipendenze. Perché se lo era, è ora di rotare tutto.
