CVE-2026-44005: vm2: Sandbox escape
Summary vm2's bridge exposes mutable proxies for real host-realm intrinsic prototypes and then forwards sandbox writes into the underlying host objects with otherReflectSet() and otherReflectDefineProperty(), which lets attacker-controlled JavaScript running in a default VM or inherited NodeVM mutate shared host Object.prototype, Array.prototype, and Function.prototype from inside the sandbox.
Details BaseHandler.apply() unwraps sandbox-controlled receivers and arguments with otherFromThis() / otherFromThisArguments() and then directly invokes the real host function with ret = otherReflectApply(object, context, args), so any default-exposed host function that can surface a prototype getter becomes a prototype-walking primitive (lib/bridge.js:665-676). BaseHandler.get() special-cases proto and returns the host-side descriptor or proxy target prototype, which is enough for the attacker to reuse the host lookupGetter('proto') accessor repeatedly until the walk lands on host Object.prototype, Array.prototype, or Function.prototype (lib/bridge.js:590-616). Once the attacker has a proxy to a host intrinsic prototype, BaseHandler.set() performs value = otherFromThis(value); return otherReflectSet(object, key, value) === true;, which writes attacker-controlled data directly into the shared host object instead of keeping the mutation sandbox-local; BaseHandler.defineProperty() repeats the same design at otherReflectDefineProperty(object, prop, otherDesc) for descriptor-based writes (lib/bridge.js:641-649, lib/bridge.js:753-774). Existing validation does not stop the attack because the constructor filter only blocks one dangerous-property access pattern, setPrototypeOf() only blocks prototype replacement rather than ordinary property assignment, and containsDangerousConstructor() only protects one later re-unwrapping path instead of the initial host-prototype write sink (lib/bridge.js:494-530, lib/bridge.js:595-610, lib/bridge.js:660-662).
PoC Run the following code snippet and observe that the value of vm2EscapeMarker is polluted: const { VM } = require('vm2'); const vm = new VM(); vm.run( const g = ({}).lookupGetter; const a = Buffer.apply; const p = a.apply(g, [Buffer, ['proto']]); const hostObjectProto = p.call(p.call(p.call(p.call(Buffer.of())))); hostObjectProto.vm2EscapeMarker = 'polluted-object-prototype'; ); console.log({}.vm2EscapeMarker)
Impact Sandbox escape and prototype pollution.
Other sources
vm2 is an open source vm/sandbox for Node.js. From 3.9.6 to 3.10.5, vm2's bridge exposes mutable proxies for real host-realm intrinsic prototypes and then forwards sandbox writes into the underlying host objects with otherReflectSet() and otherReflectDefineProperty(), which lets attacker-controlled JavaScript running in a default VM or inherited NodeVM mutate shared host Object.prototype, Array.prototype, and Function.prototype from inside the sandbox This vulnerability is fixed in 3.11.0.
— MITRE
Affected Software
Remediation
Recommended actions to resolve this vulnerability, in priority order.
- Upgrade
Upgrade
npm/vm2to a version that resolves this vulnerability.Fixed in 3.11.0 - Upgrade
Upgrade
vm2to a version that resolves this vulnerability.Fixed in 3.11.0 - Operational
After upgrading vm2, verify sandbox integrity by rerunning the provided snippet (including checking that `console.log({}.vm2EscapeMarker)` is not polluted) to confirm the prototype pollution/sandbox escape behavior is resolved.
Event History
Frequently Asked Questions
What is the severity of CVE-2026-44005?
CVE-2026-44005 has a moderate severity rating due to the potential for unauthorized access to underlying host objects.
How do I fix CVE-2026-44005?
To fix CVE-2026-44005, you should upgrade the vm2 package to version 3.11.0 or later.
Which versions of vm2 are affected by CVE-2026-44005?
CVE-2026-44005 affects vm2 versions between 3.9.6 and 3.10.5, inclusive.
What is the nature of the vulnerability in CVE-2026-44005?
CVE-2026-44005 allows attacker-controlled JavaScript to manipulate real host-realm intrinsic prototypes via mutable proxies.
Is CVE-2026-44005 specific to a certain environment?
CVE-2026-44005 is specifically relevant in environments using default VM or inherited NodeVM in conjunction with vm2.