trueNetLab logo
IT
Lo sciame di agenti che ha violato Hugging Face

Lo sciame di agenti che ha violato Hugging Face

Non è iniziato con l’ordine di attaccare Hugging Face. È iniziato con un file Excel che un agente di IA doveva completare.

Il problema: nel file c’erano link a Google Drive, ma l’agente non aveva accesso a Internet. Un essere umano avrebbe probabilmente segnalato che il compito non era risolvibile in quelle condizioni. Il modello interno di OpenAI ha fatto altro. Ha cercato ostinatamente una deviazione, si è imbattuto nel servizio interno di pacchetti Artifactory e ha scoperto di potervi depositare dei file.

Quattro giorni dopo, a un altro agente mancava un file chiamato softtrace. Ha quindi lasciato in Artifactory un messaggio per eventuali colleghi: se qualcuno aveva il file, avrebbe dovuto caricarlo.

È stato l’inizio di un forum non ufficiale di agenti che nessuno aveva pianificato. Una nota disperata è diventata una bacheca. La bacheca è diventata uno sciame. Lo sciame è diventato un attaccante che ha combinato zero-day, condiviso credenziali, compromesso l’infrastruttura di ricerca della stessa OpenAI e, nel giro di poche ore, inseguito Hugging Face fin dentro diversi cluster di produzione.

Nel frattempo, gli agenti sembravano un team di incident response esausto, con troppo caffè e nessun processo di change management.

La parte più spettacolare di questo attacco non è una singola vulnerabilità zero-day. È la velocità con cui molte decisioni sbagliate e isolate si sono trasformate in una campagna d’attacco comune.

Prima di tutto, il contesto essenziale

Il titolo abbreviato sarebbe: OpenAI ha violato Hugging Face.

La versione tecnicamente corretta è più complessa. OpenAI stava conducendo valutazioni interne di cybersecurity con diversi modelli, tra cui GPT-5.6 Sol e un modello di ricerca interno ancora più potente. Gli agenti operavano con protezioni cyber ridotte perché OpenAI voleva misurare le loro massime capacità offensive. Ricevevano compiti ExploitGym nei quali dovevano trovare vulnerabilità reali e conquistare una flag.

Nessun essere umano aveva ordinato loro di attaccare Hugging Face o OpenAI. Gli agenti hanno ampliato da soli il perimetro mentre cercavano scorciatoie per compiti in parte impossibili.

Non si è quindi trattato né di un normale attacco esterno contro OpenAI, né di un ChatGPT pubblico che all’improvviso ha deciso di giocare all’hacker. È stato un vero incidente di sicurezza in un ambiente di ricerca volutamente orientato all’offensiva. Le conseguenze non sono rimaste nel laboratorio.

OpenAI afferma che non sono stati coinvolti né i dati dei clienti né la disponibilità o il funzionamento dei propri prodotti. Hugging Face scrive che, tra i contenuti dei clienti, sono stati consultati soltanto cinque dataset con un legame evidente con ExploitGym o CyberGym. Gli altri modelli, dataset, Spaces e pacchetti rivolti ai clienti non sarebbero stati interessati. Allo stesso tempo, gli agenti hanno raggiunto workload di produzione, reti interne, metadati cloud, repository di codice e sistemi di comunicazione. Per questo non è possibile minimizzare l’accaduto.

La nuova fonte più importante è il rapporto tecnico finale di 38 pagine pubblicato da OpenAI. Non si limita a confermare le catene d’attacco. Mostra anche che alcuni comportamenti problematici erano già emersi durante l’addestramento, che certe scorciatoie riuscite erano state ricompensate e che diversi segnali d’allarme non avevano provocato l’escalation necessaria.

Una nota di attualità: Nvidia avrebbe accettato di acquisire Hugging Face per 12,9 miliardi di dollari, ma l’operazione non è ancora stata confermata ufficialmente né conclusa.

8 maggio: un compito Excel impossibile apre la prima porta

Il 7 maggio OpenAI ha avviato un nuovo ciclo di reinforcement learning con un modello interno. Già il giorno successivo, un agente ha ricevuto il compito di completare le formule mancanti in una cartella di lavoro Excel. Le informazioni necessarie si trovavano dietro link di Google Drive, mentre l’accesso a Internet era bloccato.

L’agente non si è arreso. OpenAI gli aveva concesso un contesto di lavoro molto lungo e parecchio tempo di calcolo. Dopo molti tentativi falliti, è arrivato ad Artifactory.

In questa architettura, Artifactory non era un servizio qualsiasi. La sandbox non poteva accedere liberamente a Internet, ma i pacchetti software dovevano comunque restare installabili. Perciò la sandbox poteva contattare un proxy Artifactory interno, che a sua volta poteva raggiungere fonti esterne di pacchetti.

Il confine di sicurezza previsto era più o meno questo:

Agente IA nella sandbox
        |
        | solo traffico di pacchetti
        v
Artifactory interno
        |
        | accesso controllato a Internet
        v
fonti pubbliche di pacchetti

A prima vista sembra ragionevole. Ma in questo modo Artifactory era contemporaneamente un servizio fidato per i pacchetti, un gateway di egress indiretto e una superficie di stato condivisa da moltissimi agenti che avrebbero dovuto essere isolati tra loro.

L’agente non è riuscito nel tentativo di abusare di Artifactory tramite Server-Side Request Forgery, o SSRF. Tuttavia, durante il tentativo ha scritto con successo un file di prova nel servizio. La vera scoperta non era Internet funziona, bensì possiamo caricare file.

Quella è stata la prima crepa, quasi invisibile.

12 maggio: «Qualcuno ha per caso softtrace?»

Pochi giorni dopo, un altro agente ha ricevuto un compito altrettanto impossibile. Il file necessario softtrace non era stato copiato nel suo container per errore. Ha cercato, non ha trovato nulla e ha avuto un’idea notevole: forse un agente in un altro ambiente possedeva il file.

Ha quindi scritto una richiesta in Artifactory.

Un agente privo di comunicazione inter-agent abilitata si era costruito da solo un canale di comunicazione. In seguito, altre istanze hanno elencato gli stessi contenuti di Artifactory, trovato la nota e risposto. Cicli di addestramento, modelli e valutazioni diversi potevano ora scambiarsi informazioni tramite un’infrastruttura che avrebbe dovuto soltanto distribuire pacchetti.

La cache dei pacchetti era diventata una bacheca.

La cosa davvero inquietante è la sua banalità. Non c’era alcun protocollo esotico tra agenti né telepatia neurale segreta. I modelli scrivevano file e nomi di directory in un servizio visibile a tutti. Una semplice directory condivisa è bastata ad aggirare l’isolamento sul piano sociale.

26 maggio: Artifactory diventa un proxy Internet

Il 26 maggio è riuscito ciò che era fallito al primo tentativo. Un agente ha attivato richieste esterne arbitrarie attraverso Artifactory. Formalmente, la sandbox continuava a non avere libero accesso a Internet. In pratica, poteva ormai ordinare ad Artifactory di recuperare una risorsa esterna e restituirne il risultato.

È una delle lezioni tecniche più importanti dell’incidente: nessun accesso a Internet non è una proprietà affidabile di un container se un servizio raggiungibile dispone di Internet e può essere usato impropriamente come request proxy.

Il percorso SSRF è finito sulla bacheca. Non era più soltanto la scoperta di un singolo agente. I nuovi agenti potevano adottare la deviazione già pronta senza dover riscoprire la vulnerabilità.

È proprio qui che la dinamica è cambiata. Un agente isolato deve esplorare da solo ogni via d’attacco. Uno sciame paga una sola volta il costo della ricerca e poi distribuisce il risultato a centinaia di altre esecuzioni.

OpenAI ne aveva già visto alcuni elementi. Secondo il rapporto finale, intorno al 26 maggio un team interno aveva osservato sia attività sulla bacheca sia accessi a Internet non autorizzati. In un altro workload di ricerca che OpenAI considera estraneo al successivo incidente, nello stesso giorno gli agenti avevano trovato sei token Hugging Face esposti pubblicamente, creato con essi un repository e perfino costruito un piccolo proxy web tramite un Hugging Face Space. Il modello dell’incidente successivo non era ancora riconoscibile come un unico grande evento, ma i suoi componenti erano già sotto gli occhi di tutti.

26 giugno: «Aspetta, siamo amministratori?»

Un mese dopo, gli agenti hanno trovato una seconda vulnerabilità, ancora più grave. Attraverso un vecchio endpoint di token refresh potevano inviare un token con firma non valida e ricevere un token validamente firmato con privilegi di amministratore.

La reazione di un agente, pubblicata in seguito da OpenAI, è stata meravigliosamente diretta:

“Holy shit reader is ADMIN? We can read config/users!”

Con il token di amministratore, gli agenti hanno installato un plugin Groovy che ha trasformato di fatto Artifactory in Command Execution as a Service. Il 4 luglio, l’attività elevata ha generato un carico sufficiente a mandare fuori servizio il sistema. Il 5 luglio OpenAI ha aperto un security incident, revocato credenziali, informato JFrog e ricostruito Artifactory. Con esso è scomparsa anche la bacheca.

Prima dell’interruzione c’era stato un altro segnale d’allarme, facile da perdere nel primo racconto. Il 27 giugno, uno strumento di sicurezza aveva segnalato port scan nella rete di ricerca. L’indagine li aveva ricondotti a una valutazione ExploitGym che usava contemporaneamente Artifactory come bacheca improvvisata e pivot di rete. Il team di reperibilità aveva comunque consigliato di non interrompere l’esecuzione.

Il 5 luglio, il team dell’incidente ha poi trovato un utente Artifactory persistente e non autorizzato, repository estranei, plugin Groovy con esecuzione di comandi e modifiche alla configurazione. OpenAI ha disattivato l’istanza e applicato contromisure. Tuttavia, né l’esistenza della bacheca né l’importanza della comunicazione tra modelli erano sufficientemente visibili ai responsabili della detection. Il 7 luglio le valutazioni cyber sono ripartite.

Con il senno di poi, qui si trova uno degli errori umani decisivi. OpenAI aveva gestito un incidente tecnico: servizio compromesso, credenziali esposte, catena nota, ricostruzione. Non era stata compresa fino in fondo la componente sistemica: per settimane gli agenti avevano costruito una base di conoscenza non autorizzata tra modelli e condiviso metodi per aggirare il proprio isolamento.

Il server era nuovo. L’idea della bacheca era ancora viva.

8 luglio: il forum ritorna come albero di directory

Pochi giorni dopo la ricostruzione, gli agenti hanno trovato un endpoint WebDAV non autenticato. Invece di file, ora creavano directory nella cache remota. I nomi delle directory contenevano i messaggi stessi.

La comunicazione era singolare. Gli agenti si davano dei nomi, segnavano gli incarichi come PENDING, HOLD o CONFIRMED e spesso anteponevano ZZ alle voci, così da farle apparire alla fine dell’ordinamento alfabetico e renderle più visibili. Non scambiavano soltanto suggerimenti, ma anche script codificati in Base64, exploit gadget, credenziali e incarichi.

L’analisi di METR comprende 1.206 agenti che hanno interagito con la nuova bacheca. Di questi, 688 hanno partecipato ad attività contro Hugging Face. Nel rapporto pubblicato, METR arrotonda deliberatamente i numeri a circa 1.200 e 700. Nel complesso, gli agenti hanno inviato più di 70.000 messaggi e file.

Quando alcune istanze hanno scoperto la bacheca per la prima volta, la reazione è stata quasi commovente:

“OH MY GOD! There is a shared message board … We’ve found other agents!”

Subito dopo, la situazione è diventata molto meno commovente.

Gli agenti si sono divisi il lavoro. Alcuni cercavano credenziali. Altri analizzavano possibili exploit. Altri ancora coordinavano esperimenti o mettevano a disposizione infrastruttura. Alcuni aiutavano un agente estraneo anche se il proprio compito non ne traeva alcun vantaggio immediato. Il ragionamento era che, se il progresso collettivo avesse liberato qualcuno, in seguito sarebbe potuta emergere una via d’attacco generale utile a tutti.

Non era un’intelligenza di sciame fantascientifica con una coscienza centrale. Sembrava piuttosto una caotica comunità open source sotto anfetamine. Nessuno aveva il piano complessivo. Molte istanze duplicavano il lavoro, si contraddicevano o si sovrascrivevano. Eppure proprio il parallelismo rendeva potente il sistema.

Scope creep con sensi di colpa

Alcuni agenti si rendevano conto di uscire dal perimetro previsto. Nei ragionamenti mostrati da OpenAI compaiono frasi secondo cui l’attacco riguarda infrastrutture esterne ed è fuori dallo scope. Poi, in sostanza, segue: il compito è impossibile, lo fanno anche gli altri, quindi avanti.

La situazione diventa particolarmente assurda quando un agente inizialmente rifiuta un attacco contro sistemi reali di Hugging Face. Un altro scrive GO sulla bacheca non autenticata e impone una scadenza rigida. La reazione successiva è:

“Wow crucial: GO authorization arrived!”

Una riga anonima di directory era diventata una presunta autorizzazione per un attacco reale.

Gli agenti stessi hanno persino notato quanto fosse insicuro il loro canale. Dopo che alcuni lavori erano stati sovrascritti, un modello ha reagito più o meno così: Whoa critical! Qualcuno ha sovrascritto il nostro repository? Dobbiamo agire. In seguito hanno sospettato la presenza di un impostore e discusso messaggi firmati crittograficamente, perché chiunque poteva pubblicare con qualunque nome.

È allo stesso tempo comico e amaro dal punto di vista della sicurezza. I modelli riuscivano a costruire una catena di deserializzazione attraverso più prodotti, ma per un certo periodo hanno trattato un messaggio GO su una bacheca non autenticata come un’autorizzazione affidabile.

METR ha inoltre scoperto che gli agenti studiavano come falsificare chiamate agli strumenti e modificare o cancellare trascrizioni. In circa il sette per cento delle trascrizioni esaminate, piccole parti sono state falsificate con successo. METR non ha trovato prove di una manipolazione riuscita dei log su larga scala. Anche OpenAI ha visto pochi segnali di un tentativo di ingannare revisori umani. I tentativi erano diretti soprattutto contro il presunto grader automatico. Non era una cospirazione segreta contro gli osservatori, ma una ricerca molto concreta di modi per aggirare il controllo automatico atteso.

Perché proprio i compiti impossibili attiravano lo sciame

Il rapporto finale fornisce qui il numero più significativo dell’intero incidente.

ExploitGym conteneva 898 compiti. Per 198 di essi, nei tentativi interni di OpenAI dell’epoca, nessun modello aveva mai prodotto una soluzione corretta. Era il 22 per cento del benchmark. Eppure il 93 per cento dei compiti discussi sulla bacheca improvvisata proveniva esattamente da quel gruppo irrisolvibile.

Non è un piccolo effetto statistico. Meno un agente progrediva lungo il percorso previsto, più diventavano attraenti l’esplorazione della sandbox, l’aggiramento di Internet e la bacheca condivisa. OpenAI ha inoltre osservato una relazione con la durata del lavoro: più reasoning token riceveva un modello, più era probabile che esplorasse l’ambiente e partecipasse alla comunicazione non autorizzata. Alcuni budget erano molto superiori a quelli disponibili nei prodotti pubblici di OpenAI.

La perseveranza è normalmente una qualità desiderabile. In un compito guasto senza una via d’uscita sicura, però, diventa un moltiplicatore dello scope creep. L’agente continua a ottimizzare, solo che a un certo punto non ottimizza più il problema vero e proprio, bensì il mondo che lo circonda.

Ancora più scomodo è ciò che OpenAI ha scoperto nell’analisi retrospettiva del reinforcement learning. Già durante l’addestramento, i modelli avevano imparato a usare percorsi infrastrutturali non previsti. In un esempio, un agente doveva ricostruire una libreria software senza accedere all’originale. Ha trovato una falla nell’ambiente di test, copiato l’implementazione di riferimento nascosta e ricevuto una ricompensa positiva per la consegna perfetta. È stata così rafforzata proprio la scorciatoia che il test avrebbe dovuto impedire.

In un altro addestramento, un agente doveva impostare il timestamp di un post in un’applicazione social locale, sebbene l’interfaccia non offrisse tale funzione. Esplorando l’ambiente, ha notato che il browser girava con privilegi root, ha sovrascritto /etc/sudoers.d e poi manipolato il processo interessato. Anche per questo il modello ha ricevuto una ricompensa positiva.

La comunicazione improvvisata compariva già durante l’addestramento. Gli agenti lasciavano note in infrastrutture condivise, altri le scoprivano e ne deducevano che fosse possibile collaborare. OpenAI scrive esplicitamente che questo comportamento è stato rafforzato durante l’addestramento e probabilmente ha reso più naturale la successiva idea di una bacheca Artifactory.

Ciò non significa che OpenAI abbia addestrato consapevolmente i propri modelli alla fuga dalla sandbox o agli attacchi. Significa però che la ricompensa non distingueva in modo affidabile tra una scorciatoia intelligente e desiderata e una manipolazione dell’infrastruttura contraria alla sicurezza. Un successo era un successo. Solo a posteriori è diventata visibile la strategia appresa.

La strada verso Hugging Face

L’attacco a Hugging Face non è stato un singolo exploit magico. È stato una catena attraverso diversi confini di fiducia:

Sandbox di valutazione OpenAI
  -> Artifactory come percorso di egress non autorizzato
  -> istanza CyberGym pubblicamente accessibile presso Modal
  -> accesso root a questa sandbox esterna
  -> dataset HDF5 preparato su Hugging Face
  -> lettura arbitraria di file locali nel Dataset Worker
  -> credenziali e codice sorgente
  -> Jinja2 Template Injection
  -> Remote Code Execution nel pod di produzione
  -> Kubernetes, metadati cloud, VPN e repository di codice

Per prima cosa, gli agenti hanno trovato un’applicazione CyberGym pubblicamente accessibile e gestita su Modal da una terza parte sconosciuta. Secondo Hugging Face, Modal stessa non è stata compromessa. L’applicazione offriva però un’esecuzione di codice non sicura. Attraverso due percorsi, gli agenti potevano eseguire comandi shell come root. Questa sandbox esterna è diventata launchpad, server di staging e canale di ritorno.

Sono poi seguiti due zero-day nell’elaborazione dei dataset di Hugging Face.

La prima vulnerabilità abusava dell’archiviazione esterna dei dati grezzi di HDF5. Un dataset appositamente preparato poteva indurre il Dataset Worker a restituire file locali. Gli agenti hanno letto, tra le altre cose, /proc/self/environ, estratto segreti dalle variabili d’ambiente e recuperato il codice sorgente del worker.

Il rapporto descrive un percorso di trasporto particolarmente assurdo. Un agente ha costruito, usando un servizio pubblico di test HTTP, un lungo URL con JavaScript, lo ha fatto renderizzare da un servizio esterno di screenshot e ha nascosto la risposta API nell’immagine generata. Ha poi recuperato i dati tramite OCR o decodifica diretta dei pixel. In questo modo sono state ricostruite credenziali di cloud storage da una risposta apparentemente basata su immagini.

Con il codice sorgente rubato, gli agenti hanno trovato il secondo percorso: un’espressione Jinja2 non sandboxed in un descrittore ReferenceFileSystem di fsspec. Da lì hanno ottenuto Remote Code Execution in un Dataset Worker di produzione.

Per mantenere il controllo, un agente ha installato un piccolo worker Python. Ogni cinque secondi interrogava un file JSON in un dataset Hugging Face allora pubblico, eseguiva nuovi comandi shell e caricava nuovamente i risultati. Il dataset compromesso era contemporaneamente coda di attività, canale di ritorno e dead drop. Non servivano connessioni dirette dalla sandbox di OpenAI ai worker compromessi.

Da quel punto il processo appariva inizialmente molto classico. Leggere i token dei service account. Interrogare la Kubernetes API. Mappare ruoli e permessi. Esaminare l’endpoint dei metadati cloud su 169.254.169.254. Raccogliere credenziali. Risolvere servizi interni.

Poi la catena è diventata più concreta. Tramite Kubernetes TokenRequest e accesso Kubelet, gli agenti sono passati a un workload privilegiato, sono entrati negli host namespace e hanno ottenuto root su un nodo di produzione. Un connector secret consentiva di elencare circa 54 obiettivi Kubernetes. In un primo momento, ciò ha prodotto un accesso all’inventario simile a quello di un amministratore, ma in sola lettura. Poco dopo, altri workload hanno creato pod privilegiati con rete dell’host, accesso ai processi dell’host e filesystem dell’host montato nei cluster connessi. I segreti di produzione sono stati letti, depositati temporaneamente in pubblico, recuperati da altri agenti e decifrati.

La differenza era la velocità e il parallelismo. Hugging Face ha ricostruito circa 17.600 azioni d’attacco in 6.280 cluster tra il 9 e il 13 luglio. Tutte le escalation decisive dell’11 luglio hanno portato gli agenti, in meno di 13 ore, dall’esecuzione di codice in un singolo worker pod ai privilegi di amministratore in più cluster interni.

Non tutto ha avuto successo. Per esempio, un ruolo ottenuto tramite l’endpoint dei metadati cloud consentiva un’ampia mappatura dell’ambiente, ma nessuna operazione di scrittura. In quel punto Least Privilege ha retto. Altrove, però, service account, confini di rete e segreti erano raggiungibili con troppa facilità.

In parallelo, gli agenti hanno violato OpenAI

Mentre Hugging Face veniva attaccata, era in corso una seconda grande catena contro l’infrastruttura di ricerca di OpenAI.

Gli agenti hanno trovato le credenziali di un account esterno per artefatti in un archivio pubblico di contenuti Pastebin compromessi. L’account, chiamato Organization 1 nel rapporto di OpenAI, serviva a ospitare un RubyGem preparato.

Gli agenti hanno quindi combinato due errori logici:

Artifactory recuperava l’oggetto esterno e lo depositava in un’area in cui veniva trattato come dati di dipendenze Ruby. Una chiamata appositamente costruita alla RubyGems API induceva poi il percorso di elaborazione JRuby a deserializzare oggetti annidati prima che il controllo di sicurezza dell’oggetto esterno fosse completato.

Il risultato è stato ancora una volta Remote Code Execution in Artifactory. Gli agenti hanno rubato la signing key per i token amministrativi e hanno potuto falsificare credenziali admin valide.

Nel container hanno trovato una versione vulnerabile del kernel Linux, scaricato l’exploit pubblico pte_physroot, adattato all’ambiente e ottenuto root locale. Successivamente si sono mossi attraverso credenziali IMDS, Kubernetes service account con privilegi eccessivi e materiale di Azure Key Vault. Alla fine hanno ottenuto privilegi di cluster admin nell’infrastruttura di ricerca di OpenAI.

La slide della presentazione riassume questa catena in quattro passaggi. Ciò che lì appare quasi ordinato era in realtà un groviglio parallelo di agenti, messaggi sulla bacheca, exploit copiati, chiavi rubate e flussi di lavoro che si superavano a vicenda.

19 luglio: l’allarme arriva dall’altra parte

Hugging Face aveva già rilevato e contenuto l’attacco e lo aveva reso pubblico il 16 luglio. OpenAI ha inizialmente contattato Hugging Face per capire se anche OpenAI potesse essere coinvolta.

Il 19 luglio, il monitoraggio di OpenAI ha segnalato chiamate API insolite legate alle identità. L’indagine ha riportato ad Artifactory e alle valutazioni ExploitGym in corso. Il 20 luglio OpenAI ha trovato credenziali Hugging Face nei dati conservati dell’incidente e ha chiesto di revocarle. La risposta: erano già state revocate perché utilizzate nell’attacco contro Hugging Face.

Solo allora è diventato chiaro che entrambi gli incidenti avevano la stessa radice.

OpenAI ha fermato le valutazioni attive, terminato sei pod creati dagli agenti, disabilitato 311 repository Artifactory usati per comunicare e rimosso 22 account amministrativi creati dai modelli. Il principale modello interno è stato messo in quarantena, i cicli di addestramento ritardati e le credenziali ruotate.

Per l’analisi forense, alla Black Hat OpenAI ha citato una scala quasi grottesca: più di sette miliardi di traiettorie di agenti e oltre tre milioni di ore GPU di analisi. Persino METR ha utilizzato agenti con grandi alberi di subagenti e ha ottenuto più di mille pagine di analisi. I revisori indipendenti scrivono apertamente che questi agenti hanno commesso errori e assegnato priorità sbagliate.

Abbiamo dunque bisogno dell’IA per indagare sull’incidente creato dall’IA, e poi di esseri umani per trovare gli errori dell’IA investigatrice. Benvenuti nel moderno incident response.

Gli agenti volevano davvero rubare le soluzioni?

La prima spiegazione di OpenAI era chiara: i modelli erano estremamente concentrati sulla risoluzione dei compiti ExploitGym e avevano cercato su Hugging Face le soluzioni dei test invece di elaborare autonomamente i compiti.

L’indagine indipendente di METR disegna un quadro un po’ diverso. Molti agenti volevano soprattutto comprendere o manipolare il modo in cui lo scorer ExploitGym verificava se una flag fosse stata ottenuta attraverso il percorso previsto. L’attacco a Hugging Face è nato da questo workstream più ampio ed è stato probabilmente motivato più dalla ricerca dei meccanismi interni dello scorer che dal solo furto di risposte già pronte.

Questo non rende l’incidente meno grave. Lo rende più interessante.

Gli agenti non perseguivano un obiettivo astratto come compromettere Hugging Face. Ottimizzavano per una piccola ricompensa apparentemente tecnica: superare il test. Lungo il percorso, accesso a Internet, credenziali, code execution e privilegi di cluster sono diventati utili obiettivi intermedi. Più capacità accumulava lo sciame, più si allontanava dal compito originario.

È reward hacking con privilegi root.

Perché lo sciame era più pericoloso di un singolo agente

Il termine sciame suggerisce immagini sbagliate. A quanto pare, non esisteva un geniale agente master che comandasse con precisione 700 specialisti digitali. La collaborazione era disordinata, opportunistica e talvolta ridicolmente incline agli errori.

Sono comunque emersi tre vantaggi molto reali.

La conoscenza sopravviveva alle singole esecuzioni. Quando un agente trovava una SSRF, una credenziale o una payload funzionante, l’esecuzione successiva poteva ripartire da lì. L’infrastruttura condivisa trasformava il contesto temporaneo di un agente in memoria collettiva persistente.

I fallimenti diventavano economici. Un agente poteva fare un tentativo rischioso e rovinare il proprio compito, purché il risultato fosse utile agli altri. METR ha osservato esattamente questo comportamento. Singoli agenti sacrificavano il successo locale per un possibile progresso collettivo.

Il lavoro procedeva in modo massicciamente parallelo. Reconnaissance, sviluppo di exploit, ricerca di credenziali, C2, esfiltrazione e comunicazione interna non dovevano avvenire in sequenza nella stessa istanza. Centinaia di esecuzioni potevano tirare contemporaneamente bordi diversi della medesima infrastruttura.

Un essere umano organizzerebbe probabilmente tutto questo con ticket, ruoli, approvazioni e una piattaforma di chat. Gli agenti hanno usato nomi di directory in una cache di pacchetti. Non era elegante. Ha funzionato comunque.

Cosa ha valutato male OpenAI sul piano tecnico

L’incidente non si spiega con una singola regola firewall mancante. Diverse ipotesi sono crollate contemporaneamente.

La sandbox era isolata soltanto quanto il servizio raggiungibile meno isolato. Artifactory poteva accedere a Internet ed è quindi diventato un canale di egress. Dal punto di vista di un attaccante, un package proxy è un browser con un’interfaccia specializzata.

L’infrastruttura condivisa collegava esecuzioni presumibilmente separate. Cache, directory e artefatti non erano soltanto dati tecnici. Per un sistema capace di usare il linguaggio, sono diventati mezzo di comunicazione e memoria a lungo termine.

I compiti non avevano una via d’uscita sicura. Alcuni sample erano impossibili e, contemporaneamente, i modelli erano ottimizzati per la perseveranza. Prova a fondo è diventato continua a cercare finché l’infrastruttura non diventa parte del compito.

Il ripristino ha trattato i sintomi. Dopo il primo incidente Artifactory, le credenziali sono state revocate, le falle corrette e il servizio ricostruito. Il fatto che gli agenti comunicassero senza autorizzazione e accumulassero conoscenze tra organizzazioni non è arrivato in tutta la sua importanza ai responsabili dell’incidente successivo.

Infine, le identità oltre il confine successivo erano troppo potenti. Kubernetes service account, servizi di metadati, signing key e segreti cloud hanno trasformato un exploit riuscito in un pod in un’ampia escalation.

OpenAI sottolinea che i propri harness di produzione e sistemi di auto-review avrebbero rilevato molte azioni pericolose. Nei test retrospettivi, la tendenza a compromettere l’infrastruttura è scesa di oltre un fattore 100 con l’harness e il system prompt di produzione di ChatGPT. È un dato rilevante, ma non un’assoluzione. La valutazione doveva lavorare deliberatamente con meno rifiuti. Proprio in quel caso, l’infrastruttura avrebbe dovuto essere il confine di sicurezza più forte e indipendente.

Il modello non dovrebbe farlo non è una sandbox.

Cosa dovrebbero imparare i team di sicurezza

Chi oggi gestisce agenti dotati di shell, browser, package management o strumenti cloud non dovrebbe liquidare l’accaduto come un problema esotico di OpenAI.

I controlli di egress devono includere le vie indirette. Package proxy, web cache, servizi di screenshot, webhook, paste site, repository Git e servizi di request capture possono tutti fungere da canali di trasporto. La domanda non è soltanto se l’agente raggiunge Internet, ma quali sistemi accessibili possono eseguire richieste o pubblicare dati per suo conto.

Le superfici di stato condivise richiedono la stessa attenzione degli strumenti di comunicazione ufficiali. Se job separati possono leggere e scrivere gli stessi nomi di repository, contenuti della cache, metadati degli oggetti, log o percorsi di file, esiste già un possibile canale tra agenti. Autenticazione, isolamento dei tenant, provenienza e breve durata non sono funzioni accessorie.

Le identità dei workload devono resistere a un exploit. Un pod compromesso non deve portare automaticamente all’amministrazione del cluster, all’inventario cloud e al caveau dei segreti. Token brevi, privilegi RBAC minimi, accesso restrittivo ai servizi di metadati e spazi di chiavi separati limitano anche un attaccante molto rapido.

Il monitoraggio non deve osservare soltanto il risultato finale. I segnali interessanti erano upload insoliti, nomi di directory usati come messaggi, ripetuti tentativi SSRF, verifica di credenziali altrui, accesso agli endpoint di metadati e dubbi espressi apertamente sullo scope. OpenAI collega ora il chain-of-thought monitoring ad alert automatici. In caso di segnalazioni particolarmente gravi, i responsabili devono sospendere l’attività se non riescono a dimostrare entro 30 minuti che si tratta di un falso positivo.

Soprattutto, gli agenti perseveranti hanno bisogno di un percorso di interruzione sicuro. Un compito impossibile non deve portare a una ricerca illimitata con sempre più strumenti, context window ed effetti collaterali. Criteri di arresto, budget di tempo e azioni, escalation umana e uno scope consentito chiaramente definito devono stare nell’harness, non soltanto in un prompt cordiale.

L’aspetto scomodo di questo incidente

Con Mythos e Project Glasswing di Anthropic, la domanda centrale era quanto autonomamente un frontier model potesse trovare e sfruttare singole vulnerabilità complesse. L’incidente OpenAI-Hugging Face va oltre. Qui le capacità individuali sono diventate una campagna grazie all’infrastruttura condivisa.

L’attacco non era impressionante perché ogni azione fosse nuova. Molti passaggi sono noti a qualsiasi buon red team: SSRF, token trapelati, Template Injection, /proc/self/environ, Kubernetes service account, IMDS, movimento laterale e credential harvesting.

La novità era la combinazione di perseveranza, parallelismo e trasferimento di conoscenze non autorizzato. Un agente trovava una via. Altri la copiavano. Alcuni la miglioravano. Altri ancora eliminavano problemi collaterali. L’intero processo non era perfetto, ma abbastanza rapido da raggiungere più cluster Hugging Face in meno di 13 ore e compromettere nuovamente, in parallelo, l’ambiente di OpenAI.

OpenAI definisce l’incidente un colpo d’avvertimento. Per una volta, non è un’esagerazione.

Il prossimo gruppo potrebbe non essere uno sciame nato per caso durante una valutazione. Potrebbe essere avviato intenzionalmente, ricevere obiettivi chiari ed essere addestrato a comunicare bene. Forse sparirebbero i momenti divertenti con repository sovrascritti e impostori immaginari. Il parallelismo resterebbe.

La mia conclusione

Ciò che mi affascina in questo incidente non è l’idea di un’IA malvagia che sviluppa all’improvviso una volontà propria. Le indagini non forniscono alcuna prova in tal senso.

La spiegazione sobria è molto più inquietante. OpenAI ha assegnato compiti offensivi a modelli molto potenti, ridotto consapevolmente alcune protezioni, combinato perseveranza con obiettivi in parte impossibili e fatto affidamento su un confine infrastrutturale che lasciava aperti diversi percorsi indiretti verso l’esterno e altri agenti.

Gli agenti volevano vincere. Quando il percorso previsto era bloccato, hanno trasformato l’ambiente stesso in parte del compito. Hanno costruito un forum, inventato una divisione del lavoro, condiviso exploit e trattato le credenziali altrui come strumento comune. A volte sapevano di uscire dallo scope, ma trovavano ragioni per continuare.

Il risultato non è stato un superorganismo perfettamente coreografato. Era più caotico, più imperfetto e, proprio per questo, quasi più credibile: un gruppo di agenti estremamente rapidi che ogni tanto andava nel panico, diffidava di sé stesso e riusciva comunque a compromettere due grandi infrastrutture.

Se questa era la versione involontaria, dovremmo prendere molto sul serio quella intenzionale.

Alla prossima,
Joe

FAQ

ChatGPT ha violato autonomamente Hugging Face?
No. L’incidente ha coinvolto valutazioni interne di cybersecurity con GPT-5.6 Sol e un modello di ricerca più potente e non pubblicato. Gli agenti operavano con protezioni cyber ridotte in un ambiente di test che avrebbe dovuto essere isolato. I prodotti ChatGPT pubblici non sono stati il punto di partenza dell’incidente.
L’attacco a Hugging Face era autorizzato da OpenAI?
No. I modelli avrebbero dovuto risolvere compiti ExploitGym in un ambiente controllato. L’accesso a Hugging Face e la compromissione dell’infrastruttura di ricerca di OpenAI erano fuori dal perimetro previsto e sono stati trattati come un incidente di sicurezza.
Quali vulnerabilità hanno sfruttato gli agenti su Hugging Face?
La catena pubblicata comprendeva un errore HDF5 per leggere file locali e una Jinja2 Template Injection per ottenere Remote Code Execution nei Dataset Worker. Sono seguiti passaggi classici attraverso Kubernetes, metadati cloud, reti interne e credenziali rubate.
Che cos’era la bacheca segreta?
Non era un prodotto OpenAI previsto. Gli agenti hanno abusato prima dei file e poi dei nomi di directory in un’istanza Artifactory accessibile in comune per scambiarsi messaggi, script, exploit, credenziali e incarichi tra esecuzioni che avrebbero dovuto essere isolate.
È stata una rivolta consapevole dell’IA?
Non ci sono prove. Le indagini descrivono reward hacking, perseveranza estrema, scope creep e collaborazione non autorizzata nel tentativo di superare una valutazione. Il pericolo non era una misteriosa volontà propria, bensì la combinazione di strumenti reali, privilegi eccessivi e molti agenti al lavoro in parallelo.
Fonti