KeyFrame內部研究專用

Why MCP and ChatGPT Apps Use Double Iframes — Frédéric Barthelet, Alpic

AI Engineer·6月15日週一·20 min英文

三句話摘要

MCP應用在ChatGPT中使用雙層iFrame機制渲染第三方UI,以及這個設計的安全隔離原理和開發實務。 雙iFrame機制通過層級隔離和子域名分片,在保證安全邊界的前提下實現了第三方UI的安全集成,開發者需主動聲明CSP域名來配合這個設計。 CSP和Origin隔離的核心困境:直接在父層DOM中注入iFrame會共享origin,允許第三方應用存取ChatGPT的local storage和cookies,構成安全威脅;若放寬CSP政策則會被惡意腳本利用。

重點整理

重點
  • 1

    CSP和Origin隔離的核心困境:直接在父層DOM中注入iFrame會共享origin,允許第三方應用存取ChatGPT的local storage和cookies,構成安全威脅;若放寬CSP政策則會被惡意腳本利用。

  • 2

    雙iFrame的層級隔離方案:第一層iFrame在ChatGPT允許的proxy域名(如openai-usercontent.com)執行通用加載器,第二層iFrame在不同子域名中以sourceDoc方式隔離實際應用內容,兩層結合実現安全邊界。

  • 3

    子域名隔離策略:每個應用分配獨立子域名(如app-abc123.openai-usercontent.com),確保各應用的local storage、cookies和其他origin相關API互不衝突或竊取。

  • 4

    CSP元數據聲明的實務重要性:開發者必須在MCP規格中聲明所有連接域名(connect-src)、腳本域名(script-src)等,否則應用在生產環境會因CSP阻擋而失效。

實用技巧與重點

乾貨
  • 相關域名/平台:openai-usercontent.com(OpenAI用戶內容proxy域名)、Skybridge(Alpic開源框架)
  • CSP核心指令:frame-src(允許的iframe源)、script-src(允許的腳本源)、connect-src(允許的API連接)、image-src(允許的圖片源)
  • iFrame關鍵屬性:src(加載外部URL)、srcdoc(直接注入HTML內容)、sandbox(限制權限),allow-same-origin(恢復origin共享)
  • 安全機制:nonce(一次性簽名令牌)、null origin(空source)、subdomain routing
  • 開發工具:Skybridge框架内的CSP Inspector(自動檢測元數據缺失的域名)
  • 歷史參考:Facebook應用市場(2010年代首次實現此模式)

結論

結論

雙iFrame機制通過層級隔離和子域名分片,在保證安全邊界的前提下實現了第三方UI的安全集成,開發者需主動聲明CSP域名來配合這個設計。

完整解析

詳細

在MCP應用生態中引入第三方UI到ChatGPT對話介面時,面臨一個根本的安全與功能張力。ChatGPT本身通過Content Security Policy(CSP)嚴格控制所有腳本執行——每個腳本必須攜帶每次請求動態生成的nonce簽名才能執行,這保護了用戶數據,但也意味著任意第三方代碼無法直接運行。

講者Fred首先解釋了直覺但失敗的方案:若使用iFrame的srcdoc屬性直接注入應用HTML,這個iFrame會自動共享父層的origin和CSP政策,導致第三方腳本被完全阻擋。如果為了讓app運行而放寬ChatGPT的CSP,則opens出另一個漏洞——app可以存取ChatGPT的local storage和cookies,竊取用戶認證令牌或隱私數據。試圖用sandbox屬性隔離origin也行不通,因為sandboxed iFrame會喪失所有origin相關功能(local storage、cookies、indexedDB),除非加上allow-same-origin才能恢復,而那又回到原問題。

雙iFrame機制是對這個困境的優雅解答,也是Facebook應用市場時代就採用的經典模式。架構分兩層:第一層iFrame由OpenAI控制,運行在允許列表域名openai-usercontent.com上,包含一個通用的script加載器,職責是下載並解析MCP服務器提供的應用資源;第二層iFrame則由這個加載器在不同子域名(app-abc123.openai-usercontent.com、app-xyz789.openai-usercontent.com等)上動態創建,使用srcdoc直接注入應用HTML。關鍵在於,雖然第二層iFrame仍然共享origin,但因為每個應用在獨立子域名上運行,它們的local storage、cookies等origin相關資源完全隔離——app-abc123無法讀取app-xyz789的資料。

開發者端的職責是在MCP應用元數據中聲明所有依賴域名。框架如Skybridge提供CSP Inspector工具,在開發環境自動追蹤應用實際發起的所有HTTP請求,並比對元數據中聲明的域名列表,即時提示遺漏項。這解決了歷史上大量應用因CSP遺漏在提交store後才被拒或在生產環境無法運行的問題。

關鍵時刻

Pipeline v2

帶時間戳的重點,會在逐字稿層級分析上線後產生。目前請先透過原始影片觀看。

事實查核

Pipeline v2

說法查證是下一次管線升級的一部分。KeyFrame 只會顯示它真正能驗證的內容。

更多「Web2 安全」的內容

SANS Stormcast Tuesday, August 25th, 2026: DOUBLECUP PNG; WebAudio Fingerprinting; Expired Domains; Android; Car
7 min
Web2 安全英文PODCAST8月25日

SANS Stormcast Tuesday, August 25th, 2026: DOUBLECUP PNG; WebAudio Fingerprinting; Expired Domains; Android; Car

SANS Stormcast

  • PNG 容器攻擊的簡易性設計:Double Cup 不依賴複雜的 Exif 或隱寫技術,只用 PNG 副檔名和檔頭來偽裝,核心是利用 findstr 指令的常見可用性讓執行變得無需額外工具。
  • Web Audio API 的隱密指紋識別:音訊於增益零的無聲狀態下播放,使用者完全無感,但錄製波形足以建立裝置特徵,在瀏覽器原生功能層面難以區分是反詐欺還是過度追蹤。
  • 域名過期引發的串聯漏洞:DMARC 報告端點使用過期域名是常見疏漏,允許攻擊者透過簡單的域名註冊取得他人的 SPF/DKIM 錯誤報告,進而收集目標系統配置情報。
Risky Bulletin: Expired credit cards can be used for malicious transactions
5 min
Web2 安全英文PODCAST8月24日

Risky Bulletin: Expired credit cards can be used for malicious transactions

Risky Business

  • 支付安全的非對稱風險:Visa卡利用未加密的卡片資料與NFC通訊,攻擊者可藉由中間人技術竄改過期日期進行交易,但MasterCard、美運卡與Discover的防護更完善,顯示不同發卡機構的安全架構存在明顯差異。
  • 國家級駭客活動的連鎖延伸:北韓Lazarus集團在2月單一事件已累積100名受害者,涵蓋大學、警察部門、媒體與醫療機構,伊朗駭客則針對基礎建設如電力系統發動破壞性攻擊,反映地緣政治在網路戰爭中的升溫。
  • AI加速漏洞生態的雙面刃:AI工具催生近2萬份漏洞概念驗證代碼發布,但同時也導致大量失效漏洞代碼氾濫,增加資安團隊甄別真實威脅的難度;Mayer Protocol遭攻擊事件中,駭客用AI鏈接六個無關的小漏洞完成盜竊170萬美元的攻擊。
SANS Stormcast Monday, August 24th, 2026: More Entra Powershell; Entra Vulnerability; GitLab Vuln (and PoC); GTA 6 Leak Malware
5 min
Web2 安全英文PODCAST8月24日

SANS Stormcast Monday, August 24th, 2026: More Entra Powershell; Entra Vulnerability; GitLab Vuln (and PoC); GTA 6 Leak Malware

SANS Stormcast

  • Microsoft EntraID 的遠端代碼執行漏洞已由微軟修補,初期報告顯示已遭利用但後來更正為未遭利用。這反映 Microsoft 在雲端軟體安全上的透明度提升,對漏洞採用與內部軟體相同的 CVE 編號和公告流程。
  • PowerShell 指令碼可用於驗證 MFA 部署完整性,特別是找出未啟用 MFA 的遺漏帳號。同時可以分析 EntraID 登入日誌中的異常行為,如風險係數評估和地理位置檢測,幫助組織快速識別可疑登入。
  • GitLab 的 GraphQL 代碼注入漏洞允許未認證攻擊者刪除或修改儲存庫,潛在導致供應鏈攻擊。已有公開概念驗證 (PoC) 存在,使用內部部署 GitLab 的組織必須立即修補。