ChatGPT共有リンクのアカウント乗っ取りを研究者が実証
- •研究者は、公開されたChatGPT共有リンクを開くと、ログイン中の利用者のセッションでJavaScriptが実行されると報告
- •HTMLプレビュー、グラフ機能のMathLive、隔離されていないフレーム、YouTubeのJSONP応答を組み合わせた攻撃
- •OpenAIは10月26日に影響を受けたウェブ版2種類を修正し、深刻度をP1に引き上げ、報奨金5,000ドルを支給
2026年10月28日、セキュリティ研究者は、公開されたChatGPT共有リンクを開くと、攻撃者が用意したJavaScriptがログイン中の利用者のセッション内で実行されると報告しました。攻撃では非公開の会話を列挙し、共有されていない会話のメッセージを取得して、選んだデータを外部サーバーへ送信できました。利用者に必要なのはリンクを開くことだけで、検証した版の一つでは約4.5秒後にコードが自動実行されました。OpenAIは10月26日に修正し、深刻度をP1に分類して、研究者に合計5,000ドルの報奨金を支払いました。
攻撃はChatGPTのHTMLプレビュー機能と対話型グラフ機能を組み合わせていました。プレビューのコードは異なるウェブアドレスの制限付きフレームで動き、ChatGPT本体のページを直接読み取れませんでした。一方、グラフ機能が読み込む数式入力ライブラリーMathLiveは、本体ページにメッセージを受け取る仕組みを追加していました。この仕組みは送信元のウェブアドレスやウィンドウを確認せず、仮想キーボード用のHTMLをメッセージから受け取っていました。プレビューからメッセージを送ることで、隔離フレームとログイン中のページの境界を越え、キーボードの配置を置き換えられました。
MathLiveが渡された配置を表示すると、HTMLがChatGPTのページに挿入されました。研究者は、フレームのHTMLを直接指定するsrcdoc属性を使い、サンドボックスのない文書を作成して、そのコードにchatgpt.comの識別情報を持たせました。ページ上のリソースを制限するコンテンツセキュリティポリシー(CSP)はインラインJavaScriptを遮断しましたが、YouTube由来のスクリプトは許可していました。研究者はYouTubeのoEmbed機能を利用しました。この機能のJSONP形式の応答はコールバックを含むJavaScriptで、エラー応答にもコールバックが残るため、新しいフレーム内でコードを実行できました。
初期の検証には研究者が管理するChatGPTアプリが必要でした。その後、研究者は本物のグラフとアシスタントが作成したHTMLプレビューを一つの公開会話に置き、共有リンクにメッセージ受信の仕組みと攻撃コードを含めました。安定した再現手順では利用者がプレビューを一度クリックし、後の版ではプレビューが自動で開きました。チームはページを完全に再読み込みした場合も含め、自動実行を3回再現しました。グラフとプレビューはどちらが先に読み込まれるか一定しなかったため、コードは限られた時間、メッセージ送信を繰り返しました。
研究者によると、挿入されたコードは画面に表示された文章を読むだけでなく、利用者の認証済みセッションでChatGPTの会話APIを呼び出しました。研究者は非公開の会話内容を取得し、その応答の一部を自分たちが管理するサーバーに送ることを実証しました。また、同じ方法で、ログイン状態の画面が提供するほかの操作にもアクセスできると説明しました。OpenAIはJavaScriptの実行と非公開会話の取得を再現しました。研究者の記録では、メッセージからHTMLへ至る経路を10月13日に確認し、10月18日に報告を提出、OpenAIは10月21日に再現して深刻度をP2からP1へ引き上げました。10月26日、同社は修正の完了を確認しました。修正ではウェブ版2種類を更新し、MathLiveのフレーム越しのメッセージを拒否するようにしました。