CVE-2026-100721 — vm2 NodeVM External Allowlist Bypass (Sandbox Escape)
September 28, 2026 · 991 views
Incorrect authorization (CWE-863) in vm2 npm before 3.12.2: NodeVM external allowlist and resolver path checks allow colliding package names (evil-left-pad) or prefix path tricks → host-context require and sandbox escape / host RCE when embedders run untrusted JS with require.external + custom resolve. CVSS 9.0/9.5 Critical. Python PoC: --lab (Node), check, remote exploit, mass -j.
Description
Overview
CVE-2026-100721 affects vm2 (npm) before 3.12.2 — incorrect authorization in the NodeVM external-module resolver, leading to sandbox escape and host-side code execution when untrusted JavaScript runs inside a misconfigured embedder.
vm2 runs untrusted JS in a sandbox within the same Node process (user-script platforms, low-code runners, online IDEs, plugin sandboxes).
| | |
|---|---|
| Affected | vm2 < 3.12.2 (path-prefix fix); related name collision 3.11.7+ |
| Fixed | vm2 ≥ 3.12.2 |
| Class | Allowlist substring match (e.g. evil-left-pad vs left-pad); resolved path prefix bypass in lib/resolver-compat.js |
| CVSS 3.1 | 9.0 Critical (S:C) |
| CVSS 4.0 | 9.5 Critical |
| Credit | Tencent Xuanwu Lab XlabAI, Atuin engine, Guannan Wang et al. |
Prerequisites (typical remote chain): App executes attacker JS in NodeVM with require.external allowlist, often context: 'host' and custom require.resolve; colliding or sibling package reachable on disk.
PoC page: https://pocbit.org/pocs/cve-2026-100721
Bundled tool (Python 3)
Members: download poc.py from this page (View exploit code).
pip install -r requirements.txt
# Local authoritative lab (Node.js + npm required)
python poc.py --lab
python poc.py -u https://app.example.com --mode check
python poc.py -u https://app.example.com --mode check --probe-exec
python poc.py --list targets.example.txt --mode check -j 12
python poc.py -u http://127.0.0.1:3000 --mode exploit \
--exec-paths /api/run,/api/eval --code-field code
python poc.py --list targets.txt --mode exploit \
--exec-paths /api/run,/api/sandbox/run -j 15
| Mode | Behavior |
|------|----------|
| --lab | Installs vulnerable vm2 in lab/, evil-left-pad → POCBIT-100721-HOST_EXEC |
| check | vm2 fingerprint, version < 3.12.2, optional --probe-exec |
| exploit | POST bypass probe JS to --exec-paths; JSONL + exploited.txt |
Remote exploit targets HTTP sandbox runners you configure; use --lab for pure library verification.
Remediation
- Upgrade vm2 ≥ 3.12.2 everywhere (lockfiles, containers).
- Avoid loading externals in host context when possible.
- Treat plugin / tenant dependency dirs as untrusted.
- Gate public “run code” APIs with auth and review.
Hunting (examples)
body="vm2"
body="/api/eval"
title="playground"
Legal and ethical use
Authorized testing only. Sandbox escape equals host compromise.
References
Related PoCs
Same platform, vendor, or tags — explore more write-ups on Pocbit.
- Web appCVE-2026-106445critical
CVE-2026-106445 — Handlebars 4.0.0–4.7.9 RCE (Function.prototype.constructor Bypass)
handlebars 4.0.0–4.7.9: lookupProperty own-property order bypasses proto deny list → Function.prototype.constructor → sandbox escape when allowProtoMethodsByDefault:true and attacker-controlled compile (CWE-184/CWE-1289). CVSS 4.0 9.2 Critical AT:P. Fixed 4.7.10 GHSA-p8wg-vrv2-v86f. Python PoC: check/exploit, Docker lab, --render-path. Marker POCBIT-106445-OK.
- Web appCVE-2026-101894critical
CVE-2026-101894 — @xhmikosr/decompress Symlink-Chain Archive Path Traversal
Node.js @xhmikosr/decompress (and unmaintained decompress): read/write outside output dir via chained symlink archive entries — bypass of CVE-2026-53486 hardening. Fixed in 10.2.2 / 11.1.4; kevva decompress ≤4.2.1 unpatched. CVSS 3.1 9.1 Critical. Python PoC: --lab, lockfile check, evil.tar upload exploit, mass -j.
- Web appCVE-2026-76268critical
CVE-2026-76268 — Splunk Enterprise SHC Patroni REST Unauthenticated RCE (archive_command)
Splunk Enterprise 10.2.0–10.2.6 and 10.4.0–10.4.2 on SHC members: PostgreSQL sidecar Patroni REST (typ. :8008) accepts unauth PATCH /config + POST /restart → archive_command OS exec (CWE-306). SVD-2026-1001. CVSS 3.1 9.8 Critical. Fixed 10.2.7 / 10.4.3. Python PoC: check/exploit, OOB POCBIT-76268-OK.
- Web appCVE-2026-109618critical
CVE-2026-109618 / CVE-2026-109619 — PHP php2shell (session.upload_progress UAF)
PHP core php2shell pair: session.upload_progress multipart timing UAF (618 trigger + 619 offset RCE). CVSS 9.2. Python stdlib PoC: check GET fingerprint + bulk JSONL; exploit smart 618 multi-path or 619 --call. Patch 8.2.35/8.3.36/8.4.27/8.5.12+.