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 处理器并未实现自己的检查。