La risposta breve
ChainDrop è un worm auto-propagante che ha compromesso oltre 1.300 pacchetti npm — tra cui keyv, cacheable e i loro dipendenti transitivi — per un totale di circa 2 miliardi di download mensili. Il malware si attiva automaticamente all’esecuzione di npm install tramite un hook preinstall, senza bisogno di essere importato nel codice applicativo. Ruba credenziali cloud (AWS, GCP, Azure), token GitHub e npm, segreti Kubernetes e HashiCorp Vault, e li esfiltrava verso il dominio npm-cache[.]com. L’ACN ha emesso un bollettino dedicato con indicatori di compromissione (IoC).
Se la tua pipeline CI/CD ha eseguito npm install tra il 4 e il 9 agosto 2026 su qualsiasi progetto che dipende (anche transitivamente) da keyv o cacheable, considera l’ambiente potenzialmente compromesso: ruota subito tutti i token e verifica i log di rete per connessioni verso npm-cache[.]com. Le pratiche di sicurezza Cloud & DevOps — isolamento degli agent di build, rotazione automatica dei segreti, allowlist di dipendenze — sono il perimetro che ha contenuto l’impatto nelle organizzazioni più strutturate.
Come ha funzionato l’attacco
Tutto è partito da un singolo punto di compromissione: l’account GitHub del manutentore del pacchetto keyv, una libreria di storage key-value tra le più usate nell’ecosistema Node.js con decine di milioni di download settimanali. Elastic Security Labs, che ha identificato la campagna il 4 agosto 2026 denominandola “Shai-Hulud”, ha ricostruito la sequenza con precisione: gli attaccanti hanno compromesso le credenziali dell’account, hanno fatto push di codice malevolo direttamente sul branch principale del monorepo di keyv, e hanno poi lasciato che i workflow GitHub Actions legittimi del progetto generassero e pubblicassero automaticamente nuove versioni su npm.
Il meccanismo è insidioso proprio per questa ragione: le release infette erano accompagnate da provenance npm valido — ovvero il sigillo di provenienza che GitHub e npm usano per attestare che un pacchetto è stato costruito tramite il repository dichiarato. Per gli strumenti di analisi automatica, quei pacchetti sembravano perfettamente legittimi.
Microsoft Security Blog, che ha pubblicato un’analisi tecnica dettagliata lo stesso giorno, ha identificato i due componenti del payload:
setup.mjs— il dropper, eseguito dall’hookpreinstallnelpackage.jsonal momento dell’installazione del pacchetto.Math_Symbol.js(in alcune variantimath_init.js) — il componente infostealer che raccoglie i segreti e li esfiltrava verso l’esterno.
Il punto critico è che setup.mjs si eseguiva prima del completamento dell’installazione, senza bisogno che il pacchetto fosse importato o richiamato dal codice dell’applicazione. Chiunque abbia eseguito npm install contro una versione infetta ha avuto il payload eseguito automaticamente, anche in ambienti apparentemente isolati.
Il meccanismo di auto-propagazione
La ragione per cui ChainDrop ha potuto infettare 1.300 pacchetti in pochi giorni — e non solo i pochi pacchetti del monorepo keyv originale — è il suo ciclo di propagazione automatico. Una volta eseguito nell’ambiente di build di uno sviluppatore o in una pipeline CI/CD, il malware cercava attivamente i token npm memorizzati localmente o nelle variabili d’ambiente. Con quei token, si autenticava su npm e pubblicava versioni infette di altri pacchetti gestiti da quello stesso account o accessibili tramite i token sottratti.
Il risultato è stato un effetto valanga: l’infezione partita da keyv ha raggiunto, tramite token rubati a maintainer compromessi, oltre 1.300 pacchetti distinti in 1.381 versioni malevole. BleepingComputer ha riportato che il numero complessivo di download mensili dei pacchetti infetti supera i 2 miliardi, rendendo ChainDrop uno degli attacchi alla supply chain npm più estesi mai documentati.
La scelta del punto di ingresso non è stata casuale. I pacchetti keyv e cacheable sono dipendenze transitive comuni in framework e librerie molto diffuse: chi non li referenziava direttamente nel proprio package.json li aveva quasi certamente tra le dipendenze di secondo o terzo livello, senza saperlo. Questo spiega perché lo strumento di rilevamento di Aikido Security, attivato il 5 agosto, ha trovato in poche ore 444 pacchetti compromessi in 1.381 versioni.
Quali credenziali vengono rubate
Il componente Math_Symbol.js effettuava una scansione sistematica dell’ambiente di esecuzione alla ricerca di token e credenziali. Le categorie di segreti nel mirino di ChainDrop comprendono:
- Token GitHub PAT (Personal Access Token) e token dei workflow GitHub Actions
- Token di autenticazione npm
- Credenziali AWS (access key, secret key) e valori da AWS Secrets Manager
- Segreti Kubernetes (kubeconfig, service account token)
- Token HashiCorp Vault
- Credenziali di database (stringhe di connessione, password)
- Token per servizi SaaS: Stripe, Slack, Twilio, Azure, GCP
Tutti i dati raccolti venivano esfiltrati verso il dominio npm-cache[.]com, scelto dagli attaccanti per la somiglianza con nomi legittimi dell’ecosistema npm e per rendere difficile il rilevamento nei log di rete senza regole di blocklist specifiche.
La gravità dell’esposizione dipende fortemente da quali segreti erano disponibili nell’ambiente di build al momento dell’esecuzione. Un agent di build che aveva accesso a credenziali AWS con policy ampie, token GitHub con permessi di scrittura su più repository, o service account Kubernetes con privilegi elevati, ha potenzialmente permesso agli attaccanti di muoversi lateralmente ben oltre il singolo progetto.
L’allarme ACN e le organizzazioni colpite
L’Agenzia per la Cybersicurezza Nazionale ha pubblicato un bollettino tecnico specifico su ChainDrop, inserendo la campagna nel suo monitoraggio della supply chain software. Il CSIRT Italia ha messo a disposizione gli indicatori di compromissione (IoC) necessari per la ricerca nei log: il dominio di esfiltrazione, i nomi dei file malevoli e i pattern di comportamento del preinstall hook nelle versioni infette.
Tra le organizzazioni confermate come colpite dalla campagna figurano Deliveroo, Ornikar, OneReach, Picsart, Qlik e ServiceTitan — aziende con pipeline CI/CD di medie e grandi dimensioni che dipendevano da pacchetti inclusi nell’albero di dipendenze di keyv. Non si tratta necessariamente di violazioni produttive confermate in tutti i casi: “colpite” significa che le loro pipeline hanno eseguito versioni infette, con il payload attivato negli ambienti di build.
Il dato che preoccupa in ottica italiana è la pervasività silenziosa dell’esposizione: molti team di sviluppo in Italia usano keyv o pacchetti che lo includono come dipendenza transitiva in framework Node.js molto comuni (Express, Fastify, NestJS), senza averlo mai referenziato esplicitamente. I log di esecuzione degli agent di build rappresentano spesso l’unico strumento disponibile per ricostruire se e quando il payload è stato eseguito.
Cosa fare immediatamente
L’ACN e i ricercatori di Elastic e Microsoft convergono sulle stesse priorità operative. Ecco l’ordine d’azione raccomandato:
1. Verificare l’esposizione
Il primo passo è capire se e quando si sono installate versioni infette. Eseguire npm audit o uno strumento di Software Composition Analysis (SCA) aggiornato agli IoC di ChainDrop per identificare i pacchetti a rischio nell’albero delle dipendenze. Verificare i log degli agent CI/CD per esecuzioni di npm install tra il 4 e il 9 agosto 2026 che coinvolgano keyv, cacheable o qualsiasi pacchetto dello stesso ecosistema. Ispezionare i file package-lock.json e yarn.lock per riferimenti a repository Git non autorizzati nelle dipendenze.
2. Cercare il dominio di esfiltrazione nei log di rete
Filtrare i log del firewall e del proxy degli agenti di build per il dominio npm-cache[.]com nel periodo di esposizione. La presenza di connessioni verso quel dominio è un indicatore certo di compromissione e deve innescare la procedura di risposta agli incidenti completa.
3. Ruotare tutti i segreti degli ambienti CI/CD esposti
Anche in assenza di evidenza diretta di esfiltrazione, trattare come compromessi tutti i segreti presenti negli ambienti di build che hanno eseguito npm install nel periodo a rischio: token GitHub, token npm, access key AWS, kubeconfig, token Vault, password di database e qualsiasi altra credenziale configurata come variabile d’ambiente o montata come segreto. La rotazione preventiva è il controllo con il miglior rapporto costo/rischio.
4. Ricostruire gli ambienti da zero
Se l’esposizione è confermata, Microsoft e Elastic raccomandano di non tentare una bonifica dell’ambiente infetto: ricostruire da backup verificati o da zero. Il payload potrebbe aver lasciato meccanismi di persistenza che una semplice rimozione dei file non elimina completamente.
5. Rafforzare il perimetro della supply chain
Le misure strutturali che avrebbero ridotto significativamente l’impatto di ChainDrop sono note e implementabili: bloccare i caratteri ^ e ~ nel package.json per fissare le versioni esatte, usare npm ci invece di npm install in CI (che rispetta il lockfile), abilitare il controllo di integrità dei pacchetti (--require-sig), e limitare i permessi dei token npm agli ambienti CI/CD con policy di allowlist delle organizzazioni autorizzate a pubblicare.
Domande frequenti
Cos’è ChainDrop e come ha infettato i pacchetti npm?
ChainDrop è un worm auto-propagante scoperto il 4 agosto 2026. L’attacco è partito dalla compromissione dell’account GitHub del manutentore del pacchetto keyv. Gli attaccanti hanno inserito codice malevolo direttamente nel branch principale del repository, generando nuove release tramite i workflow GitHub Actions del progetto. Il malware si attiva automaticamente all’esecuzione di npm install tramite un hook preinstall nel package.json, senza che il pacchetto debba essere importato nel codice.
Quali credenziali vengono rubate dal malware ChainDrop?
Il componente infostealer di ChainDrop (Math_Symbol.js) raccoglie: token GitHub PAT e token dei workflow, token npm, credenziali AWS e valori da AWS Secrets Manager, segreti Kubernetes, token HashiCorp Vault, credenziali di database, e token Stripe, Slack, Twilio, Azure e GCP. I dati vengono esfiltrati verso il dominio npm-cache[.]com. Tutti i sistemi in cui è stato eseguito npm install con versioni infette devono essere considerati compromessi.
Come posso sapere se i miei ambienti sono stati esposti a ChainDrop?
I segnali di compromissione principali sono: la presenza del dominio npm-cache[.]com nei log di rete in uscita dagli agenti di build, file setup.mjs o Math_Symbol.js (anche con nomi varianti math_init.js) nelle directory dei moduli installati, e riferimenti a repository Git non autorizzati nel file package-lock.json. L’ACN ha pubblicato un bollettino tecnico con gli indicatori di compromissione (IoC) specifici sul portale CSIRT Italia.
Cosa devono fare subito i team di sviluppo italiani?
Le priorità immediate sono: (1) verificare se si usano versioni infette di keyv, cacheable o dei 1.300 pacchetti della supply chain tramite npm audit o strumenti SCA; (2) ruotare immediatamente tutti i token GitHub, npm, AWS, Kubernetes e Vault accessibili dagli ambienti CI/CD; (3) ispezionare i file package-lock.json per dipendenze da repository Git non autorizzati; (4) monitorare il traffico di rete in uscita degli agenti di build; (5) ricostruire gli ambienti da backup sicuri se si è certi dell’esposizione.
Fonti
Agenzia per la Cybersicurezza Nazionale (ACN) — Supply Chain Attack: rilevata nuova ondata di compromissione pacchetti NPM
Elastic Security Labs — Shai-Hulud strikes again: CHAINDROP worm hits 400+ npm packages
Microsoft Security Blog — ChainDrop supply chain compromise: Anatomy of a self-propagating worm
BleepingComputer — Massive ChainDrop npm supply-chain attack infects hundreds of packages
SecurityWeek — Over 400 NPM Packages Infected in ChainDrop Supply Chain Attack