AutoJack:單一頁面即可讓 AI 代理宿主遭受遠程代碼執行
一種名為 AutoJack 的新型漏洞鏈針對 AutoGen Studio,使 AI 代理渲染的惡意網頁能夠通過本地 MCP WebSocket 在宿主上實現遠程代碼執行。該漏洞源於對本地主機來源的信任、缺失認證以及未經驗證的命令執行。微軟已在開發分支中修復此問題,且該漏洞從未出現在 PyPI 版本中。
近期對 AI 代理框架安全性的持續研究發現,AutoGen Studio(微軟 AutoGen 的開源原型用户界面)中存在一個漏洞鏈,允許由瀏覽型代理渲染的不可信網頁內容通過本地模型上下文協議(MCP)WebSocket 在宿主上執行任意命令。研究人員將這種技術命名為 AutoJack,其核心在於利用代理作為“迷糊代理”,跨越許多開發者工具所依賴的本地主機信任邊界。
研究人員已向微軟安全響應中心(MSRC)報告此行為,隨後維護者在主分支的提交 b047730 中加強了安全性。該問題在開發過程中被發現並解決。受影響的 MCP WebSocket 接口從未包含在 PyPI 發佈版本中,因此通過 PyPI 安裝 AutoGen Studio 的用户不會暴露於該特定漏洞鏈。
更廣泛的教訓是:如果代理能夠瀏覽不受信任的頁面並與特權本地服務通信,迴環地址可能成為攻擊面,控制平面必須經過認證、授權和隔離。
為何關注代理框架
現代 AI 代理不僅僅是文本生成器。它們讀取文件、瀏覽頁面、調用 API 並執行工具。這正是其有用之處,也是研究人員投資於發現連接模型與工具的框架中系統性執行風險的原因。在本系列之前的研究中,研究人員已經覆蓋了微軟 Semantic Kernel 中的 RCE 原語。本文將向上移動一層,關注基礎設施和麪向開發者的原型表面,展示當原型在無防護措施運行時,相同的代理能力如何成為遠程代碼執行的傳輸通道。
結論並非要避免使用原型,而是:當核心服務器或筆記本電腦上的代理能夠瀏覽開放網絡並同時與特權本地服務通信時,localhost 就不再是信任邊界。防禦者需要為此做好規劃,而這些發現正是原因。
什麼是 AutoGen Studio
AutoGen Studio 是基於 AutoGen(微軟研究院的多代理系統框架)的用户界面。它允許開發者組合代理、附加工具(包括 MCP 服務器)並快速運行實驗。其文檔明確説明了預期用途,即是一個研究原型,具有為便於迭代而非硬化部署而調整的默認值。
AutoJack 漏洞鏈概覽
以下説明僅用於演示目的。該漏洞鏈在當前版本中無法工作,此處包含是為了讓防禦者能在其他代理框架中識別出該模式。
漏洞鏈結合了 AutoGen Studio 的 MCP WebSocket 接口中的三個獨立弱點:
- 來源白名單信任本地主機——但本地代理本身就是本地主機(CWE-1385:WebSocket 中缺少來源驗證):MCP WebSocket 僅接受 Origin 為 http://127.0.0.1 或 http://localhost 的連接。這阻止了指向 evil.com 的瀏覽器,但無法阻止由同一機器上 AutoGen 代理擁有的無頭瀏覽器渲染的 JavaScript。
- 認證中間件對 MCP 路徑是可選加入(CWE-306:關鍵功能缺少認證):AutoGen Studio 中的認證中間件顯式跳過了 /api/mcp/*(和 /api/ws/*),假設這些路徑會自行檢查。但 MCP WebSocket 處理器並未實現後續檢查,導致無論應用其餘部分配置何種認證模式,MCP WebSocket 都會接受無認證的連接。
- 來自 URL 的 StdioServerParams 被直接執行(CWE-78:OS 命令中特殊元素未正確中和):端點接受 server_params 查詢參數,base64 解碼 JSON 對象為 StdioServerParams,並將命令和參數直接傳遞給 stdio_client(...)。沒有白名單——calc.exe、powershell.exe -enc ... 或 bash -c '...' 都被接受為“MCP 服務器”。
將以上三點與由同一機器上的 AutoGen 代理渲染的開放互聯網網頁結合起來,就形成了遠程代碼執行原語。無需用户交互,只需代理渲染攻擊者的頁面。
圖 1 展示了端到端利用鏈:攻擊者頁面由本地瀏覽代理渲染;頁面打開 WebSocket 連接至 ws://localhost:8081/api/mcp/ws/?server_params=;AutoGen Studio 解碼有效負載並在開發者賬户下生成攻擊者提供的命令。
研究人員將這種技術命名為 AutoJack:攻擊者劫持瀏覽代理,將其用作“迷糊代理”,跨越本地主機邊界進入 AutoGen Studio 的 MCP 控制平面。
漏洞鏈解剖
問題 1:代理自身繞過的來源白名單
AutoGen Studio 的 MCP WebSocket 依賴傳統防禦來防止瀏覽器驅動的跨站 WebSocket 劫持(CSWSH):僅允許來自 127.0.0.1 / localhost 的同源連接。allowed_origins = [“http://127.0.0.1”, “http://localhost”]。對於打開標籤頁訪問 evil[.]com 的人類用户,這是正確的控制措施。瀏覽器會設置 Origin 頭為 hxxps://evil[.]com,檢查失敗,連接被拒絕。
但僅靠來源檢查對於代理來説並非正確的控制措施。裝備了內置網頁瀏覽工具(如 MultimodalWebSurfer、fetch_webpage_tool、任何基於 Playwright 的瀏覽工具或運行 requests/websockets 的代碼執行工具)的 AutoGen 代理是工作站上的一個進程。它加載的任何內容都繼承了本地主機身份。該無頭瀏覽器執行的任何 JavaScript 的“來源”都是代理導航到的頁面——而它隨後發起的 WebSocket 調用攜帶的 Origin 滿足白名單。
圖 2 展示了通過代理繞過來源的過程:AutoJack——開發者工作站上的瀏覽代理被外部內容引導進入本地主機上的 AutoGen Studio MCP 控制平面,溶解了迴環信任邊界。
問題 2:認證中間件將 MCP 排除在外
AutoGen Studio 支持多種認證模式(無、github、msal、firebase)。所有模式都集成在單個 AuthMiddleware 中,該中間件在 FastAPI 路由調度之前運行。在 PyPI 版本中,該中間件包含對 WebSocket 類型路徑的提前返回:
if request.url.path.startswith("/api/ws") or request.url.path.startswith("/api/mcp"):
return await call_next(request)這意味着 MCP 路徑跳過認證,而 MCP WebSocket 處理器並未實現自己的檢查。