veilletech.fr
1 nov. Feed du jour
#05 SÉCURITÉ Faille

ChatGPT : un lien partagé lisait vos conversations

Un cadre isolé n'est isolé que si personne ne lui ouvre la porte.

Parameter a montré qu'un lien de partage ChatGPT pouvait exécuter du code dans la session de sa victime et lire ses conversations privées, en combinant un aperçu HTML, la bibliothèque MathLive et une réponse JSONP de YouTube. OpenAI a corrigé le 26 octobre. La chaîne reste un cas d'école pour tout produit qui affiche du contenu généré dans une iframe.

3 min de lectureavancévidéo 1:29
Partager
Sommaire5 sections
  1. Ce qui se passe
  2. La chaîne
  3. Ce que ça permettait
  4. Comment s'y prendre
  5. À retenir

Ce qui se passe

Parameter a signalé le 18 octobre une chaîne d'attaque qui partait d'un lien /share/<id> ordinaire. L'ouvrir suffisait : l'aperçu s'ouvrait seul, et le code de l'attaquant tournait comme chatgpt.com en environ 4,5 secondes. La variante la plus stable demandait un clic sur Preview. OpenAI a reproduit le problème, l'a relevé de P2 à P1, puis a confirmé le correctif le 26 octobre, avec une prime de 5 000 $. Il n'y a rien à faire côté utilisateur, et Parameter ne fait état d'aucune exploitation.

La chaîne

Chaque pièce était défendable seule. L'aperçu HTML tourne dans un cadre séparé, sur une autre adresse, et ne peut pas lire la page principale. Mais une même conversation peut aussi contenir un graphique, qui charge MathLive dans la page principale.

API ChatGPTYouTubeiframe srcdocMathLiveAperçu isoléAPI ChatGPTYouTubeiframe srcdocMathLiveAperçu isolépostMessage avec du HTML1innerHTML crée le cadre2script oEmbed autorisé3callback exécuté4appels avec le jeton5conversations privées6
Comment l'aperçu isolé finit par agir comme chatgpt.com

Trois maillons méritent d'être regardés de près.

Le récepteur postMessage. MathLive acceptait update-setting de n'importe quelle origine, sans vérifier la fenêtre émettrice. Le réglage en question, une disposition de clavier, pouvait contenir du HTML, que createHTML laissait passer tel quel avant son affectation à innerHTML.

L'iframe srcdoc. Un script inséré par innerHTML ne s'exécute pas, mais un cadre srcdoc sans attribut sandbox ouvre un nouveau document, avec l'identité de la page qui l'a créé.

La CSP. Le code en ligne était bloqué et www.youtube.com autorisé. Or https://www.youtube.com/oembed?callback= renvoyait du JavaScript contenant le paramètre, même pour répondre qu'il était invalide. Finir ce paramètre par ;void neutralisait l'objet d'erreur ajouté ensuite. Parameter insiste : ce contournement n'est pas la cause, seulement le dernier verrou.

Ce que ça permettait

Le code lisait le jeton de session dans #client-bootstrap, puis appelait /backend-api/conversations comme l'application elle-même. Parameter a envoyé hors du site un petit extrait d'une conversation jamais partagée, en se limitant volontairement à cette preuve. Les autres actions accessibles depuis le front-end relevaient du même périmètre.

Comment s'y prendre

Si vous affichez du contenu généré ou fourni par des tiers :

JavaScript
window.addEventListener('message', (event) => {
  if (event.origin !== ORIGINE_ATTENDUE) return;
  if (event.source !== fenetreAutorisee) return;
  appliquerReglage(valider(event.data));
});

Source : Parameter, octobre 2026. Sujet repris le 31 octobre par Simon Willison et The Hacker News. Source en anglais.