当社のAIエンジンNeutronが、UCバークレーのCyberGymベンチマークで97.1%のスコアを記録しました。 詳細を見る

ディープダイブ

ディープダイブ

ChatGPT: 共有リンク経由の MathLive サンドボックス脱出でアカウント乗っ取り

悪意のある ChatGPT 共有リンクが MathLive の未検証メッセージ経由で被害者のセッション内で攻撃者の JavaScript を実行できました。OpenAI は 10 月 26 日に修正済み。

要点

  • 悪意のある公開 ChatGPT 共有リンクは、それを開いたログイン済みユーザーのセッション内で攻撃者の JavaScript を実行でき、その ChatGPT アカウントとして行動することを可能にしました。Parameter Security はこの連鎖を 2026 年 10 月 18 日に OpenAI へ報告しました。
  • 2026 年 10 月 26 日より前に攻撃者の共有会話を開いた人は誰でも潜在的な被害者でした。アプリのインストールも、ワークスペースへの参加も、攻撃者経由のログインも不要で、リンクを開くだけでした。
  • OpenAI は本件をP1 に分類し、2026 年 10 月 26 日に Web フロントエンドの 2 つのバージョンで修正しました。CVE は未割り当てで、実際の悪用の報告はありません。
  • ChatGPT の修正は展開済みです。MathLive を組み込むチームは独自のメッセージハンドラを監査してください。公開記事は各統合の修正状況を示していません。

影響を受けるか?

ChatGPT ユーザーとして、以下がすべて同時に成り立つ必要がありました。

  • 信頼できない提供元から公開 /share/ リンクで共有された ChatGPT の会話を、2026 年 10 月 26 日より前に開いた。
  • その会話が、グラフと HTML Preview の両方を意図的に含むように作られていた。
  • 最も確実な攻撃版では、ページを開いた後に Preview ボタンを 1 回クリックした。後の版ではリンクを開くことだけが唯一のステップで、Parameter はこの自動経路をハードリフレッシュ後も含め 3 回再現しました。

この欠陥は ChatGPT の Web フロントエンドにあり、そこで修正済みのため、今日細工された共有を開いてもペイロードは実行されません。Parameter は非公開会話の読み取り実証を、自身が管理する別々のアカウント間で行っており、実際の悪用は報告していません。

ChatGPT の対話型グラフの表示に使われるライブラリ MathLive を独自の Web アプリに組み込んでいる場合、別の露出が当てはまります。

  • ページが MathLive を読み込み、画面上の数式キーボード向けの postMessage リスナーをインストールしている。
  • 攻撃者の影響を受けうるコンテンツが同じページのフレーム内で実行できる。埋め込みプレビュー、サンドボックス化ウィジェット、ユーザー作成の HTML などです。
  • リスナーがキーボード設定を変更するメッセージを処理する。MathLive の最上位コントローラが任意のオリジンからのメッセージを受け入れていたためです。

プロジェクトで MathLive を使用しているか確認してください。

grep -A1 '"node_modules/mathlive"' package-lock.json
grep -rn "mathlive" --include=*.ts --include=*.js --include=*.vue --include=*.tsx src | head -20

修正方法は?

ChatGPT ユーザーがインストールやリセットをすることはありません。OpenAI は修正を Web フロントエンドの 2 つのバージョンに展開し、2026 年 10 月 26 日までに両者が攻撃が依存していた MathLive のクロスフレームメッセージを拒否するようになりました。

独自の MathLive 統合について、公開記事は修正済みの上流バージョンを特定していません。npm レジストリの最新版は v0.111.1 ですが、GitHub Releases は依然として v0.100.0 を最新版と表示しています。このページだけではパッケージの全リリースを把握できません。更新だけでこの攻撃を防げると考えず、メッセージハンドラを確認してください。Parameter の防御策を統合レベルで適用します。

  1. 状態を変更するメッセージを処理する前に送信者を検証する。送信者の Web アドレスである event.origin と、許可を与えた正確なウィンドウである event.source の両方を確認します。
  2. ウィンドウ間の設定をデータとして扱い、HTML として扱わない。キーボードレイアウトなどの構造を受信ページの innerHTML に代入してはなりません。
  3. 信頼できないフレームが内容に影響を与えうる限り、動的に生成する文書はサンドボックス化を保つ。細工された srcdoc iframe がページの識別情報を継承できないようにするためです。
  4. コンテンツセキュリティポリシーを、攻撃者の制御する HTML がメインページに達した後の唯一の障壁ではなく、補助的な制御として扱う。

これらの対策は統合の境界に対処するものです。ライブラリのセキュリティアドバイザリとリリースノートを確認し、導入するバージョンで該当するメッセージ処理の動作を検証してください。

根本原因は?

Preview のサンドボックスは機能していました。同じページの 2 番目の機能である MathLive の画面キーボードが、その境界を越える扉を開いていたのです。Parameter の writeup はこの連鎖を端から端まで文書化しています。

ChatGPT は HTML コードブロックを Preview 機能で別の Web アドレス上の制限付きフレーム内に表示するため、そのフレームは周囲のログイン済みページを読めません。同じ会話内の対話型グラフが数式組版ライブラリ MathLive をメインの chatgpt.com ページに読み込みます。MathLive の読み込みは、その仮想キーボードに関するメッセージのリスナーをインストールします。Parameter は、このリスナーが任意の送信者からのキーボードレイアウト変更メッセージを受け入れ、そのレイアウトが生の HTML を運べることを発見しました。難読化を解除した制御フローは次と等価でした。

window.addEventListener("message", (event) => {
  if (event.data?.type !== "mathlive#virtual-keyboard-message") return;
  if (!validateOrigin(event.origin, this.originValidator)) return;
  this.handleMessage(event.data, event.source);
});

if (message.action === "update-setting" && message.layouts) {
  this.layouts = message.layouts;
}

Parameter によれば、最上位コントローラはオリジンポリシー none を使用しており、任意の Web アドレスがメッセージを送れたことを意味します。また、update-setting メッセージが事前に承認されたウィンドウから来ることを要求していませんでした。レイアウトの正規化は markup フィールドを保持するため、攻撃者の HTML は生き残りました。キーボードが表示されると、レイアウトは実際の ChatGPT ページ内の HTML シンクに到達します。

keyboardContainer.innerHTML = MathfieldElement.createHTML(keyboardHtml);

createHTML ヘルパーはサニタイザーのように見えましたが、実際は入力を変更せずに返すラッパーとして振る舞い、文字列を信頼済みとマークして変更なしに通していました。Parameter の要約では、3 つの設計上の決定がこれを完全な悪用に変えました。

  • MathLive はどのフレームが送信したかを証明せずに、状態を変更するメッセージを受け入れていた。
  • メッセージ形式がキーボードレイアウトデータとして生の HTML を許していた。
  • その HTML が chatgpt.com の識別情報を継承する非サンドボックス文書を生成できた。

どう悪用されるか?

  1. 攻撃者は本物の対話型グラフと、その後ろに置いたアシスタント作成の HTML ブロックを含む ChatGPT 会話を作成します。グラフがメインページに MathLive を読み込み、HTML ブロックは Preview として表示されます。
  2. 攻撃者は ChatGPT の通常の共有機能でその会話を公開し、公開 /share/<id> リンクをメール、チャット、チケット、SNS で被害者に送ります。
  3. 被害者がリンクを開きます。Preview フレームはメインページに 2 つのメッセージを送ります。update-setting メッセージが仮想キーボードレイアウトを攻撃者の HTML に置き換え、show メッセージが MathLive にそれを表示させます。
  4. MathLive はメインの chatgpt.com ページの innerHTML にその HTML を書き込みます。挿入された HTML は srcdoc 属性を持ち sandbox 属性を持たない iframe で、ブラウザは chatgpt.com の識別情報を継承する新しい文書を生成します。
  5. ChatGPT のコンテンツセキュリティポリシーはインラインスクリプトを拒否しますが www.youtube.com のスクリプトを許可します。フレームは JSONP 風のコールバックパラメータに攻撃者の JavaScript を載せた YouTube の oEmbed URL を読み込み、そのエンドポイントは検証エラー応答の中にそれを返します。
  6. コールバックは新しいフレーム内で chatgpt.com として、被害者のログイン済みセッションで実行され、ChatGPT の認証済み API を直接呼び出せます。

メッセージ送信コードと YouTube の URL は Parameter の writeup で公開されており、上の 2 つのコード抜粋もそこからです。

攻撃の流れは?

共有リンクがグラフを読み込んで信頼済みリスナーを設置し、サンドボックス化された Preview がそれを使って攻撃者の HTML をメインページに押し込み、許可された YouTube スクリプトが仕上げを行います。

flowchart LR A["攻撃者がグラフと Preview を含む
会話を共有"] --> B["被害者が公開
/share リンクを開く"] B --> C["グラフが chatgpt.com に
MathLive を読み込む"] C --> D["Preview が update-setting を
postMessage(オリジン未検証)"] D --> E["MathLive がレイアウト HTML を
innerHTML に書き込む(無検証)"] E --> F["非サンドボックスの srcdoc iframe が
chatgpt.com の識別情報を継承"] F --> G["YouTube の JSONP スクリプトが実行
(CSP が youtube を許可)"] G --> H["攻撃者の JS が被害者として行動:
非公開チャットを読む、全操作"]

攻撃者に何ができるか?

ペイロードは本物の ChatGPT ページと同じ認証済みアクセスで実行されたため、その到達範囲は画面にたまたま表示されていたものに限定されませんでした。Parameter は 3 つの具体的な能力を実証しました。

  • GET /backend-api/conversations を呼び出して被害者の最近の会話を列挙。
  • 会話詳細エンドポイントを呼び出して、攻撃者に共有されたことのない非公開会話の内容を取得。
  • 通常の画像リクエスト経由で、その会話の選択した断片を研究者が管理するサーバーへ送信。

ペイロードはページ自身のブートストラップデータを解析してセッションのアクセストークンとアカウント ID を取得し、リクエストヘッダーで使用しました。Parameter の評価では、これは Web アプリを通じた被害者アカウントの完全な制御に相当します。研究者は「essentially, we could perform any action on behalf of the victim's ChatGPT account」と書いています。限界は認証済みフロントエンドにできることであり、実証が選んだエンドポイントではありません。

条件は控えめでした。会話を作る攻撃者の通常の ChatGPT アカウント、リンクの配信経路、そして最大 1 回の被害者の操作です。OpenAI はコード実行と非公開チャット読み取りの両方を再現した後、本件を P1 に分類しました。

なぜ修正が効くのか?

OpenAI の修正は、メインページが送信者を信頼するのをやめさせます。Web フロントエンドの両バージョンが報告で使われた MathLive のクロスフレームメッセージを拒否するようになったため、信頼できない Preview はキーボードレイアウトを置き換えたりログイン済みページに HTML を注入したりできなくなりました。修正はサーバー側で、ユーザーは何もインストールしません。展開中、OpenAI はコンテンツセキュリティポリシーも変更し、1 つのフロントエンドがまだ更新を待っていた間に連鎖の一部をブロックしました。

YouTube の段階は原因ではなく、コンテンツセキュリティポリシーの回避策だったと Parameter は指摘します。そのエンドポイントだけをブロックしても、JavaScript への 1 つの経路を除くにすぎず、信頼できない Preview がメインページに HTML を押し込む力は残ります。そのため修正は、すべてのペイロード亜種が越える必要のあるメッセージ境界を対象にしています。

侵害されたか確認するには?

Parameter は、この攻撃を事後に確実に検出する手順を公開していません。ペイロードは被害者の既存のブラウザセッションを使うため、セッション履歴に異常がなくても悪用は否定できません。不正な操作が疑われる場合は、ChatGPT のセキュリティ設定でアクティブなセッションを確認し、OpenAI のアカウント保護ガイドに従ってください。漏えいの可能性がある秘密情報と利用可能な組織のログは、インシデント対応手順に沿って調査してください。非公開チャットの読み取りが必ずデータエクスポートのイベントを残すとは限りません。

独自の MathLive 統合については、監査はログ側ではなくコード側です。設定を扱うすべての postMessage リスナーを探し、それぞれが送信者を検証していることを確認してください。event.origin と event.source を検証せずにメッセージを処理するリスナーは、ページが何であれ同じ種類の欠陥です。

10 月 13 日の初回確認から 10 月 26 日の OpenAI の修正、10 月 28 日の公開 writeup までの開示タイムライン。
図 1: Parameter は 2026 年 10 月 13 日に注入経路を確認し、5 日後に報告し、OpenAI は 10 月 26 日に Web フロントエンドの両バージョンを修正しました。出典: Parameter Security の writeup、2026 年 10 月 31 日確認。

年表

  • 2026-10-13: Parameter が ChatGPT の本番コードに対する MathLive のメッセージから HTML への経路を確認。
  • 2026-10-14: 通常の UI 経由で連鎖が再現され、任意の JavaScript に拡張。
  • 2026-10-16: 別々のアカウントとワークスペース間で、Preview の 1 クリックによる共有リンク経由の配達を確認。
  • 2026-10-17: 共有ナビゲーションからの自動 Preview を確認し、ハードリフレッシュ後も再現。
  • 2026-10-18: Parameter が OpenAI のバグバウンティに報告を提出。
  • 2026-10-19: 制御された非公開会話の読み出し実証を追加。
  • 2026-10-21: OpenAI が問題を再現し、深刻度を P2 から P1 に引き上げ。
  • 2026-10-22: OpenAI が 1 つの Web フロントエンドの修正済みを報告。2 つ目は更新中。
  • 2026-10-23: コンテンツセキュリティポリシーの変更が連鎖の一部をブロック。1 つの更新が残る。
  • 2026-10-26: OpenAI が両フロントエンドの拒否を確認し問題を解決、合計 5,000 米ドルの報奨金を支払う。
  • 2026-10-28: Parameter が技術 writeup を公開。

よくある質問

ChatGPT ユーザーがすべきことはありますか?

いいえ。修正は OpenAI 側にあり、Web フロントエンドの両バージョンに展開済みで、インストールやリセットは不要です。

実環境で悪用されましたか?

実際の悪用の報告はありません。Parameter は非公開チャットの実証を自身の管理する別々のアカウント間で行い、The Hacker News は 2026 年 10 月 31 日、同社が実際の悪用を報告していないと伝えました。深刻度は実証された能力によるもので、観測された悪用によるものではありません。

MathLive 自体は修正されていますか?

公開記事は MathLive の修正済みリリースを特定していません。インストール済みパッケージとメッセージ処理を確認してください。GitHub Releases は npm の全バージョンを網羅していません。上記の統合レベルの確認を実施してください。

Preview のサンドボックスはなぜ防げなかったのですか?

サンドボックスは直接のアクセスを防ぎました。Preview 内のコードはメインの ChatGPT ページを読めませんでした。入口は同じページの 2 番目の機能でした。グラフが MathLive を読み込み、MathLive のキーボードリスナーが任意のフレームからの指示を受け入れ、信頼できない Preview が信頼済みページに HTML を渡せるようにしていました。

露出の規模はどの程度でしたか?

ChatGPT の Web フロントエンドは最も利用者の多い Web アプリケーションの一つで、OpenAI 自身が 2025 年 9 月に週間アクティブユーザー 7 億人を報告しています。共有リンクを開きうるすべてのログイン済みユーザーが、2026 年 10 月 26 日まで対象でした。ただし露出規模はそのまま影響を意味しません。実際の悪用の報告はありません。

ペイロードはチャットを読む以上のことができましたか?

はい。ペイロードは被害者のセッションで ChatGPT 自身の認証済み API を呼び出したため、通常のフロントエンドが到達できるすべてに到達でき、会話だけには限られませんでした。Parameter は非公開チャットの読み取りと選択した値の持ち出しを実証し、この基本能力をアカウントに代わってあらゆる操作を行う能力と評価しました。

Ostorlab で自社アプリのどこが MathLive を組み込んでいるかを見つける

Web アプリケーションが MathLive を組み込んでいるなら、最初の疑問は「どこか」です。Ostorlab のソフトウェア構成分析はプロジェクトの依存関係の一覧を作成し、スキャンによってどのアプリが MathLive を取り込んでいるか、「修正方法は?」の統合レビューをどこで行うべきかが分かります。

参考資料

  • Parameter Security,Do the Math: How We Took Over ChatGPT Accounts,2026 年 10 月 28 日:https://www.parameter.ai/labs/we-found-a-gap-at-openai(2026 年 10 月 31 日確認)
  • The Hacker News,A Shared ChatGPT Link Could Run Attacker Code in Your Session and Read Private Chats,2026 年 10 月 31 日:https://thehackernews.com/2026/10/a-shared-chatgpt-link-could-run.html(2026 年 10 月 31 日確認)
  • MathLive のセキュリティアドバイザリ:https://github.com/arnog/mathlive/security/advisories(2026 年 10 月 31 日確認)
  • MathLive: https://registry.npmjs.org/mathlive/latest ; https://github.com/arnog/mathlive/releases
  • 週間ダウンロード数を掲載する MathLive のパッケージページ:https://www.npmjs.com/package/mathlive(2026 年 10 月 31 日確認)
  • OpenAI, How people are using ChatGPT (2025-09-15): https://openai.com/index/how-people-are-using-chatgpt/