返回首页

CVE-2026-26956 vm2 Sandbox Escape via WebAssembly

-2026-26956:vm2沙箱逃逸漏洞深度解析——WebAssembly异常处理击穿 130万次周下载量的安全防线

hero

CVSS 9.8分的vm2沙箱逃逸漏洞通过WebAssembly JSTag异常处理机制突破Node.js隔离边界,攻击者可在沙箱内执行任意系统命令。该库每周被下载130万次,影响网关、在线、测试框架等关键基础设施。

漏洞概述与影响范围

section

2026年5月11日,安全研究员披露了CVE-2026-26956——一个影响vm2 Node.js沙箱库的严重逃逸漏洞,CVSS v3.1评分9.8分(级别)。vm2是上最流行的沙箱解决方案之一,声称能在隔离环境中运行不受信任的代码,每周下载量超过130万次。

该漏洞利用WebAssembly异常处理机制(特别是Node.js 25引入的JSTag支持)绕过vm2的Proxy拦截层,从沙箱内部获取宿主进程的process对象引用,最终实现任意命令执行。这是vm2历史上第20多个被公开的沙箱逃逸漏洞——一个沙箱库反复被突破,本身就说明了问题的严重性。

受影响的使用场景包括:API网关的用户脚本执行、在线编程环境(如CodePen、Replit等)、测试框架中的动态代码评估、系统中带脚本功能的内容管理平台。任何依赖vm2来隔离不受信任JavaScript代码的系统都在风险范围内。

技术原理:WebAssembly如何击穿沙箱边界

section

CVE-2026-26956的核心攻击机制涉及四个关键步骤。首先,攻击者在沙箱内构造特殊的Symbol-to-string强制转换操作——这是一个JavaScript运行时将Symbol类型转换为字符串表示的操作。在Node.js 25启用了WebAssembly JSTag支持的特定条件下,这个转换会触发一个TypeError,而这个错误是在vm2隔离边界的宿主侧生成的。

其次,vm2依赖JavaScript Proxy对象来拦截和重写对宿主对象的属性访问和函数调用。然而,当TypeError通过WebAssembly异常路径传播时,它绕过了vm2的Proxy拦截层,未经净化就穿越回了沙箱内部。

第三步,未净化的错误对象泄漏了对宿主侧process对象的引用——这是Node.js全局对象,提供了对运行进程的环境变量、文件系统和子进程生成能力的访问。

最终,攻击者通过process.binding('spawn_sync')或类似调用执行任意操作系统命令,完全逃逸沙箱。该漏洞被归类为CWE-693(保护机制失效)——安全控制存在但可被绕过的典型模式。

受影响版本与关联漏洞

section

漏洞编号 CVSS评分 影响范围 攻击向量 修复版本
CVE-2026-26956 9.8 Node.js 25.6.1+ (JSTag启用) WebAssembly异常处理 3.10.5 / 3.11.2
CVE-2026-22709 9.8 所有版本 ≤3.10.1 Promise回调未净化 3.10.2
CVE-2024-55565 9.8 所有版本 ≤3.9.19 中文字符处理 3.9.20
CVE-2023-37466 9.8 所有版本 ≤3.9.16 异步操作绕过 3.9.17

CVE-2026-22709是2026年1月披露的关联漏洞,同样是CVSS 9.8分。它利用Promise回调的净化缺陷——local Promise.prototype.then回调被vm2正确净化,但global Promise.prototype.then回调未被净化,允许访问宿主的Function构造器实现任意代码执行。

vm2从2015年至今已有超过20个沙箱逃逸漏洞被公开。这个频率本身就是一个信号:基于Proxy拦截的安全模型在面对JavaScript引擎的不断演进时,始终存在被绕过的风险。

检测方法与排查脚本

section

快速排查系统是否使用了受影响版本的vm2:

# 检查项目依赖中的vm2版本
find /path/to/projects -name "package-lock.json" -exec grep -l "vm2" {} \;

# 直接查看已安装的vm2版本
npm list vm2 2>/dev/null || echo "vm2 not found in current project"

# 全局搜索所有node_modules中的vm2
find / -path "*/node_modules/vm2/package.json" -exec grep '"version"' {} \; 2>/dev/null

# 使用npm audit检查已知漏洞
cd /path/to/your/project && npm audit --json | grep -A5 "vm2"

脚本批量扫描多个项目:

import os, json, subprocess

def scan_vm2_versions(root_dir):
    """扫描目录下所有项目的vm2版本"""
    results = []
    for dirpath, dirnames, filenames in os.walk(root_dir):
        if 'node_modules' in dirpath:
            continue
        if 'package.json' in filenames:
            pkg_path = os.path.join(dirpath, 'package.json')
            try:
                with open(pkg_path) as f:
                    pkg = json.load(f)
                for dep_type in ['dependencies', 'devDependencies']:
                    if 'vm2' in pkg.get(dep_type, {}):
                        version = pkg[dep_type]['vm2']
                        results.append({
                            'path': dirpath,
                            'version': version,
                            'type': dep_type,
                            'vulnerable': not any(v in version for v in ['3.10.5', '3.11.2'])
                        })
            except (json.JSONDecodeError, IOError):
                continue
    return results

hits = scan_vm2_versions('/var/www')
for h in hits:
    status = 'VULNERABLE' if h['vulnerable'] else 'PATCHED'
    print(f"[{status}] {h['path']} -> vm2@{h['version']}")

修复方案

方案一:升级vm2(推荐)

# 升级到修复版本
npm install [email protected]

# 如果使用3.10.x分支
npm install [email protected]

# 验证版本
npm list vm2

方案二:迁移到isolated-vm(长期方案)

vm2的反复突破表明其安全模型存在根本缺陷。隔离(通过isolated-vm库实现)使用进程级隔离而非Proxy拦截,安全性更高:

# 替换vm2为isolated-vm
npm uninstall vm2
npm install isolated-vm

代码迁移示例:

// 旧代码 (vm2 - 不安全)
const {VM} = require('vm2');
const vm =  VM();
const result = vm.run('userCode');

// 新代码 (isolated-vm - 进程隔离)
const ivm = require('isolated-vm');
const isolate = new ivm.Isolate({memoryLimit: 128});
const  = await isolate.createContext();
const script = await isolate.compileScript('userCode');
const result = await script.run(context);

方案三:Node.js版本降级(临时缓解)

如果无法立即升级vm2且环境使用Node.js 25:

# 降级到Node.js 24(不受此漏洞影响)
nvm install 24
nvm use 24
nvm alias default 24

注意:降级是临时缓解措施,应尽快升级vm2或迁移到isolated-vm。

防御纵深策略

对于运行不受信任代码的平台,单一沙库不足以保证安全。推荐的纵深防御策略:

  1. 容器隔离:将代码执行放在Docker容器中运行,限制资源(CPU、内存、网络),使用gVisor或Kata 增强隔离
  2. 系统调用过滤:使用seccomp或AppArmor限制进程可执行的系统调用
  3. 网络隔离:沙箱执行环境不应有出站网络访问能力
  4. 资源限制:设置执行超时(如5秒)、内存上限(如64MB)、文件描述符数量限制
  5. 最小权限:沙箱进程以非特权用户运行,不挂载敏感目录
# Docker Compose沙箱执行环境示例
services:
  sandbox:
    : node:24-slim
    mem_limit: 128m
    cpus: 0.5
    network_mode: none
    read_only: true
    security_opt:
      - no-new-privileges:true
    tmpfs:
      - /tmp:size=64m

供应链视角:npm生态的沙箱困境

vm2每周130万次下载量意味着大量应用在不知不觉中暴露在风险之下。npm生态中沙箱类库的安全困境在于:JavaScript语言的动态特性使得构建可靠的隔离边界极其困难。V8引擎的不断演进(如WebAssembly新特性)会持续引入新的逃逸路径。

对于npm包维护者和使用者,几点建议:定期运行npm audit检查依赖漏洞;关注安全公告( Advisory 、npm audit advisories);考虑将vm2替换为isolated-vm等基于V8 Isolate的方案;对执行用户代码的路径进行额外的容器/进程级隔离。

数据来源与参考文献

  1. Ciphers . "CVE-2026-26956: Critical vm2 Sandbox Escape via WebAssembly." cipherssecurity.com, May 2026.
  2. NVD. "CVE-2026-26956 Detail." nvd.nist.gov, 2026.
  3. npm. "vm2 Package Statistics." npmjs.com/package/vm2, 2026.
  4. CWE. "CWE-693: Protection Mechanism Failure." cwe.mitre.org.
  5. Ciphers Security. "CVE-2026-22709: vm2 Sandbox Escape via Promise Callback." cipherssecurity.com, January 2026.

更新时间: 2026-06-18

评论