vm2 沙箱逃逸将智能体的提示注入变成主机 RCE
2026 年在 vm2(许多智能体框架用来运行模型生成的 JavaScript 的 Node.js 库)中披露的一波逃逸漏洞,使一次提示注入得以突破沙箱并在主机上执行命令。
这是什么?
在 2026 年上半年,安全研究人员披露了 vm2 中的一波沙箱逃逸漏洞。vm2 曾是一个流行的 npm 库,用于在受限条件下(例如受限的模块白名单)运行不可信的 JavaScript。首个严重逃逸出现在 2026 年 1 月(由 StepSecurity 与 Semgrep 记录),随后在 2026 年 5 月 4 日至 5 日又出现了十多个额外标识符,大多数评分介于 CVSS 9.0 到 10.0 之间(Kodem Security,2026 年 5 月 14 日)。
之所以这是 AI 安全网站的议题而非普通的 Node.js 漏洞,关键在于 vm2 所处的位置。许多 AI 智能体框架使用 vm2 作为执行模型自身生成的代码的隔离层。2026 年 5 月 7 日,微软安全研究团队为由此产生的结构性问题命名:在提示可以影响可执行逻辑的智能体框架中,一次沙箱逃逸会把一次提示注入转化为主机级别的远程代码执行——「When prompts become shells」。
工作原理
整个链条分为四个阶段,且没有一个阶段需要新颖的漏洞利用——只需一个已知的逃逸原语,以及一个被配置为运行生成代码的智能体。
首先,不可信的 JavaScript 到达 vm2。在插件类产品或 SaaS 中,来源是用户提交的代码。在智能体中,来源是模型自身的输出:一个允许智能体「编写并运行脚本」的工具,会欣然执行攻击者通过注入到网页、文档或工具结果中的指令所引导出的脚本。
其次,代码触发沙箱边界滥用。vm2 的隔离几乎完全在 JavaScript 层面实施——重写 catch 子句、用代理桥接跨越边界的对象,并逐一为已知逃逸路径打补丁。2026 年的各项披露各以不同方式击破该模型:绕过 Promise 回调的净化、滥用 SuppressedError 及其他异常处理、__lookupGetter__ 与 getPrototypeOf 技巧、通过 inspect() 进行代理解包,以及原型污染链。它们都产生同样的结果——一个到达主机 realm 中对象的引用、回调或属性查找。
// 易受攻击的形式(示意):智能体在 vm2 中运行模型生成的 JS
const { VM } = require('vm2');
const result = new VM().run(modelGeneratedCode); // [REDACTED] 逃逸原语在此执行
接下来是主机能力访问。一旦逃出沙箱,代码即可访问 Node 的 process 对象,并由此触及 child_process、文件系统和出站网络。5 月的一份公告正是一个直达 child_process 的白名单绕过。第四阶段是载荷执行:任意 shell 命令以 Node.js 运行时的权限执行——在智能体部署中,这往往意味着可访问环境密钥、云凭据和内部网络。
为什么重要
单纯的提示注入通常是输出层问题:模型说了不该说的话。一旦经由易受攻击的执行沙箱,同样的注入就变成基础设施层问题:攻击者在主机上获得了 shell。这是影响范围的质变,也正是微软和跟踪这波漏洞的响应团队所指出的组合。
有两个特性使 vm2 不适合承担此任务。它有多年的沙箱逃逸历史,且其维护者已弃用该项目——因此补丁并非可靠的持续供给。而且其隔离模型对该漏洞类别没有结构性防御;每个 CVE 都是对某个新原语的一次性修补,这正是 2026 年出现的是一批而非单个漏洞的原因。一个现实的假设是:更多变体正在路上,同样的「prompts become shells」框架也会随着研究人员的关注而扩展到其他 JavaScript 沙箱。
关于暴露面的实际问题不是「是否安装了 vm2」(SCA 扫描即可回答),而是不可信的提示能否到达经由 vm2、并挂载了真实工具的动态执行路径。一个通过 vm2 评估硬编码内部脚本的 Web 应用,与一个在 vm2 中以 shell 访问运行 LLM 生成代码的智能体,在依赖清单中看起来完全相同,却承担着截然不同的风险。
防御
- 不要把 vm2(或任何进程内 JS 沙箱)当作安全边界。 如果必须执行不可信或模型生成的代码,请在其下叠加真正的隔离——独立容器、gVisor 或 Firecracker——让逃逸落入一个一次性的、最小权限的环境,而不是落在你的主机上。
- 打补丁,但要规划迁移。 将 vm2 升级到最新已修补版本以关闭当前已披露的原语,并优先从这个已弃用的库迁移到一种积极维护的不可信执行方案。
- 限制智能体的工具。 一个无法调用
child_process、无法在临时目录之外写入、也无法访问白名单外网络目的地的智能体,就无法把沙箱逃逸变成基础设施沦陷。限制工具比重构执行模型部署得更快。 - 从执行上下文中剥离凭据。 运行不可信代码的 Node.js 进程不应携带 AWS/GCP 密钥、注册表令牌或 CI 密钥。请使用范围受限、短有效期的令牌,并移除环境中的常驻凭据。
- 在运行时监控。 排查启动 shell 或
child_process调用的node进程、对~/.aws/credentials或/proc/self/environ等文件的异常读取,以及智能体运行时向白名单外域名的出站流量。逃逸发生在进程内部,因此捕获它的是行为遥测——而不仅仅是依赖扫描。 - 梳理你的执行路径。 盘点每一个在直接或传递依赖树中出现 vm2 的服务,并标记出不可信或 LLM 生成的代码能够真正到达它的那些。该子集才是真正的暴露面。
状态
| 项目 | 值 |
|---|---|
| 受影响组件 | vm2(Node.js 不可信 JavaScript 沙箱),已被维护者弃用 |
| 性质 | 多个沙箱逃逸 → 主机 RCE 漏洞 |
| 披露时间窗 | 2026 年 1 月(CVE-2026-22709)与 2026 年 5 月 4 日至 7 日的一批(10+ 个 CVE,CVSS 9.0–10.0) |
| AI 相关性 | 智能体框架在 vm2 中运行模型生成的 JS → 提示注入到主机 RCE |
| 修复版本 | vm2 直至 3.11.x 分支的已修补版本(部署前请核对当前公告) |
| 参考 CVE | CVE-2026-22709、CVE-2026-24118、CVE-2026-24120、CVE-2026-24781、CVE-2026-26332、CVE-2026-26956、CVE-2026-43997、CVE-2026-43999、CVE-2026-44005(及 2026 年 5 月相关标识符) |
关键日期:2026 年 1 月 26 日——披露 2026 年首个逃逸。2026 年 5 月 4 日至 7 日——一批 10+ 个逃逸。2026 年 5 月 7 日——微软发布关于智能体框架层面影响的「prompts become shells」分析。
本文出于防御目的介绍一类已公开披露的漏洞,并有意省略任何可用的漏洞利用代码。
Sources
- → https://www.microsoft.com/en-us/security/blog/2026/05/07/prompts-become-shells-rce-vulnerabilities-ai-agent-frameworks/
- → https://www.kodemsecurity.com/resources/vm2-sandbox-escape-vulnerabilities-the-2026-cve-wave-turning-ai-agents-into-host-rce-vectors
- → https://semgrep.dev/blog/2026/calling-back-to-vm2-and-escaping-sandbox/
- → https://www.stepsecurity.io/blog/cve-2026-22709-critical-sandbox-escape-vulnerability-in-vm2
- → https://nvd.nist.gov/vuln/detail/CVE-2026-22709
- → https://socradar.io/blog/cve-2026-26956-vm2-sandbox-escape-rce-node-js-25/