vm2 JavaScript沙箱发现13个严重漏洞,可执行任意代码

研究人员在vm2 JavaScript沙箱库中发现13个严重漏洞,攻击者可借此突破容器限制并在宿主系统执行任意命令。其中CVE-2026-26956可在特定Node.js 25与WebAssembly组合环境下完全逃逸沙箱,CVE-2026-44007则通过nesting:true配置选项触发权限控制缺陷。安全研究人员建议开发者立即升级至vm2 3.11.2版本,并考虑将不可信代码迁移至Docker容器或V8 Isolates等更强隔离方案中运行。

在流行的vm2 JavaScript沙箱软件包中,研究人员发现了13个严重漏洞,攻击者可利用这些漏洞逃出沙箱容器,对IT环境造成严重危害。目前,所有使用该库的开发者均被强烈建议立即将软件升级至最新版本3.11.2。

上述警告来自vm2维护者Patrik Simek发布的安全公告。vm2是一款开源虚拟机/沙箱工具,可在白名单限制下运行不受信任的代码,并调用Node.js内置模块。

13个漏洞中较为严重的一个是CVE-2026-26956,该漏洞可实现完整的沙箱逃逸并执行任意代码。攻击者在VM.run()内部运行的代码能够获取宿主进程对象,并在无需宿主配合的情况下执行宿主命令。

安全研究机构Socket在一封电子邮件中告知,该漏洞目前仅在Node.js 25.6.1版本上得到确认,且需要支持WebAssembly异常处理和JSTag功能的Node.js版本才能触发。

研究人员表示,风险最高的场景是:应用程序使用vm2 3.10.4版本运行在Node.js 25环境中,且允许攻击者控制的JavaScript代码传入VM.run()。

Socket研究工程师Wenxin Jiang通过邮件表示:"这是一个攻击面较窄但影响极大的漏洞。由于公告指向特定的脆弱版本以及Node.js 25与WebAssembly的特定组合,并非所有vm2部署都受到影响。但一旦条件满足,安全边界将完全失效——原本应被限制在沙箱内的代码能够触达宿主进程并执行命令。因此,使用vm2运行用户提供JavaScript代码的团队应尽快打补丁,并审查沙箱进程的访问权限。"

更新:该报道发布一天后,Socket发布了新的指导意见,指出该漏洞涉及的软件包和运行时范围比原始公告所描述的更广。Socket表示,部分依赖扫描工具可能会错误地将存在漏洞的部署标记为未受影响。Socket的测试发现,该漏洞影响所有3.10.5版本之前的vm2,涵盖所有暴露WebAssembly.JSTag接口的Node.js运行时,包括Node.js 24.x版本。Socket表示,尽管其并非vm2的维护方,仍将为暂时无法升级至最新修复版本的开发者提供补丁。

另一个严重漏洞是CVE-2026-44007,这是vm2 Node.js库中的访问控制不当漏洞,允许沙箱逃逸并在底层宿主上执行任意操作系统命令。公告指出,该漏洞存在于nesting:true选项与旧版模块解析器的交互方式中,已在vm2 3.11.1版本中修复。

Jiang表示:"对于首席安全官而言,这两个漏洞都值得高度关注。但第二个(NodeVM嵌套问题)可能是更多组织需要优先排查的。"

Socket研究人员指出,两个漏洞都能将沙箱中的JavaScript转变为对宿主系统的命令执行。区别在于受影响环境的范围:Node.js 25与WebAssembly的问题攻击面较窄,因为它依赖特定的vm2版本和特定的新版Node.js运行时行为;而NodeVM嵌套问题的影响范围可能更广,因为它涉及更多版本,且由部分开发者可能有意使用的配置模式触发。

Jiang补充说,这两个漏洞都揭示了一个更深层的问题:JavaScript沙箱本身难以做到绝对安全,运行时行为或配置上的细微差异可能导致重大安全后果。"第一个问题似乎与特定的Node.js 25/WebAssembly路径相关,第二个则是涉及NodeVM与nesting:true配置的逃逸问题。两种情况下,风险最高的都是那些运行不受信任JavaScript并认为vm2能有效隔离它的组织。相关应用开发团队应立即打补丁,并为沙箱工作负载增加更强的隔离措施。"

Sonatype高级安全研究员Adam Reynolds在邮件中表示,这些沙箱逃逸漏洞揭示了为何在受信任进程内对不受信任代码进行沙箱隔离是一种脆弱的安全模型。"一旦不受信任的代码在可访问凭据、密钥、底层文件系统、网络或具有部署权限的进程中运行,沙箱绕过很容易导致整个系统被攻陷。"

他还补充说,仅仅在依赖树中存在vm2并不足以使这些漏洞变得可利用。例如,攻击者通常需要具备在由存在漏洞的应用程序控制的vm2沙箱中执行特制JavaScript(以及CVE-2026-26956中特制WebAssembly)的能力。如果应用程序从未实例化vm2、仅将其用于内部可信脚本,或完全不允许攻击者控制代码执行,则即使存在该依赖,也可能没有实际可利用的攻击路径。

如果一个组织正在运行受vm2影响的应用程序,应立即进行升级。在升级完成前,可通过以下方式降低风险:避免使用Node.js 25运行时、在不受信任的沙箱中完全禁用或屏蔽WebAssembly,以及阻止用户控制的WASM编译与执行。

Reynolds还指出:"由于未来的运行时更新可能带来类似问题,vm2应被视为一种便捷的隔离层,而非硬性的安全边界。"

此外,Enderle Group的Robert Enderle建议,认真对待安全问题的IT领导者应停止依赖软件级沙箱来处理不受信任的代码,并着手将相关进程迁移至经过加固的Docker容器或V8 Isolate中。

Q&A

Q1:vm2沙箱逃逸漏洞CVE-2026-26956具体有哪些触发条件?

A:CVE-2026-26956目前已确认在Node.js 25.6.1版本上可被触发,且需要运行时支持WebAssembly异常处理和JSTag功能。最高风险场景是使用vm2 3.10.4版本运行在Node.js 25环境中,并允许攻击者控制的JavaScript代码传入VM.run()。Socket后续更新指出,该漏洞实际上影响3.10.5版本之前的所有vm2,范围涵盖所有暴露WebAssembly.JSTag接口的Node.js运行时,包括Node.js 24.x。

Q2:CVE-2026-44007和CVE-2026-26956两个漏洞有什么区别?

A:两个漏洞都能将沙箱中的JavaScript转变为对宿主系统的命令执行,但影响范围不同。CVE-2026-26956依赖特定vm2版本和Node.js 25/WebAssembly组合,攻击面相对较窄;CVE-2026-44007则是NodeVM嵌套配置问题(nesting:true选项与旧版模块解析器的交互),影响更多版本,触发条件是部分开发者可能有意使用的配置模式,因此受影响的组织范围更广,已在vm2 3.11.1版本中修复。

Q3:在vm2补丁未能立即安装时,有哪些临时缓解措施?

A:在完成升级前,可采取以下临时措施降低风险:避免使用Node.js 25运行时环境;在不受信任的沙箱中完全禁用或屏蔽WebAssembly;阻止用户控制的WASM编译与执行。此外,Socket也为暂时无法升级的开发者提供了独立补丁。从长远看,建议将不受信任代码的执行迁移至加固的Docker容器或V8 Isolate,不应将vm2视为硬性安全边界。

来源:InfoWorld

0赞

好文章,需要你的鼓励

2026

05/14

22:21

分享

点赞

邮件订阅