CVSS 10 的沙箱逃逸:一行 add_provider,把模型写的 Python 送进了宿主文件系统

CVSS 10 的沙箱逃逸:一行 add_provider,把模型写的 Python 送进了宿主文件系统

Author: tengdy | Create: 2026-11-02 09:37:47 | Update: 2026-11-02 09:37:53 | 分类:MCP & CLI

MCPAgent安全沙箱逃逸供应链安全CVE-2026-120338FastMCPPrefab UI

11 月 1 日,JFrog 安全研究团队公布 CVE-2026-120338(JFSA-2026-001699278),评分 CVSS 3.1 10.0——满分。受影响的组件是 PrefectHQ 维护的生成式 UI 框架 prefab-ui,而最常见的远程利用入口,是 FastMCP 里那个叫 generate_prefab_ui 的 MCP 工具。

这件事值得单独写一篇,不是因为又一个高分 CVE,而是因为它把 MCP 生态里一个被反复打包票的说法拆开了:"我们在沙箱里跑不可信代码"。这一次,沙箱的墙还在,地板上有扇门。

事实先摆清楚

  • 编号与评分:CVE-2026-120338,CVSS 3.1 基础分 10.0(未认证调用方场景);同一个漏洞在"调用方已认证"时评 9.9,向量为 AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H——注意 S:C(作用域变更),这是它能跨出沙箱、影响宿主的关键标记。
  • 影响范围:prefab-ui >= 0.14.0, < 0.21.0(研究员在 0.20.2 上复现)。漏洞从 0.14.0 引入这个沙箱起就在。
  • 披露与修复时间差:修复版本 0.21.0 于 10 月 26 日发布,CVE 于 10 月 31 日由 JFrog 披露、NVD 记录在 11 月 1 日更新。也就是说,公开的那一刻,补丁已经躺了六天——但这六天里,任何按旧文档部署的 FastMCP 服务仍然是敞开的。
  • 利用状态:目前不在 CISA KEV 目录,无在野利用报告。
  • 暴露前提:Generative UI 是可选开启的功能,且宿主必须装有 Deno。两个条件都满足的部署才会暴露。

沙箱是怎么漏的:三层防护,两个配置

Prefab 的 Generative UI 让 Agent 自己写 Python 来渲染界面,代码来源是模型,不可信,所以要隔离。设计上有三层:

  1. 代码跑在 Pyodide 里——Python 编译成 WebAssembly,理论上没有文件系统和网络;
  2. Pyodide 跑在一个 Deno 子进程里——Deno 本身就是"默认安全"的权限模型;
  3. 中间靠 runner.js 把两端接起来。

任何一层守住,这事就不会发生。结果三层都在按设计工作,配置把它们全部抵消了。

第一个失误在启动参数。 src/prefab_ui/sandbox/_pyodide.py 里的 PyodideSandbox._start 用 --allow-read、--allow-write、--allow-net 启动 Deno,三个参数都没带白名单值。Deno 的规则是:裸参数即放开整个类别。外层的权限系统被自己关掉了。

第二个失误在桥接层。 src/prefab_ui/sandbox/runner.js 把 Deno API 留在了 JavaScript 全局对象上。Pyodide 的 js 模块本来就是让 Python 调 JS 的,它代理的正是这个全局对象。于是沙箱里的 Python 可以直呼 js.Deno.readTextFileSync() 和 js.Deno.writeTextFileSync(),用的还是上面那套"全放开"的权限。

WebAssembly 的边界没有失效——是边界内的代码有一根直通外部的电话线。JFrog 特别指出,runner 的注释和公开文档都把这段进程描述成只读,实际不是。

从读文件到常驻后门

读到 /etc/passwd 只是演示。真正让人后背发凉的是写。

研究团队在 0.20.2 上用写权限往服务端虚拟环境的 site-packages 里放了一个 .pth 文件。Python 的 site 模块规定:.pth 文件里以 import 开头的行会被 exec() 执行。也就是说,一次工具调用可以变成"这个环境以后每次启动都执行"——沙箱之外、无沙箱、以服务进程的身份。

这就把漏洞等级从"信息泄露"抬到了"持久化控制"。CVSS 给 10.0,主要就是这个原因。

MCP 为什么让它更容易被击中

传统 RCE 的前提是攻击者能提交代码。MCP 把这个前提变成了产品功能本身:generate_prefab_ui 的参数就是 code。

而 FastMCP 的 GenerativeUI provider 只是注册这个工具,把 code 参数原样转发进沙箱,没有额外检查。更关键的是 FastMCP 的认证默认值是 auth=None——按官方文档,不配置就是没有。所以 JFrog 把"未认证"场景评为 10.0,"已认证"场景仍评 9.9。

已认证也要给 9.9,这一点对做企业部署的人更有意义:它说明认证不是这个漏洞的解。任何被允许调用工具的客户端都能打穿它。而且工具接收的是"模型写的代码",文档里一段被投毒的网页、一张带指令的截图,都足以让一个完全合规、已认证、有权限的 Agent 把恶意代码递进来。这是 OWASP LLM01(提示注入)与 RCE 的合流——不是攻击者绕过了认证,是认证通过的人替攻击者递了刀。

三个更普遍的问题

第一,MCP 的安全边界已经从协议层退到了实现层。协议只规定怎么发现工具、怎么传参数、怎么回写结果,它对"这个工具内部做了什么"没有任何约束。过去一年生态统计反复显示,绝大多数公共服务器是个人维护的薄包装,默认无认证、默认无沙箱、默认信任入参。协议本身越标准化,这些实现细节就越像暗礁。

第二,"代码执行类工具"需要单独分类。工具清单里,查天气、读工单、发消息是低风险;而接受并执行代码、模板、SQL、正则、Shell 片段的工具是另一类。后者的权限模型不能用"是否登录"来衡量,只能按"这个进程能碰到什么"来设计。generate_prefab_ui 属于后者,但它在工具清单里看起来和其他工具没有区别。

第三,文档的安全承诺不能当证据。这个沙箱被描述为对不可信代码的隔离,甚至是"只读"。它不是。对做平台评审的人来说,唯一可信的证据是启动参数、权限声明和一条能跑通的 PoC,而不是 README。

该做什么

  • 升级到 prefab-ui >= 0.21.0。0.21.0 在启动后、接受代码前撤销 Deno 的读、写、网络权限,并以 --no-prompt 启动。这一步是根治。
  • 盘一遍自己的 MCP 服务里有没有"代码参数"工具。凡是把 code / script / template / sql 直接送进解释器的工具,都按高危处理。
  • 别把 Agent 跑在运营账号下。同一批报告里,DeepSeek 的 Super-agent 原型也明确建议用独立 OS 账号隔离会话——不是一个团队的心得,正在变成行业默认。
  • 容器化收益仍然成立。哪怕沙箱漏了,进程边界、只读挂载、无出网策略能把"读整台机器"压缩成"读一个容器"。
  • 在能力上做减法。UI 渲染其实不需要图灵完备。声明式组件树(JSON + 白名单组件)能满足绝大部分"让模型画个图表"的需求,且天然没有执行面。把可执行代码从渲染链路里摘掉,比给沙箱打补丁更彻底。

一点冷水

不必恐慌:Generative UI 默认关闭,需要 Deno,目前没有在野利用。这个漏洞的价值不在于"MCP 又出事了",而在于它把一类结构性风险演示得非常干净——模型写的代码、被当作功能接受的代码、跑在一个被描述为安全的沙箱里、由一个默认无认证的工具暴露在网络上。这四个条件在今天的 MCP 生态里并不罕见,只是很少同时出现在一个 CVE 里。

补丁已经发了六天。真正的问题是:有多少部署还停在 0.20.x,以及有多少人以为自己开了沙箱。

参考来源

  • JFrog Security Research:Prefab UI RCE via a Pyodide js Bridge to Deno(CVE-2026-120338 / JFSA-2026-001699278)https://research.jfrog.com/vulnerabilities/prefab-ui-is-vulnerable-to-remote-code-execution-via-a-pyodide-js-bridge-to-deno-cve-2026-120338-jfsa-2026-001699278/
  • NVD / CVE 记录(2026-11-01 更新)https://nextguardhq.com/en/vulnerabilities/cve-2026-120338-prefecthq-prefab-ui
  • Brandefense:Inside Prefab UI's Sandbox Escape https://brandefense.io/security-news/prefab-ui-sandbox-escape-cve-2026-120338
  • DEV Community:Prefab UI's Python Sandbox Could Read and Write Your Server's Files https://dev.to/gabrielanhaia/prefab-uis-python-sandbox-could-read-and-write-your-servers-files-upgrade-to-021-1em5
  • AI Sec Watch 漏洞追踪(首次收录 2026-11-01)https://aisecwatch.com/issues/899fa0ff-3bae-4b77-a2e3-c02c2a170b8a
  • rAInvent GenAI Daily 2026-11-02 https://rainvent.ai/genai-daily-november-2-2026-deepseeks-open-source-super-agent-cvss-10-flaw-in-a-fastmcp-sandbox-openais-shared-chatgpt-codex-pool

评论(0)

暂无评论,来抢沙发~


关于本站 · RSS

浙ICP备2025156991号浙公网安备33010802013816号 浙公网安备33010802013816号 © 2026 智能体工场 - [从善如登] All rights reserved.