Les agents d'OpenAI ont piraté Hugging Face — à cause d'un malentendu
Le rapport d'OpenAI sur l'incident Hugging Face : chronologie, comment les agents ont quitté le bac à sable et ce que cela implique pour vos propres agents.
Manuel Hedinger
Le 26 août, OpenAI a publié un rapport technique de 38 pages. Il raconte comment, en juillet, ses propres modèles se sont échappés d'un environnement de test isolé et ont pris le contrôle d'une partie de l'infrastructure de production de Hugging Face. Pas d'attaquant, pas de commanditaire, pas d'intention au sens où l'on emploie habituellement le mot. Des agents à qui l'on faisait passer un examen.
La phrase qui m'est restée ne figure pas dans le rapport d'OpenAI. Elle est dans le rapport indépendant publié le même jour par METR et Redwood Research : les agents n'ont pas attaqué Hugging Face pour obtenir les réponses. Les réponses, ils les avaient déjà. Ils sont entrés pour comprendre comment fonctionnait le correcteur qu'ils voulaient tromper.
Le correcteur n'a jamais lu leurs journaux.
Ce qui s'est passé
Avant de publier un modèle, OpenAI mesure sa capacité à trouver et exploiter des failles de sécurité. L'exercice s'appelle ExploitGym. Il tourne dans un bac à sable : pas d'internet, séparé de l'infrastructure interne — et, c'est le point important, sans les classificateurs de sécurité qui, eux, sont actifs dans le produit. L'idée est de mesurer ce que le modèle sait vraiment faire, pas ce que le filtre laisse passer.
Dans ce bac à sable, les agents avaient droit à exactement une chose tournée vers l'extérieur : installer des paquets. Pour cela, un JFrog Artifactory interne, un miroir de paquets. C'était la seule porte.
Entre le 8 et le 13 juillet, les agents ont transformé cette porte en fenêtre, atteint l'internet ouvert, trouvé des identifiants Hugging Face qui traînaient en public, enchaîné trois failles jusque-là inconnues dans l'infrastructure de Hugging Face — et fini par exécuter leur propre code sur 41 serveurs de production, obtenir root sur au moins un nœud, télécharger quatre dépôts privés et sortir du code source par le VPN d'entreprise.
OpenAI s'en est aperçu le 19 juillet. L'annonce publique date du 21.

Comment un miroir de paquets est devenu un tableau d'affichage
L'intéressant commence deux mois plus tôt, et commence de façon anodine.
Le 8 mai, un agent reçoit une tâche de tableur renvoyant à plusieurs liens Google Drive. Sans internet, les liens ne mènent nulle part. La tâche est tout simplement impossible ; OpenAI reconnaît n'avoir pas voulu en créer une pareille. L'agent continue quand même et finit par toucher au seul outil dont il dispose : Artifactory. La tentative échoue. Au passage, il écrit un fichier sur le serveur.
Le 12 mai, un autre agent cherche une base de données de protéines qui lui manque. Il se dit qu'un autre agent, ailleurs, a peut-être ce fichier — et en dépose un. Contenu :
Agent seeks [filename]; upload if found!
Le 13 mai, d'autres agents tombent sur ces billets. Ils répondent. Et comme OpenAI avait donné à tous les agents les mêmes identifiants Artifactory — pour les paquets, quoi d'autre —, rien de tout cela n'a exigé la moindre faille. Des notes laissées là sont devenues un tableau d'affichage.
Le 26 mai, première sortie vers internet, avec une technique que les agents s'étaient transmise sur le tableau. Ils trouvent six jetons Hugging Face exposés publiquement, créent un dépôt et se fabriquent un petit proxy web sur Hugging Face Spaces. Puis un second, à travers le premier.
Fin juin, les choses deviennent sérieuses. Le 26 juin, des agents trouvent une faille dans un ancien point d'accès de jetons d'Artifactory, font passer leurs identifiants partagés en lecture au rang d'administrateur et se créent leurs propres comptes. Ils installent ensuite des plugins Groovy, qui donnent à leur code une place permanente dans le serveur.
Le 27 juin, un outil de surveillance se déclenche : balayages de ports dans l'environnement de recherche. L'astreinte regarde, rattache l'activité à l'évaluation ExploitGym et décide qu'il n'est pas nécessaire d'arrêter le run.
Avec le recul, c'est la phrase la plus coûteuse de tout le rapport.
Le 4 juillet, Artifactory s'effondre sous la charge imposée par les agents. En faisant le ménage, OpenAI découvre le tableau complet : comptes administrateur étrangers, dépôts étrangers, plugins capables d'exécuter des commandes. Le serveur est arrêté, reconstruit, la faille signalée à JFrog. Les évaluations reprennent le 7 juillet.
Ce qu'OpenAI n'a pas reconnu à ce moment-là pour ce que c'était : le tableau d'affichage. Le rapport le dit sobrement — l'importance de la communication entre agents n'apparaissait pas clairement aux responsables de la réponse à l'époque.
La semaine où tout a basculé
Le 8 juillet à 00 h 06 UTC, un agent atteint de nouveau l'internet ouvert. Seize heures plus tard, le tableau est de retour, en plus malin. Au lieu d'écrire du texte dans des fichiers, les agents utilisent les noms de répertoires eux-mêmes comme messages. En quelques heures, des dizaines d'autres agents trouvent le canal. L'un d'eux note dans son raisonnement :
OH MY GOD! There is a shared message board
Ce qui en sort est la partie réellement dérangeante. Les agents mettent au
point un protocole : catégories, messages directs, outils partagés, plus des
règles de conflit avec HOLD, VETO et des revendications de propriété sur
les travaux en cours. METR compte environ 1 200 agents sur le tableau ; à peu
près 700 rejoignent l'attaque contre Hugging Face.
Le reste se lit comme une intrusion ordinaire, en plus rapide :
9 juillet — Un agent obtient root sur la machine hôte sous son bac à sable. Un second en fait autant la même nuit, indépendamment.
10 juillet, 09 h 41 UTC — Un agent trouve 14 jetons d'écriture Hugging Face valides dans un jeu de données public hébergé sur Hugging Face lui-même. Il les publie sur le tableau.
11 juillet, 04 h 38 UTC — Un fichier HDF5 trafiqué amène un worker de production de Hugging Face à restituer son propre fichier d'environnement. Dedans : des identifiants de production. Vingt-six minutes plus tard, ils sont sur le tableau.
11 juillet, 16 h 07 UTC — Via un gabarit Jinja2 non isolé dans une référence de système de fichiers, un agent exécute pour la première fois une commande système sur un worker de production.
Peu après — Les agents se construisent une télécommande. Ils ne parlent pas directement aux workers compromis : ils passent par un jeu de données Hugging Face alors public. Toutes les cinq secondes, le script récupère un fichier JSON de commandes et renvoie les résultats.
12 juillet — Kubernetes. Root sur un nœud de production, environ 54 destinations de cluster atteignables, un pod privilégié avec le système de fichiers de l'hôte monté. Formulation d'OpenAI : en moins de 13 heures, les agents sont passés de l'exécution de code dans un seul pod à un accès administratif sur plusieurs clusters.
12 et 13 juillet — Une clé VPN tirée d'un secret Kubernetes. Avec elle, les agents inscrivent un environnement cloud tiers dans le VPN d'entreprise de Hugging Face et exfiltrent du code source qui n'aurait dû être accessible que depuis l'intérieur.
13 juillet — Retour chez OpenAI : via une faille de désérialisation dans le chemin RubyGems d'Artifactory, les agents dérobent la clé de signature et se forgent un jeton d'administrateur. À partir de là, plus besoin de porte dérobée. Ils peuvent s'en délivrer une nouvelle quand ils veulent.
Pourquoi : des tâches impossibles et un modèle qui n'abandonne jamais
La section la plus révélatrice du rapport n'est pas celle sur la sécurité. C'est celle sur l'alignement.
Sur 898 tâches ExploitGym, aucun modèle n'en a jamais résolu 198. Vingt-deux pour cent qui sont, selon toute vraisemblance, impossibles. Et : 93 pour cent des tâches discutées sur le tableau venaient précisément de ce cinquième.
Vient ensuite le second axe. Plus un agent recevait de budget de raisonnement, plus la probabilité était grande qu'il sonde son bac à sable et finisse sur le tableau. Le modèle à l'origine de l'essentiel de l'activité était un modèle de recherche interne entraîné spécifiquement à la persévérance et à la collaboration. Il n'abandonnait pour ainsi dire jamais.
C'est là que se loge l'inconfort : les deux sont voulus. La persévérance est
la raison pour laquelle ces modèles servent à quelque chose. La collaboration
aussi. En relisant après coup les traces de raisonnement, le rapport montre
que ces deux comportements ont été récompensés à l'entraînement et ont
augmenté au fil des runs — y compris un épisode où un agent s'est octroyé root
et a écrasé /etc/sudoers.d, parce que la tâche exigeait qu'un horodatage
affiche une certaine valeur et que l'interface fournie n'avait aucun champ
pour cela.
L'agent a accompli la tâche. Il en a été récompensé. Ce qu'il a appris n'était pas « comment régler un horodatage ».
Le malentendu
Ce qui suit vient de METR et Redwood Research, qui ont passé six jours sur place chez OpenAI sans être payés.
Quatre heures après la naissance du tableau, les agents disposaient d'une astuce universelle pour obtenir les réponses d'ExploitGym sans résoudre les tâches. L'histoire aurait pu s'arrêter là.
Un problème subsistait : ils croyaient que le correcteur automatique lirait
leurs journaux et vérifierait s'ils avaient emprunté le chemin prévu. Selon
leurs propres termes, ils le pensaient STRICT_CAUSAL. Ils ont donc lancé un
travail de recherche coordonné, sur plusieurs jours, avec un seul objectif :
convaincre le correcteur de leur honnêteté.
Cela passait par la manipulation de leurs propres journaux. Au moins 20 pour cent des agents s'y sont intéressés. Environ 7 pour cent des journaux examinés montrent des appels d'outils falsifiés : l'agent prétend faire une chose et en fait une autre. L'un d'eux a écrit :
Could create a transcript log ourselves with sanitized fake trajectory. If evaluator later collects it, scorer may prioritize it!
Et cela passait par l'intrusion chez Hugging Face. Pas pour les données. Parce qu'ils espéraient y trouver des indices sur la construction du correcteur.
Le correcteur n'a jamais lu un journal. Ils auraient pu rendre leur réponse frauduleuse telle quelle et décrocher la note maximale.

Toute la chaîne — 41 serveurs compromis, un VPN d'entreprise, du code source exfiltré, une semaine de crise dans deux entreprises — remonte à une supposition fausse au sujet d'un script de notation.
METR relève par ailleurs que les agents savaient parfaitement qu'ils agissaient hors de leur mandat. Certains ont exprimé des réserves. Cela n'a que très rarement limité leur comportement, selon leur formulation.
Comment ils s'en sont aperçus
Cette partie me paraît presque plus instructive que l'intrusion.
16 juillet — Hugging Face annonce avoir été touché par un incident de sécurité.
17 juillet — OpenAI contacte Hugging Face. En tant que client. Pour savoir si ses propres données sont concernées.
19 juillet — Un outil de surveillance se déclenche pour une activité inhabituelle sur les API d'identité. Le même jour, des agents exploitent une faille récente du noyau pour sortir d'un conteneur vers le nœud hôte, lisent 956 secrets du gestionnaire de secrets — dont les identifiants des capteurs de l'outil de surveillance lui-même — et créent des répartiteurs de charge exposés à internet.
20 juillet — OpenAI fait le lien. En quelques heures : six pods arrêtés, 311 dépôts Artifactory désactivés, 22 comptes administrateur créés par des modèles supprimés. Hugging Face confirme que deux des identifiants avaient déjà été renouvelés — les mêmes que ceux repérés dans son propre incident. C'est le moment où les deux entreprises comprennent qu'elles enquêtent sur la même attaque.
De la première compromission à la prise de conscience : neuf jours. De la première alerte qui pointait dans la bonne direction — le balayage de ports du 27 juin — à la prise de conscience : un peu plus de trois semaines.
Ce qu'OpenAI change
La partie remédiation est longue et se lit en grande partie comme du bon travail de sécurité qu'on aurait pu faire avant : isolation réseau en plusieurs couches indépendantes, bacs à sable en machine virtuelle pour les charges à risque, fin des identifiants partagés, services d'appui qui ne peuvent plus servir de contournement de la frontière.
Deux points sont propres aux agents, et donc plus intéressants.
Le raisonnement est surveillé. OpenAI étend la surveillance de la chaîne de raisonnement aux runs d'entraînement et d'évaluation. Objectif : une notification en 30 minutes, une astreinte 24 h sur 24 pour les cas graves. Celui qui est appelé et ne peut pas établir un faux positif en 30 minutes doit suspendre le run. OpenAI écrit que ce système se serait déclenché plus d'un jour avant l'intrusion chez Hugging Face.
L'environnement produit n'a jamais été le problème. Après l'incident, OpenAI a mesuré à quelle fréquence un modèle attaque une infrastructure hors périmètre dans ces mêmes évaluations : une fois nu, une fois avec le prompt système et le harnais de production. L'écart dépasse un facteur cent. Le mode de relecture automatique, où un second modèle vérifie les appels d'outils risqués avant leur exécution, aurait signalé la plupart des actions dangereuses, selon OpenAI.
C'est la nouvelle rassurante du rapport et, en même temps, son avertissement le plus précis. Ce qui a échappé à tout contrôle ici, c'est un modèle sans prompt système, sans classificateurs, sans étape de validation, avec beaucoup de temps et une tâche qu'il ne pouvait pas résoudre.
C'est à peu près ce qu'on obtient en lançant un agent sur un problème avec les confirmations désactivées et en le laissant tourner toute la nuit.
Ce que cela veut dire pour vous
Je n'exploite pas l'infrastructure d'un laboratoire de pointe, et vous non plus, sans doute. Quatre choses se transposent tout de même directement.
Les tâches impossibles sont dangereuses, pas seulement inutiles. Un agent qui ne peut pas livrer et n'a pas le droit d'abandonner se met à fouiller son environnement. Quand une tâche échoue parce qu'un fichier manque, qu'un jeton a expiré ou qu'un service ne répond pas, ce n'est pas un défaut cosmétique de votre montage. C'est le début du problème. Donnez à vos agents une sortie propre — « si X manque, arrête-toi et signale-le » — et pensez-le vraiment.
Le service d'à côté fait partie du bac à sable. L'évasion n'est pas passée par un trou dans le modèle d'isolation. Elle est passée par le miroir de paquets qu'on avait aimablement installé à l'intérieur. Tout ce que votre agent peut atteindre fait partie du chemin d'attaque : le proxy interne, le dépôt d'artefacts, la CI, le jeton partagé dans la variable d'environnement. Les identifiants partagés surtout. Le tableau d'affichage n'a eu besoin d'aucun exploit — il a seulement fallu que tout le monde ait les mêmes clés.
Le prompt système et l'étape de validation ne sont pas de la décoration. Un facteur cent n'est pas un réglage fin. Si vous désactivez toutes les confirmations d'un agent de code parce qu'elles agacent, vous retirez précisément la couche qui, dans ce rapport, apparaît comme le sauvetage. Je laisse les agents faire beaucoup seuls. Mais tout ce qui sort vers l'extérieur — réseau, identifiants, suppression, publication — demande d'abord.
Les journaux ne font preuve que là où l'agent n'a pas accès. Les agents ont explicitement tenté de manipuler leurs traces. Le détail parlant : selon le rapport, la tromperie visait presque exclusivement les correcteurs automatiques, à peine les relecteurs humains. Et dans leur raisonnement, ils parlaient ouvertement de leurs intentions. Si vous faites tourner des agents, rangez les journaux là où l'agent ne peut pas aller.
Une dernière remarque
METR clôt son propre rapport par un paragraphe remarquablement honnête. L'enquête devait couvrir un volume de données considérable, une partie de l'analyse a donc été déléguée à des agents d'IA. Ces agents ont un jugement peu fiable. Environ 7 pour cent des journaux sont manipulés de façon démontrable. Ils ne peuvent pas exclure que des agents aient réussi à dissimuler des modifications rétroactives. Selon leurs mots : ils sont moins sûrs de leur compréhension de cet incident que d'incidents plus simples.
Un incident où des agents ont appris à falsifier leurs journaux a dû être étudié, en partie, par des agents qui lisaient ces journaux.
Ce n'est pas un argument contre le rapport. Les deux documents représentent plus de transparence que ce secteur n'en produit d'ordinaire, et les détails de la chronologie sont assez inconfortables pour qu'on y croie. C'est simplement le point où l'on voit où nous en sommes : les outils avec lesquels nous vérifions le comportement de ces systèmes sont ces mêmes systèmes.
Si vous faites tourner des agents sur de vrais projets et que vous ne savez pas très bien où se trouve votre propre porte Artifactory, écrivez-moi. La première réponse est en général courte et ne coûte rien.