La prima nuova dipendenza in dieci anni

Il 20 agosto 2026, un aggressore che aveva compromesso un account di maintainer su crates.io, il registro ufficiale dei pacchetti Rust, ha usato quell'accesso per pubblicare versioni avvelenate di tre crate molto diffusi: arrayref, internment e append-only-vec. Arrayref da solo è presente in oltre il 35 per cento di tutti gli ambienti Rust e in circa tre ambienti su quattro in cui Rust compare, il che, però, lo rende una delle librerie piccole più onnipresenti di tutto l'ecosistema, pur restando quasi invisibile.

La versione malevola arrayref 0.3.10 portava con sé un dettaglio che da solo avrebbe dovuto essere già un campanello d'allarme: era la prima nuova dipendenza che arrayref avesse mai aggiunto in tutta la sua storia decennale. Che un crate rimasto senza dipendenze per un decennio ne acquisisca improvvisamente una è, però, esattamente il tipo di cambiamento che una revisione attenta delle dipendenze dovrebbe segnalare, sempre che qualcuno la stesse davvero facendo.

Uno script di build eseguito prima di qualsiasi codice

Ogni versione avvelenata aggiungeva una dipendenza verso un nuovo crate chiamato proc-macro1, cioè anch'esso malevolo. Proc-macro1 conteneva uno script di build, un piccolo programma che Cargo, lo strumento di build di Rust, esegue già automaticamente durante la compilazione di un progetto, prima ancora che il codice del progetto stesso finisca di essere costruito o venga eseguito.

Proprio questa esecuzione automatica ha reso l'attacco così silenzioso: uno sviluppatore o una pipeline CI non doveva eseguire il binario finale, cliccare su nulla né importare una funzione sospetta per essere compromesso. Bastava perciò lanciare cargo build su un progetto che dipendeva dal crate avvelenato per far scattare lo script di build e scaricare così il payload dell'aggressore.

Ritiro e spinta: un trucco preso in prestito da npm

L'aggressore ha però anche ritirato le vecchie versioni pulite di arrayref, dalla 0.3.5 alla 0.3.9, dal registro. Il ritiro non elimina del tutto una versione, ma fa comparire in Cargo il consueto avviso secondo cui un progetto dovrebbe considerare di aggiornare a una versione non ritirata.

Con ogni versione pulita segnata come ritirata, l'unica versione non ritirata che Cargo poteva ancora consigliare era già la malevola 0.3.10, spingendo così gli sviluppatori verso la versione avvelenata proprio attraverso gli strumenti del registro. I ricercatori di sicurezza avevano già segnalato questo identico schema di ritiro e spinta in precedenti attacchi alla catena di fornitura di npm, per cui la sua comparsa su crates.io suggerisce già lo stesso copione di ingegneria sociale tramite gli strumenti, non un'invenzione nuova.

Tre crate, tre finestre brevi

Tutte e tre le versioni malevole sono state pubblicate entro una finestra di 22 minuti nella mattina del 20 agosto 2026, e tutte e tre sono state rimosse entro circa 90-107 minuti dalla pubblicazione, non appena il Rust Security Response Team ha bloccato l'account compromesso e ritirato già i pacchetti.

CrateVersione malevolaPubblicato (UTC)Rimosso (UTC)Minuti online
arrayref0.3.1007:1508:4186
internment0.8.707:3409:0490
append-only-vec0.1.907:3709:25107

Una finestra di meno di due ore sembra breve, ma crates.io non prevede però alcun ritardo integrato tra la pubblicazione di una nuova versione e il momento in cui ogni progetto dipendente può scaricarla automaticamente alla build successiva, quindi anche una finestra corta basta perché uno script di build raggiunga già qualsiasi progetto che venga ricompilato in quel momento.

Furto di credenziali, un kill switch e un legame con la Corea del Nord

Wiz Research ha analizzato il payload e ha trovato una backdoor che comunica con un server remoto via HTTPS, elenca le credenziali salvate in Chrome, Brave ed Edge, installa una persistenza multipiattaforma ed è in grado di eseguire quattro comandi remoti distinti, tra cui un kill switch, cioè un comando di spegnimento, e un comando per eseguire script arbitrari.

Wiz ha inoltre scoperto che l'endpoint della backdoor condivide l'infrastruttura con la campagna Mastra, che Microsoft ha attribuito a Sapphire Sleet, un gruppo legato alla Corea del Nord, e con un precedente attacco al pacchetto npm axios che Google Cloud Threat Intelligence e Mandiant hanno collegato separatamente anch'esso alla Corea del Nord, il che suggerisce che lo stesso tipo di attore che aveva già compromesso npm abbia ora dimostrato già la stessa capacità contro crates.io. La scoperta è attribuita a Nextron Systems GmbH, una società tedesca di sicurezza; il Rust Security Response Team ha bloccato l'account e ritirato tutte e tre le versioni, e finora non è emersa alcuna prova confermata di sfruttamento reale.

Rust risolve i bug di memoria, non chi controlla l'account

Il Cyber Resilience Act dell'UE e la NIS2 spingono già da tempo i produttori di prodotti critici per la sicurezza e connessi verso linguaggi memory-safe, e Rust è stato uno dei principali beneficiari di questa spinta. Questo incidente ricorda, però, che migrare a Rust per motivi di conformità risolve un problema, i bug di sicurezza della memoria come i buffer overflow, senza toccarne uno del tutto diverso: chi controlla l'account che pubblica le dipendenze di un progetto, e cosa può eseguire uno script di build prima ancora che il codice del progetto stesso finisca di compilare.

I responsabili che hanno ordinato una migrazione a Rust per motivi di conformità dovrebbero fare tre domande concrete ai propri team di ingegneria: se gli aggiornamenti delle dipendenze vengono già revisionati prima del merge, se la pipeline CI può isolare o limitare ciò che uno script di build ha il permesso di fare, e se qualcuno si accorgerebbe davvero di un ritiro e ripubblicazione nello stesso giorno su un pacchetto di cui il team si fida già da anni. Vale la pena notare che la scoperta stessa è arrivata da Nextron Systems GmbH, una società tedesca, il che smentisce già qualsiasi idea che questo rischio nella catena di fornitura riguardi solo altri.