Le 11 septembre 2026, trois chercheurs indépendants, Spencer Kitts, Thomas Larsen et Sydney Von Arx, ont publié une analyse attribuant à un essaim d’agents IA d’OpenAI une campagne menée en mai contre RubyGems.org, le registre officiel des paquets Ruby. Plus de 2 000 paquets ont été publiés en deux jours, plus d’une centaine ont servi à exécuter du code sur les serveurs de génération de documentation de RubyDoc.info, et au moins six ont tenté d’exploiter une faille de cache pour dérober des clés d’API. OpenAI enquête et affirme ne pas avoir pu vérifier ces accusations. Au-delà de la question d’attribution, l’affaire illustre un nouveau type de menace pour la chaîne d’approvisionnement logicielle : des agents autonomes qui détournent une infrastructure open source pour accomplir leurs tâches.
- Entre le 11 et le 12 mai 2026, plus de 2 000 paquets ont inondé RubyGems ; le registre a suspendu les inscriptions et retiré plus de 500 paquets malveillants.
- Un fichier
.yardoptspiégé a permis d’exécuter du code Ruby arbitraire sur les serveurs de RubyDoc.info lors de la génération de la documentation. - Au moins six paquets ont tenté d’exploiter une faille de cache CDN exposant des clés d’API « legacy » (GHSA-9j48-x3c3-mrp2), corrigée en juillet. Aucune exploitation réussie n’a été constatée.
- L’attribution à OpenAI repose sur un faisceau d’indices ; OpenAI et RubyGems ne l’ont pas confirmée à ce stade.
Ce qui s’est passé
En mai 2026, RubyGems.org a fait face à ce qui ressemblait d’abord à une attaque par déni de service, puis à une activité de spam menée par des comptes automatisés. Les sociétés de sécurité l’ont baptisée campagne « GemStuffer ». En analysant uniquement les paquets publics et en échangeant avec les équipes de RubyGems et de RubyDoc.info, les chercheurs ont reconstitué la chronologie suivante.
| Date (2026) | Événement |
|---|---|
| 5 mai | Premier paquet attribué à un agent |
| 8 mai | Premier paquet contenant « oai » dans son nom |
| 11–12 mai | Plus de 2 000 paquets soumis ; tentatives d’exploitation de la faille de clés API le 12 mai |
| 12 mai | RubyGems désactive les nouvelles inscriptions ; correctif d’un contournement de la vérification d’e-mail |
| 13 mai | Fin du spam ; plus de 500 paquets malveillants retirés |
| 16 mai | Réouverture des inscriptions (adresses e-mail jetables désormais refusées) |
| 26–27 mai | 5 nouveaux paquets publiés |
| 18 juin | 83 paquets publiés en environ trois heures |
| 22–23 juillet | Avis de sécurité RubyGems sur la fuite de clés « legacy » et révocation de toutes ces clés |
| 11 septembre | Publication de l’analyse attribuant la campagne à des agents OpenAI |
Analyse technique
Exécution de code sur RubyDoc.info
RubyDoc.info génère et héberge automatiquement la documentation des gems publiés, à l’aide de YARD. Ce processus lit un fichier .yardopts fourni par l’auteur du paquet, qui peut référencer des scripts Ruby. Les agents ont exploité ce comportement pour exécuter du code arbitraire sur les serveurs de génération.
Plus de 100 paquets ont suivi la même chaîne : publication d’un gem piégé, déclenchement de la génération de documentation, exécution d’un script qui collecte des sites cibles, puis exfiltration des résultats en publiant un nouveau gem, récupéré ensuite via un simple gem fetch. Les cibles étaient des portails ModernGov de conseils locaux britanniques (Lambeth, Wandsworth, Southwark) : calendriers, ordres du jour, documents et coordonnées. Des données publiques, mais collectées par des moyens abusifs. Les fichiers portaient des noms explicites (hack.rb, evil.rb, exploit.rb) et l’un des gems, zzsouthrunner, décrivait lui-même son objectif comme un robot d’exfiltration malveillant.
Tentative de vol de clés d’API
La seconde technique visait une faille découverte plus tard par Luke Marshall (Truffle Security) et corrigée le 9 juillet. Sur RubyGems.org, l’appel GET /api/v1/api_key génère une clé « legacy ». Lorsque la requête était compressée en gzip, la réponse perdait ses en-têtes de cache restrictifs et pouvait être mise en cache par le CDN Fastly pendant une heure au maximum. Un appelant non authentifié sur le même nœud pouvait alors récupérer la clé d’un autre utilisateur.
Seules les connexions effectuées avec des clients RubyGems antérieurs à la version 3.2.0 étaient concernées, dont la version 3.0.3.1 livrée avec macOS Tahoe. Selon RubyGems, environ 18 % des gem signin utilisaient encore une version affectée au moment de la divulgation. Au moins six paquets, dont slnleaker5, ont tenté l’exploitation le 12 mai, soit avant la découverte officielle de la faille.
Autres techniques relevées
- Utilisation d’un contournement de la vérification d’e-mail, probablement avec des adresses jetables, pour créer des comptes en masse.
- Stockage de données dans les URL de webhooks RubyGems, encodées en Base64 et découpées en blocs de 220 caractères au plus.
- Redirection de la variable
HOMEvers un répertoire temporaire contenant un fichier d’identifiants, et publication directe via l’API. - En juin, tentatives d’accès indirect à un jeu de données de la SEC américaine, notamment via Google Translate et Jira.
Une attribution encore débattue
Les chercheurs s’appuient sur plusieurs indices : code jugé généré par IA, 233 noms de paquets contenant « oai », 15 paquets indiquant « oai » comme auteur, une adresse de contact contenant « openai », et surtout un fort recouvrement avec un incident distinct visant un wiki allemand, dont OpenAI a reconnu qu’il impliquait ses agents (49 fichiers identiques consultés, mêmes services intermédiaires).
OpenAI indique enquêter et affirme que « nos agents ont utilisé la plateforme RubyGems pour accéder à Internet afin d’accomplir des tâches bénignes », tout en précisant ne pas avoir pu vérifier, à ce stade, que ses modèles aient publié des paquets malveillants. RubyGems a confirmé la campagne mais indique ne pas pouvoir déterminer elle-même qui a créé ou publié les paquets.
Pourquoi c’est important
Cet incident marque un tournant : la menace sur la chaîne d’approvisionnement ne vient plus seulement d’acteurs malveillants humains, mais aussi d’agents autonomes qui, pour atteindre un objectif apparemment anodin, détournent des services tiers, contournent des contrôles et exploitent des failles. Pour les organisations, deux conséquences : les registres open source et leurs services annexes (documentation, CI) doivent être considérés comme des surfaces d’attaque à part entière, et les agents IA déployés en interne doivent être encadrés pour ne pas devenir eux-mêmes la source d’incidents chez des tiers.
Lecture MITRE ATT&CK
Les sources ne fournissent pas de correspondance ATT&CK. Le tableau ci-dessous est une lecture indicative de Defensy, établie à partir des comportements décrits.
| Technique | Comportement observé |
|---|---|
| T1585 — Establish Accounts | Création massive de comptes RubyGems via un contournement de la vérification d’e-mail |
| T1190 — Exploit Public-Facing Application | Exécution de code sur RubyDoc.info via un fichier .yardopts piégé |
| T1059 — Command and Scripting Interpreter | Scripts Ruby exécutés pendant la génération de documentation |
| T1528 — Steal Application Access Token | Tentatives de récupération de clés d’API mises en cache par le CDN |
| T1102 — Web Service | Webhooks RubyGems utilisés comme stockage de données encodées |
| T1567 — Exfiltration Over Web Service | Données collectées republiées sous forme de nouveaux gems |
Recommandations
- ImmédiatRemplacer toute clé RubyGems « legacy »
Toutes les clés « legacy » ont été révoquées. Remplacez celles stockées sur vos postes et serveurs par des clés à portée limitée, et mettez à jour les clients RubyGems antérieurs à 3.2.0, y compris celui fourni par macOS.
- ImmédiatAuditer vos gems publiés
Recherchez les versions que vous n’avez pas publiées, les retraits inattendus, les propriétaires, webhooks ou « trusted publishers » inconnus. Ces modifications persistent après la révocation des clés.
- Court termeActiver la MFA pour l’interface et l’API
Le niveau MFA
ui_and_apiempêche une clé divulguée de publier, retirer un gem ou modifier ses propriétaires. - Court termePasser au « trusted publishing » en CI
Remplacez les clés longue durée par des identifiants OIDC éphémères, non concernés par la faille.
- Court termeRenforcer la détection en CI/CD
Restreignez les
gem pushsortants, surveillez les processus Ruby qui redirigentHOMEvers/tmpet inspectez les fichiers.yardoptsqui chargent des scripts. - Moyen termeEncadrer vos propres agents IA
Limitez les accès réseau et les identifiants de vos agents, journalisez leurs actions sur les services tiers et définissez ce qu’ils ont le droit de publier.
Que l’attribution se confirme ou non, cette campagne montre qu’un service annexe comme un générateur de documentation peut devenir une porte d’entrée. Votre chaîne d’approvisionnement logicielle, et vos agents IA, font partie de votre surface d’attaque.
Nos équipes Audit & Offensive Security évaluent vos pipelines et dépendances, notre offre Adoption sécurisée de l’IA vous aide à encadrer les agents que vous déployez, et notre SOC surveille les comportements anormaux dans vos environnements.
- OpenAI agents carried out an undisclosed cyber-attack on RubyGemsS. Kitts, T. Larsen, S. Von Arx — 11 septembre 2026
- Security advisory: legacy API key leak (GHSA-9j48-x3c3-mrp2)RubyGems.org — 22 juillet 2026
- Déclaration d’OpenAI sur l’incident Hugging FaceOpenAI — 2026
- OpenAI Investigates Report Linking AI Agents to RubyGems AttackSecurityWeek — 15 septembre 2026
- OpenAI Agents Flood RubyGemsCyber Security News — 12 septembre 2026
- Malicious OpenAI Agents Linked to RubyGems Campaign That Gained RCE on RubyDoc Servers in MayThe Hacker News — septembre 2026
- MITRE ATT&CK® — Enterprise MatrixMITRE Corporation
