CVE-2026-22709vm2是一个开源的Node.js虚拟机沙箱环境,用于在隔离环境中执行不受信任的JavaScript代码。该漏洞影响vm2 3.10.2之前的所有版本。漏洞的根本原因在于Promise.prototype.then和Promise.prototype.catch方法的回调函数清理机制存在缺陷。在lib/setup-sandbox.js文件中,localPromise.prototype.then的回调函数经过了适当的清理和沙箱化处理,但globalPromise.prototype.then的回调函数没有被正确清理。异步函数的返回值是globalPromise对象,攻击者可以利用这一差异绕过沙箱限制。当异步函数返回Promise对象时,该Promise对象的方法调用会绕过沙箱检查,导致攻击者可以访问和操作沙箱外部的对象,从而实现沙箱逃逸并执行任意代码。此漏洞无需任何认证即可利用,CVSS评分高达9.8,属于极其严重的漏洞。攻击者可以通过构造特定的异步代码,利用Promise链式调用的特性,在回调函数中访问和修改全局对象,最终实现对宿主环境的完全控制。
vm2沙箱通过劫持和清理关键方法来防止代码逃逸。在Promise处理方面,沙箱对localPromise(即new Promise()创建的本地Promise)的then和catch方法进行了回调清理,但忽略了globalPromise(异步函数的返回值)的处理。漏洞利用的关键点在于:1) 异步函数返回的是globalPromise而非localPromise;2) globalPromise.prototype.then的回调函数不会被沙箱清理;3) 攻击者可以通过构造特殊的Promise链,在未清理的回调函数中访问沙箱外部的对象。具体来说,当代码执行类似(async()=>{return someValue})().then(callback)这样的操作时,callback函数中的代码运行在沙箱外部上下文。攻击者可以利用Function.prototype.constructor、eval、require等全局对象访问原生API,配合process对象实现命令执行。修复版本3.10.2通过统一处理localPromise和globalPromise的回调清理解决了此问题。