
Hoplon InfoSec
07 May, 2026
The vm2 sandbox escape vulnerability is not a surprise to anyone who has been following Node.js security closely. It keeps coming back. A new critical flaw was confirmed in early 2026, once again giving attackers a direct path to run arbitrary code on the host machine. This article breaks down exactly what happened, how it works, and what you need to do today.
A sandbox escape is when code running inside an isolated environment breaks out and reaches the host system. vm2 is supposed to prevent that. It is a popular Node.js library designed to run untrusted JavaScript code inside a restricted container, blocking access to sensitive APIs like process and the file system.
A vm2 sandbox escape vulnerability means that isolation failed. An attacker running code inside the vm2 sandbox can escape its boundaries and execute commands directly on the host operating system. That is as bad as it sounds.
Here is the full technical picture of the most recent confirmed incident:
|
Field |
Details |
|
CVE ID |
CVE-2026-26956 |
|
Library |
vm2 (npm package) |
|
Affected Version |
3.10.4 (earlier versions also at risk) |
|
CVSS Score |
Critical (9.8/10) |
|
CVSS Vector |
AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
|
Attack Vector |
Network |
|
Attack Complexity |
Low |
|
Privileges Required |
None |
|
User Interaction |
None |
|
PoC Available |
Yes, publicly published |
|
Node.js Version |
Confirmed on Node.js 25.6.1 |
|
Root Cause |
WebAssembly exception handling bypass |
|
Prior Related CVEs |
CVE-2023-29017, CVE-2023-29199, CVE-2023-30547, CVE-2023-37466, CVE-2026-22709 |
The CVSS score of 9.8 means nearly maximum severity. No privileges required. No user interaction needed. Fully exploitable over the network. This is about as dangerous as a vulnerability gets.
Most security articles will tell you this is a "critical vulnerability" and leave it there. We want to give you the real picture.
If your product lets users run custom scripts, automation, or plugins, and you use vm2 under the hood, an attacker can escape that sandbox and reach your server. They get the same permissions your Node.js process has. On a misconfigured server, that means full root access.
A public PoC is already out. This is not a theoretical risk. The window between disclosure and active exploitation is very short, especially when the CVSS score is this high and no credentials are needed.
What makes this particular vm2 sandbox escape vulnerability different from past ones is the attack surface. CVE-2026-26956 stems from the library's erroneous handling of exceptions crossing between the sandboxed environment and the host.
WebAssembly exception handling can intercept JavaScript errors at a lower level inside Google's V8 engine, bypassing vm2's JavaScript-based security defenses. That is a fundamentally deeper attack than previous exception-handling bugs.
When we set up a test environment with Node.js 25.6.1 and vm2 3.10.4 and ran the published PoC, the result was immediate. The sandboxed code executed a system-level command on the host within milliseconds. There was no warning, no error thrown, and no log entry from vm2 itself.
Here is the attack chain in simple terms:
1. Attacker supplies JavaScript code to a vm2-powered sandbox
2. The malicious code triggers a TypeError using a Symbol-to-string conversion inside a WebAssembly exception handler
3. V8 engine intercepts the error at a level below vm2's JavaScript protections
4. A host-side error object leaks back into the sandbox without being sanitized
5. The attacker abuses the leaked object's constructor chain to access Node.js internals like the process object
6. Arbitrary commands execute on the host with the same privileges as the Node.js process
In our practical test, we noticed that vm2's proxy-based defenses never triggered. The WebAssembly path completely sidestepped the JavaScript layer that vm2 relies on for protection. This is why patching quickly matters so much.
vm2 normally relies on JavaScript-level protections that safeguard against host-based errors and bridge Proxies that wrap cross-context objects. However, WebAssembly exception handling can intercept JavaScript errors at a lower level inside Google's V8 engine, bypassing vm2's JavaScript-based security defenses.
This is the question most developers need answered first. Run these commands in your project root.
npm ls vm2
npm audit
npm ls --all | grep vm2
If you see any output from the first two commands, your project uses vm2. If you see output only from the third command, a package you depend on uses vm2 internally. Both cases require action.
|
vm2 Version Range |
Status |
Action Needed |
|
All versions before 3.9.15 |
Vulnerable (CVE-2023-29017) |
Upgrade immediately |
|
3.9.15 to 3.9.19 |
Vulnerable (CVE-2023-37466) |
Upgrade immediately |
|
3.10.0 to 3.10.3 |
Vulnerable (CVE-2026-22709) |
Upgrade immediately |
|
3.10.4 |
Vulnerable (CVE-2026-26956) |
No patch yet, migrate away |
|
Any version |
Deprecated by maintainers |
Migrate to alternatives |
The maintainers have made their position clear. The library contains critical security issues and should not be used for production. That statement is in the official README. There is no safe version of vm2 for production use.
You have three realistic options. We rank them by effectiveness.
This is the right move. vm2 has been deprecated. The maintainers have stopped trying to fix it. According to the maintainer, the security issue cannot be properly addressed. That is a direct quote. Stop using it.
Best alternatives:
• isolated-vm : Built on V8 isolates, much stronger process-level isolation. Recommended for most production use cases.
• Node.js worker_threads with --experimental-vm-modules : Native approach, decent isolation, good for controlled environments.
• Deno, If you can redesign the execution environment, Deno has secure-by-default permissions that make sandboxing far more reliable.
• Firecracker / Docker containers : For high-security use cases where you need real OS-level isolation, run untrusted code inside containers.
If migration is not immediately possible, upgrade to the newest available version and monitor for patches:
npm install vm2@latest
Watch the official GitHub repository and npm page for security updates. Set up alerts on the GitHub Advisory Database for the vm2 package
These do not fix the vm2 sandbox escape vulnerability. They reduce the blast radius.
• Network egress filtering on your Node.js process so it cannot make outbound connections even if compromised
• Least-privilege process accounts so the Node.js process runs with minimal OS permissions
• Web Application Firewall (WAF) rules to block unusual input patterns targeting your sandbox endpoint
• Runtime Application Self-Protection (RASP) tools that monitor system call anomalies
• Deny untrusted code execution entirely if vm2 is in your stack but you control all the input
|
Tool |
Isolation Level |
Language Support |
Ease of Use |
Production Ready |
|
vm2 |
JavaScript only (broken) |
JavaScript |
Easy |
No (deprecated) |
|
isolated-vm |
V8 isolate level |
JavaScript/TypeScript |
Moderate |
Yes |
|
worker_threads |
Thread-level (Node.js native) |
JavaScript |
Moderate |
Yes (limited) |
|
Deno |
Permission-based OS level |
JavaScript/TypeScript |
Requires redesign |
Yes |
|
Docker/Firecracker |
Full OS isolation |
Any language |
Complex setup |
Yes (highest security) |
For most teams replacing vm2 today, isolated-vm is the most direct swap. It provides real V8-level isolation and has an active maintenance record.
Understanding the history matters. This is not an isolated incident.
• 2022: CVE-2022-36067 disclosed, critical sandbox escape in vm2
• April 2023: CVE-2023-29017 confirmed, CVSS 9.8, PoC published
• April 2023: CVE-2023-29199 follows within days of the previous patch
• May 2023: CVE-2023-30547 disclosed, yet another escape route
• July 2023: vm2 maintainers officially deprecate the library
• July 2023: CVE-2023-37466 and CVE-2023-37903 both disclosed post-deprecation
• January 2026: CVE-2026-22709, critical RCE, affects vm2 3.10.x
• Early 2026: CVE-2026-26956 confirmed on Node.js 25, PoC published, actively investigated
The pattern is clear. This is not a one-time mistake. The JavaScript sandbox model vm2 uses has been proven inadequate. New Node.js engine features keep opening new escape routes.
After watching this library fail repeatedly, here is what the vm2 situation teaches us about secure software design:
• JavaScript-only isolation is not enough. If your sandbox lives inside the same V8 process as the host, an attacker who understands V8 internals deeply enough can find a way out. Real isolation needs OS-level barriers.
• Dependency audits need to include transitive packages. Most teams that found vm2 in their stack were not using it directly. It was hiding three levels deep in their dependency tree.
• PoC publication equals active exploitation window opening. When a CVSS 9.8 vulnerability gets a public PoC, assume exploitation starts within 24 to 72 hours.
• Deprecation notices should trigger immediate migration, not "we'll get to it." The vm2 maintainers told you in July 2023. Teams that listened avoided the 2026 incidents.
Mistake 1: Assuming an outdated patch covers you
Some developers patched to 3.9.15 after CVE-2023-29017 and never checked again. That version is still vulnerable to later CVEs. The library kept accumulating flaws.
How to avoid it: Set up automated dependency monitoring with tools like Dependabot, Snyk, or Socket. Get notified the moment a new advisory drops for any package in your stack.
Mistake 2: Thinking indirect dependencies are not your problem
If package-x uses vm2 internally, your application is still exposed. The attack surface does not care about abstraction layers.
How to avoid it: Run npm audit and npm is -all regularly, not just at install time.
Mistake 3: Treating vm2 deprecation as optional
Some teams read the deprecation notice and decided to wait for a "better time" to migrate. There is no better time. The vm2 sandbox escape vulnerability keeps getting worse.
How to avoid it: Treat a deprecated security-critical package as a P0 migration item. No exceptions.
Tip 1: Use reachability analysis before panicking
If none of vm2's entry endpoints for executing code inside the sandbox are reachable, such as the run() method, then the vulnerability is not exploitable. If vm2 is in your dependency tree but the code path that actually calls it is never triggered in your app, your immediate risk is lower. Use SCA tools with reachability analysis to confirm.
Tip 2: Monitor for post-exploitation signals
Even if you patch, check your logs for these indicators of compromise:
• Unexpected process spawning from your Node.js application
• Outbound network connections to unknown IPs from the Node.js process
• File system access patterns outside your normal application paths
• Unusual error log entries around Error.prepareStackTrace or async error handlers
Tip 3: Assume the worst about PoC timing
The EPSS (Exploit Prediction Scoring System) probability for CVE-2023-29017 reached 78.06%. That is an extremely high exploitation likelihood score. Public PoC code for the vm2 sandbox escape vulnerability was available almost immediately after each disclosure. Do not wait for confirmed attacks in the wild before you act.
Use this right now. Do not save it for later.
• Step 1: Run npm ls --all | grep vm2 and confirm whether vm2 is in your dependency tree
• Step 2: Run npm audit and review all HIGH and CRITICAL findings related to vm2
• Step 3: If vm2 is a direct dependency, start migrating to isolated-vm this sprint
• Step 4: If vm2 is an indirect dependency, identify which package pulls it in and either replace that package or push the maintainer to update
• Step 5: Enable automated dependency alerts (Dependabot, Snyk, or Socket) so you get notified about the next advisory automatically
The most recent critical vm2 sandbox escape vulnerability covered by BleepingComputer is CVE-2026-26956. It affects vm2 version 3.10.4 running on Node.js 25 with WebAssembly exception handling enabled. A public PoC exploit has been released. Earlier related CVEs include CVE-2023-29017, CVE-2023-30547, and CVE-2026-22709.
No. vm2 has been officially deprecated by its maintainers. The official README states the library contains critical security issues and must not be used in production. Multiple sandbox escape vulnerabilities have been disclosed across 2022, 2023, and 2026. Teams should migrate to isolated-vm, Deno, or OS-level container isolation.
The CVSS v3.1 score for CVE-2023-29017 and related vm2 vulnerabilities is 9.8 out of 10, rated Critical. The vector AV:N/AC:L/PR:N/UI:N means the attack is network-accessible, requires no complexity, no privileges, and no user interaction. That is near maximum severity.
Can attackers exploit the vm2 sandbox escape vulnerability remotely?
Yes. The attack vector is Network with Low complexity. An attacker who can supply JavaScript code to a vm2-powered sandbox, whether through an API, a user-facing code editor, or a plugin system, can trigger the exploit remotely. No special access is needed.
The most practical replacement is isolated-vm, which uses actual V8 isolates for stronger separation between sandboxed and host code. For even stronger isolation, run untrusted code inside Docker containers or Firecracker microVMs. Deno is also an option if you can redesign your execution environment.
Yes. The vm2 maintainers deprecated the library in mid-2023 after a series of critical vulnerabilities that proved the JavaScript-only sandboxing model could not be reliably secured. The library still exists on npm but the README explicitly warns against production use.
Security teams should cross-reference the following trusted sources before making decisions:
• GitHub Advisory Database at advisories for all vm2 CVEs
• NIST NVD (National Vulnerability Database) for official CVSS scores and vector details
• npm audit output for your specific version exposure
• CISA Known Exploited Vulnerabilities (KEV) catalog to check if active exploitation has been confirmed
Always verify the current status of a CVE from official sources before publishing or acting on secondary reports. CVE details get updated as new information becomes available.
The vm2 sandbox escape vulnerability is not a single bug you patch and forget. It is a repeating pattern that has now produced multiple critical CVEs across three years. The maintainers have given up trying to fix it. The JavaScript-only isolation model has proven it cannot hold.
If your application uses vm2, migrating to isolated-vm or an OS-level container solution is not optional security hygiene. It is a business continuity decision.
Start with the 5-step checklist above. Run the npm commands. Know what you have. Then migrate deliberately, not in a panic after something bad happens.
Your host system is only as safe as the code running inside your sandbox.
Read some news related to cybersecurity:
· Trellix Source Code Breach: How Hackers Got in
· Critical GitHub Vulnerability and Security Flaw
· ADT Data Breach: 5.5 Million Customers Affected
· Spain Shuts Down Major Manga Piracy Site
Published: May 07 2026
Last Updated: May 07 2026
Author: Radia, Cybersecurity Content Analyst
A new critical vm2 sandbox escape vulnerability (CVE-2026-26956) has been confirmed with a public proof-of-concept exploit already in the wild. If your Node.js application uses vm2, stop reading and check your version right now.
Was this article helpful?
React to this post and see the live totals.
Share this :