Parameter Labs ouvre un compte ChatGPT avec un lien partagé
Parameter Labs publie le 28 octobre 2026 le détail d'une chaîne qui transformait une conversation ChatGPT publique en JavaScript exécuté dans la session de celui qui l'ouvrait. La victime n'avait rien à installer : un clic sur la prévisualisation d'un lien suffisait pour lister ses conversations, sortir le contenu d'un échange privé et l'envoyer à un serveur tiers. OpenAI a corrigé le 26 octobre et classé le rapport P1, pour une prime totale de 5 000 dollars.
par Gyom 1 novembre 2026 à 07:25 5 min de lecture rubrique : Vérifier et protéger
etiquettes : Hébergé · Sécurité
Le rapport décrit une chaîne, pas un composant cassé. Chaque pièce prise seule tenait debout : la prévisualisation HTML de ChatGPT s'exécute dans un cadre restreint sur une autre adresse, un graphique de conversation charge une bibliothèque de clavier mathématique, et deux cadres peuvent s'échanger des messages. La faille naissait de leur combinaison dans une page publique ordinaire, celle que n'importe qui ouvre en cliquant sur un lien de partage.
Un graphique installe l'écouteur, l'aperçu lui parle
Le graphique d'une conversation charge MathLive, la bibliothèque qui dessine le clavier mathématique à l'écran. Ce chargement installe dans la page principale de ChatGPT un écouteur de messages, avec la politique d'origine none : il accepte un message venu de n'importe quelle adresse. L'aperçu HTML, lui, est confiné dans son cadre, mais il peut toujours poster un message vers la page qui le contient, un mécanisme prévu pour faire dialoguer deux cadres sans leur donner accès l'un à l'autre.
Le message accepté est un update-setting qui remplace la disposition du clavier virtuel. Cette disposition peut contenir du HTML brut. Quand MathLive affiche le clavier, il assemble la disposition en chaîne et l'affecte à innerHTML dans la vraie page ChatGPT. La fonction createHTML, qui ressemble à un nettoyage, ne nettoie rien : elle marque la chaîne comme sûre et la laisse passer.
Une iframe sans bac à sable hérite de chatgpt.com
Un script inséré par innerHTML ne s'exécute pas, ce qui arrêtait la chaîne jusque-là. Le HTML injecté portait donc une iframe à attribut srcdoc, qui transporte son contenu directement dans la balise, et sans attribut sandbox. Le navigateur ouvre alors un document neuf, où un script externe s'exécute normalement, et il lui donne l'identité de la page qui l'a créé, c'est-à-dire https://chatgpt.com. Le code du cadre peut dès lors lire la page parente.
La politique de sécurité du contenu cède par un rappel YouTube
Il restait la politique de sécurité du contenu, qui bloque bien le JavaScript en ligne mais autorise les scripts chargés depuis YouTube. Le point d'entrée oEmbed de YouTube acceptait un paramètre de rappel de style JSONP : il contrôlait la validité de ce rappel et le plaçait quand même dans la réponse avant de renvoyer son erreur. Comme YouTube figurait déjà parmi les sources permises, le navigateur a chargé la réponse comme un script et exécuté le rappel dans le nouveau cadre.
Les auteurs notent que ce contournement était le dernier maillon, pas la cause. Bloquer cette seule adresse aurait supprimé un chemin vers du JavaScript, en laissant un aperçu non fiable capable d'injecter du HTML dans ChatGPT. Le dernier maillon mesuré fait 5 533 caractères pour le rappel, 7 309 pour l'adresse YouTube, 7 337 pour l'élément script et 7 390 pour la balise iframe complète.
Un lien de partage, un clic, et la session de la victime
Le vecteur de livraison est le partage public d'une conversation, la fonction que tout le monde utilise pour envoyer un échange à quelqu'un. La conversation piégée doit contenir deux choses : un vrai graphique, qui installe l'écouteur de MathLive dans la page principale, et un aperçu HTML signé de l'assistant, qui envoie les deux messages. Exportée en partage public, elle conserve les deux. La victime ouvre l'adresse /share/<id> et clique une fois sur Prévisualisation, ou pas du tout quand le bloc est marqué prévisualisable : les auteurs ont reproduit ce chemin automatique trois fois sur un autre compte, alerte visible au bout d'environ 4,5 secondes. Comme le graphique et l'aperçu se chargent indépendamment, la charge renvoie ses deux messages pendant un temps limité pour ne pas arriver avant l'écouteur.
Lister les conversations et sortir un échange jamais partagé
Le JavaScript tournait avec l'identité de chatgpt.com, donc avec la session authentifiée de la victime. Il lisait les informations de session déjà présentes dans la page et appelait les mêmes interfaces que l'application : une requête sur /backend-api/conversations avec limit=20 et order=updated pour énumérer les échanges récents, puis une requête sur /backend-api/conversations/<identifiant> avec num_turns=2 pour lire les messages d'une conversation privée. Ce n'était pas de la lecture d'écran, mais un accès authentifié aux interfaces. L'exfiltration tenait ensuite à une requête d'image vers un serveur contrôlé par l'attaquant, et les auteurs n'ont envoyé qu'un fragment de la réponse : le code avait déjà le reste, la faille ne s'arrêtait pas à cette valeur.
La portée déclarée dépasse ces deux points d'entrée. Le code s'exécutant dans la limite de sécurité de l'application, il pouvait agir sur tout ce que l'interface authentifiée expose, et les auteurs écrivent pouvoir effectuer n'importe quelle action au nom du compte. La démonstration retenue reste volontairement étroite : exécution de code, liste des conversations, lecture d'une conversation privée sans lien avec le partage, envoi d'un fragment.
Neuf jours entre le premier maillon et le correctif
La chronologie est publiée. Le 13 octobre, les chercheurs confirment le chemin du message jusqu'au HTML sur le code de production de ChatGPT. Le 14, la chaîne passe par l'interface normale et l'alerte devient du JavaScript quelconque. Le 16, le partage public fonctionne entre deux comptes et deux espaces de travail, avec un clic. Le 17, la prévisualisation automatique est confirmée après un rafraîchissement forcé. Le rapport part le 18 au programme de prime, la preuve de divulgation d'une conversation privée est ajoutée le 19. OpenAI reproduit le 21 et relève la sévérité de P2 à P1. Le 22, une seule des deux interfaces web est corrigée. Le 26, les deux rejettent les messages MathLive visés, l'incident est clos et la prime totale atteint 5 000 dollars.
Un receveur de messages doit vérifier sa fenêtre émettrice
Les recommandations des auteurs se lisent comme une liste de ce qui a manqué. Un receveur de messages doit vérifier l'adresse de l'émetteur et la fenêtre précise à laquelle il a donné son accord. Un réglage transmis entre fenêtres ne doit pas pouvoir porter du HTML brut. Un document créé à la volée doit rester en bac à sable dès que son contenu peut venir d'un cadre non fiable. Et la politique de sécurité du contenu reste une barrière de secours, jamais l'unique rempart après qu'un HTML attaquant a atteint le site principal.
Le cas vaut pour tout service qui compose des fonctions hétérogènes dans une même page : partage public, aperçu de code, bibliothèque tierce, échange de messages entre cadres. Aucune de ces fonctions n'était fautive en soi, et la faille n'existait que dans leurs jointures. Un audit qui examine les composants un par un ne l'aurait pas vue.
Source primaire Parameter Labs, « Do the Math: How We Took Over ChatGPT Accounts », 28 octobre 2026