攻擊鏈如何透過單一連結觸發

研究團隊發現,攻擊者可以建立一個包含特定內容的 ChatGPT 對話,並使用標準的分享功能將其發布為公開連結。當受害者開啟這個連結時,原本應該被隔離在沙盒中的 HTML 預覽程式碼,能夠透過一系列技術手段突破限制,在主網頁 chatgpt.com 的上下文中執行 JavaScript。

整個過程不需要受害者安裝任何應用程式、加入專案或開啟開發者工具。在某些測試情境中,只要點擊連結並讓頁面自動載入預覽,或者僅需點擊一次預覽按鈕,攻擊程式碼就會執行。研究團隊在另一個帳號中重複驗證了自動執行的路徑,包括強制重新整理後,警報訊息約在 4.5 秒後出現。

技術細節:從沙盒逃逸到 JavaScript 執行

漏洞的起點在於兩個看似無害的功能結合:互動圖表和 HTML 預覽。ChatGPT 的預覽功能會將 HTML 代碼塊轉換為一個小型網頁,並為了安全將其運行在受限的沙盒框架中。然而,對話中的互動圖表會載入一個名為 MathLive 的數學庫,該庫在主頁面安裝了一個訊息監聽器,用於處理虛擬鍵盤的設定變更。

MathLive 的監聽器存在缺陷,它沒有驗證訊息發送者的來源(Origin)或具體視窗,且允許透過 postMessage API 接收包含原始 HTML 的鍵盤佈局設定。預覽框架中的程式碼利用這個漏洞,向主頁面發送訊息,將惡意 HTML 注入到虛擬鍵盤的佈局中。當鍵盤顯示時,這段 HTML 被寫入主頁面的 DOM 中。

為了執行 JavaScript,研究團隊在注入的 HTML 中使用了一個沒有 sandbox 屬性的 iframe,並透過 srcdoc 屬性直接嵌入內容。由於這個 iframe 是由主頁面 chatgpt.com 創建的,瀏覽器賦予它與主頁面相同的網頁身份(Origin)。這使得 iframe 內部的程式碼可以存取父頁面,從而繞過了預覽框架的隔離限制。

繞過內容安全策略(CSP)的方法

雖然獲得了與主頁面相同的身份,但 ChatGPT 的內容安全策略(CSP)仍然阻止了內聯 JavaScript 的直接執行。然而,CSP 允許從 YouTube 載入腳本。研究團隊發現 YouTube 的 oEmbed 端點支持 JSONP 風格的回調參數,這是一種將數據包裝在函數呼叫中的技術。

透過構造特定的回調名稱,研究團隊讓 YouTube 返回的錯誤響應中包含可執行的 JavaScript 程式碼。由於 YouTube 域名已被 CSP 允許,瀏覽器會將這個響應作為腳本載入並執行其中的回調函數。這使得攻擊者能夠在具有 chatgpt.com 身份的無沙盒 iframe 中執行任意 JavaScript。

實際影響:讀取私人對話與帳號接管

一旦 JavaScript 在主頁面的認證上下文中執行,它就能存取受害者已登入的會話資訊。研究團隊利用注入的程式碼呼叫 ChatGPT 的後端 API,成功列舉了受害者的最近對話列表,並讀取了從未與攻擊者分享過的私人對話內容。

為了證明數據可以被竊取,注入的程式碼將從私人對話中獲取的一小部分數據透過圖片請求發送到攻擊者控制的外部伺服器。這表明漏洞不僅僅是顯示一個警報框,而是允許攻擊者在受害者的帳號權限下執行任何前端 API 支援的操作,包括讀取檔案和修改帳號設定。

OpenAI 的修復與時間線

研究團隊於 2026 年 10 月 18 日向 OpenAI 提交漏洞報告,最初被定級為 P2。10 月 21 日,OpenAI 成功重現問題並將嚴重等級提升至 P1。修復過程涉及兩個版本的 ChatGPT 網頁前端,期間部分 CSP 變更暫時阻斷了攻擊鏈,但最終需要更新前端的訊息驗證邏輯。

2026 年 10 月 26 日,OpenAI 確認兩個前端版本均已拒絕報告中使用的跨框架 MathLive 訊息,問題已解決,並頒發總計 5,000 美元的漏洞獎金。修復的核心在於確保訊息接收者驗證發送者的網頁地址和具體視窗,並禁止跨窗口設定中包含原始 HTML。