11 月 1 日公开的 CVE-2026-120338 给所有”AI 生成界面”项目敲了一记警钟:Prefab UI 的生成式 UI 沙箱在文档里被描述为对不可信代码的隔离层——包括由大模型编写、准备直接渲染的 UI 代码——但它的实现并没有关闭逃逸通道。CVSS 3.1 评分 10.0,向量为 AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H;对已认证场景另有一条 9.9 的评分。
事件概述
受影响产品是 PrefectHQ 的 prefab-ui,影响范围 0.14.0 至 0.20.2,修复版本 0.21.0(PR #538,commit 030f074)。弱点归类为 CWE-693 保护机制失效、CWE-94 代码生成控制不当、CWE-269 权限管理不当。
架构上,生成式 UI 沙箱把调用方提供的 Python 代码跑在 Pyodide 里——Pyodide 是把 CPython 编译成 WebAssembly 的运行时——外层由 Deno 子进程承载。设计意图是:即使代码由 LLM 生成、来源不可信,也只能在沙箱里活动。
技术细节
问题出在启动参数与全局对象两处,叠加后形成完整逃逸:
// 启动器实际使用的参数(受影响版本)
deno run --allow-read --allow-write --allow-net runner.js
// 修复后(0.21.0):先加载运行时与 Prefab 源码,
// 撤销读/写/网络权限,再接受调用方代码
// 并以 --no-prompt 启动,防止权限请求二次授予
第一,启动器以无限制的 --allow-read、--allow-write、--allow-net 启动 Deno,等于沙箱进程对文件系统与网络没有约束。第二,runner 把 Deno 的 API 保留在 JavaScript 全局对象上,而 Pyodide 的 js 模块正是这个全局对象的代理。于是沙箱内的 Python 可以直接调用 Deno.readTextFileSync 和 Deno.writeTextFileSync。
后果是以服务器操作系统用户的身份读写任意文件;进一步,攻击者可以向服务器 virtualenv 的 site-packages 写入一个 .pth 文件,借 Python 启动机制实现代码执行持久化。
远程路径通常来自 FastMCP 的 GenerativeUI provider:它注册了名为 generate_prefab_ui 的 MCP 工具,把该工具的 code 参数直接转发进这个沙箱。如果 FastMCP 服务器没有配置认证,任何能访问该服务器的客户端都能调用这个工具;即使配置了认证,任何被允许调用工具的客户端同样可以。前提条件是生成式 UI 功能被显式开启,且主机安装了 Deno。研究者在 0.20.2 上完成了确认。
影响评估
这条链的危险性在于它把”提示注入”升级成”主机失守”。在 MCP 生态里,工具描述、外部文档、抓取到的网页都可能携带指令,模型一旦被引导去生成特定 UI 代码,代码就会进入这个号称隔离的沙箱,然后直接落到宿主机文件系统。整个过程不需要任何凭据,也不需要用户点击。
0.21.0 的修复思路值得其他做 AI 沙箱的项目照抄:不是靠”约定代码不干坏事”,而是先加载可信运行时,再撤销权限,最后才接受外部代码;同时用 --no-prompt 堵住代码通过权限请求重新申请能力的路径;引导阶段的网络访问收窄到 cdn.jsdelivr.net。
修复建议
- 升级
prefab-ui至 0.21.0 或更高版本,pip install -U prefab-ui后确认版本号。 - 给所有 MCP 服务器加上认证与来源限制。
generate_prefab_ui这类”接收代码并执行”的工具,不应暴露在公网,也不应允许任意客户端调用。 - 容器化部署并降权:以非 root 运行,根文件系统只读,
site-packages与 virtualenv 目录不可写,.pth持久化这条路就断了。 - 把”模型生成的代码”一律当作不可信输入。沙箱的隔离能力要以实际参数为准,不能以文档措辞为准。
- 已暴露过该接口的实例,应检查
site-packages下是否有异常.pth文件,并轮换该服务可达的所有凭据。
同批公开的还有 Beta9 的三枚 9.9 分漏洞(CVE-2026-120306 / 120307 / 120308),分别是构建阶段 Buildah 以 chroot 隔离导致共享 PID 与网络命名空间、沙箱文件 API 的路径穿越、以及卷挂载路径未校验工作区归属,三者都能让持有 workspace token 的租户读写宿主 worker 上的文件,其中 120307 的只读验证直接取到了绑定 cluster-admin 的 ServiceAccount 令牌。做多租户 AI 沙箱的平台,这两组问题值得放在一起排查。