CVEReports
CVEReports

Automated vulnerability intelligence platform. Comprehensive reports for high-severity CVEs generated by AI.

Product

  • Home
  • Sitemap
  • RSS Feed

Company

  • About
  • Contact
  • Privacy Policy
  • Terms of Service

© 2026 CVEReports. All rights reserved.

Made with love by Amit Schendel & Alon Barad



CVE-2026-26956

CVE-2026-26956: WebAssembly Exception Handling Sandbox Escape in vm2

Alon Barad
Alon Barad
Software Engineer

May 5, 2026·6 min read·298 visits

Executive Summary (TL;DR)

A critical sandbox escape (CVSS 9.8) in vm2 allows attackers to achieve arbitrary code execution by exploiting WebAssembly try_table and JSTag instructions to leak un-sanitized host-realm objects.

vm2 versions 3.10.4 and below are vulnerable to a critical sandbox escape flaw resulting in unauthenticated remote code execution. Attackers can leverage Node.js v25 WebAssembly (WASM) exception handling mechanisms to bypass JavaScript-level error instrumentation and gain access to the host-realm execution context.

Vulnerability Overview

The vm2 library provides a Node.js sandbox environment designed to execute untrusted code securely. It achieves this isolation primarily through source-to-source transformation and JavaScript Proxy objects, intercepting sensitive operations and sanitizing errors before they reach the guest execution context. Version 3.10.4 and all prior versions contain a critical flaw in this instrumentation layer.

The vulnerability, designated as CVE-2026-26956, arises from an architectural mismatch between JavaScript-level sandboxing and low-level engine capabilities introduced in Node.js v25. Specifically, the introduction of WebAssembly (WASM) exception handling instructions creates an execution path that operates outside the visibility of vm2's source-to-source transformers. Attackers can exploit this blind spot to intercept raw host-realm objects.

By leaking a host-realm object into the guest context, an attacker breaks the core isolation boundary of the sandbox. The guest code can then traverse the prototype chain of the leaked object to access fundamental host constructors. This ultimately provides access to the global Function constructor, enabling the execution of arbitrary system commands through the host's child_process module.

Root Cause Analysis

The root cause of CVE-2026-26956 is a protection mechanism failure (CWE-693) involving incomplete interception of cross-realm exceptions. vm2 secures the execution environment by rewriting all JavaScript catch clauses during script compilation. The injected handleException() function intercepts thrown errors, ensuring that host-realm error objects are replaced with sanitized guest-realm equivalents before the sandboxed code can interact with them.

Node.js v25 introduced support for the WebAssembly try_table instruction and the WebAssembly.JSTag interface. These features allow WASM modules to catch exceptions directly at the V8 C++ engine level. Because this interception occurs within compiled bytecode rather than JavaScript, vm2's source-to-source transformation cannot inject the necessary handleException() sanitization routine into the WASM control flow.

When a host-realm error is triggered and subsequently caught by the WASM try_table block, the V8 engine returns the raw exception object to the WASM module as an externref. The WASM module can then return this unsanitized externref directly to the guest JavaScript context. This bypasses all proxy handlers and error sanitization routines, providing the guest context with a direct reference to a host object.

Code Analysis

The mitigation strategy for this vulnerability required multiple commits across different components of the vm2 architecture. The primary fix targets the WASM execution environment. In commit 1fbdeff743d48fb1416964777f5947057f6f1295, the maintainers removed WebAssembly.JSTag from the sandbox globals. Without JSTag, WASM modules lose the capability to identify and catch JavaScript exceptions, neutralizing the primary escape vector.

// lib/setup-sandbox.js (Vulnerable)
Object.defineProperty(global.WebAssembly, 'JSTag', {
    value: WebAssembly.JSTag,
    configurable: true,
    writable: true
});
 
// lib/setup-sandbox.js (Patched - 1fbdeff7)
// WebAssembly.JSTag is explicitly omitted from the guest context.
delete global.WebAssembly.JSTag;

The vulnerability also exposed weaknesses in how vm2 handles modern ECMAScript error types. Commit a6cd917dddf6f5d5da3f0883977a0342eb3c204f updates the handleException() function to recursively sanitize SuppressedError instances. SuppressedError is a feature of the ES2024 Explicit Resource Management API, which can encapsulate multiple host-realm errors. The patch ensures that both the .error and .suppressed properties are properly evaluated and scrubbed before returning to the guest.

Finally, commit ebcfe94ad2f864f0bc35e78cff1d921107cfd160 implements deeper hardening of the lib/bridge.js file. The patch explicitly caches and blocks code-executing constructors from crossing the proxy bridge. Commit 57971fa423abeb66f09e47e18102986549474ca8 complements this by moving bridge handler methods into closure-scoped functions, preventing attackers from accessing internal bridge methods via util.inspect property enumeration.

Exploitation

Exploiting this vulnerability requires the attacker to supply a malicious script to an application utilizing a vulnerable version of vm2 running on Node.js v25 or higher. The first step in the exploit chain involves triggering a specific host-realm error. The attacker creates a standard JavaScript Error object and overrides its name property with a Symbol. When Node.js attempts to format the stack trace for this error, the engine throws a host-realm TypeError due to the invalid string coercion of the Symbol.

The attacker must then compile and instantiate a WebAssembly module within the guest context. This WASM module is constructed to import a JavaScript function that triggers the previously prepared host error. The module's execution block utilizes the try_table instruction, combined with WebAssembly.JSTag, to catch the resulting exception. Because the exception is caught in WASM, it evades vm2's catch instrumentation.

Once the WASM module catches the error, it exports a function that returns the caught exception to the guest JavaScript context. The guest code receives the raw, unsanitized host-realm TypeError. The attacker accesses the constructor.constructor property of this error object to retrieve the host-realm global Function constructor.

Invoking this host Function constructor allows the attacker to define and execute arbitrary JavaScript within the host context. By executing HostFunction("return process")(), the attacker obtains a reference to the host's process object. From there, the attacker can access process.mainModule.require('child_process').execSync('id'), achieving arbitrary command execution on the underlying operating system.

Impact Assessment

The impact of CVE-2026-26956 is critical, carrying a CVSS v3.1 score of 9.8. Successful exploitation results in a complete failure of the sandbox isolation boundary, leading directly to unauthenticated remote code execution. Because vm2 is frequently used to evaluate untrusted code in multi-tenant environments, continuous integration platforms, and serverless architectures, a successful escape compromises the entire host application.

An attacker who executes arbitrary code via this vulnerability gains the same privileges as the Node.js process running the vm2 instance. This typically allows the attacker to read sensitive environment variables, access local file systems, establish reverse shells, and pivot to internal network resources. The vulnerability requires no user interaction and can be triggered by submitting standard JavaScript payloads.

While the EPSS score currently sits at 0.00092 (25.50th percentile), indicating low widespread exploitation in the wild, the public availability of the exploitation methodology increases the risk for targeted attacks. Applications that expose a web-based code evaluation endpoint using vm2 are at immediate risk of complete system compromise.

Remediation

The immediate remediation for this vulnerability is to upgrade vm2 to version 3.10.5. This version correctly removes WebAssembly.JSTag from the guest context and includes comprehensive hardening against SuppressedError leaks and prototype enumeration. Administrators should verify the updated version by checking their package lockfiles to ensure no transitive dependencies are pulling in vulnerable versions of the library.

If upgrading is not immediately feasible, organizations can temporarily mitigate the WASM-based attack vector by disabling WebAssembly support within the sandbox configuration. Instantiating the sandbox with the option wasm: false prevents the compilation of the malicious WebAssembly module required for the primary escape chain. However, this configuration change does not protect against the secondary ES2024 SuppressedError vectors patched in 3.10.5.

Crucially, the maintainers of vm2 have announced that the project is officially deprecated and discontinued. The architectural limitations of source-to-source transformation make it increasingly difficult to secure against continuous changes to the V8 engine and the ECMAScript specification. Organizations currently relying on vm2 must plan a migration to more robust, isolate-based sandboxing solutions, such as isolated-vm, to maintain long-term security.

Official Patches

Patrik Simek (vm2)Official Release v3.10.5

Fix Analysis (4)

Technical Appendix

CVSS Score
9.8/ 10
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
EPSS Probability
0.09%
Top 75% most exploited

Affected Systems

Node.js applications evaluating untrusted codevm2 versions 3.10.4 and below

Affected Versions Detail

Product
Affected Versions
Fixed Version
vm2
Patrik Simek
<= 3.10.43.10.5
AttributeDetail
CWE IDCWE-693 (Protection Mechanism Failure)
Attack VectorNetwork (Unauthenticated)
CVSS v3.19.8 (Critical)
ImpactRemote Code Execution / Sandbox Escape
Exploit StatusProof of Concept Available
Vulnerable ComponentError instrumentation / handleException()

MITRE ATT&CK Mapping

T1059Command and Scripting Interpreter
Execution
T1611Escape to Host
Privilege Escalation
T1211Exploitation for Privilege Escalation
Privilege Escalation
CWE-693
Protection Mechanism Failure

Failure of the sandbox's source-to-source transformation to instrument exceptions caught at the WASM/C++ layer.

Vulnerability Timeline

Initial patch for setPrototypeOf restriction in lib/setup-sandbox.js.
2026-02-08
Series of critical fixes merged for WASM escape, SuppressedError, and bridge hardening.
2026-02-15
Official release of version 3.10.5.
2026-02-17
CVE-2026-26956 published.
2026-05-04

References & Sources

  • [1]GHSA Advisory: GHSA-ffh4-j6h5-pg66
  • [2]RedHotCyber Vulnerability Report

Attack Flow Diagram

Press enter or space to select a node. You can then use the arrow keys to move the node around. Press delete to remove it and escape to cancel.
Press enter or space to select an edge. You can then press delete to remove it or escape to cancel.

More Reports

•5 minutes ago•CVE-2026-70492
8.7

CVE-2026-70492: Stored Cross-Site Scripting (XSS) via Unescaped KaTeX Render-Error Fallback in Open WebUI

CVE-2026-70492 (also tracked as GHSA-pwxh-7358-jq2x) is a stored Cross-Site Scripting (XSS) vulnerability in Open WebUI versions 0.10.0 through 0.10.x. The flaw arises because engine-level JavaScript stack overflow errors escape KaTeX standard error handling. Svelte's fallback rendering path assigns the raw, unescaped mathematical input string directly to the DOM using the unsafe {@html} directive, enabling arbitrary client-side code execution. This allows attackers to steal session tokens and perform unauthorized administrative actions when users view malicious messages. The vulnerability has been fully resolved in version 0.11.0.

Amit Schendel
Amit Schendel
0 views•10 min read
•about 1 hour ago•CVE-2026-70493
6.5

CVE-2026-70493: Regular Expression Denial of Service (ReDoS) in Open WebUI Knowledge Search

CVE-2026-70493 is a critical Regular Expression Denial of Service (ReDoS) vulnerability affecting Open WebUI from version 0.9.6 up to (but excluding) 0.11.0. An authenticated user can submit a custom, highly complex regular expression pattern to search files within the knowledge base. Because these expressions are compiled and executed synchronously using Python's standard backtracking re module inside an asynchronous event loop, the server becomes unresponsive. A single request is capable of stalling the entire platform, denying access to all concurrent users of the system.

Amit Schendel
Amit Schendel
1 views•7 min read
•about 2 hours ago•CVE-2026-70588
5.0

CVE-2026-70588: Stored Cross-Site Scripting via Universal Import in Ghost CMS

CVE-2026-70588 is a stored Cross-Site Scripting (XSS) vulnerability in Ghost CMS versions 5.26.0 through 6.54.0. The vulnerability exists within the Universal Import feature of the Ghost Admin interface. When processing imported content from third-party platforms such as Revue, the importer fails to sanitize user-controlled HTML tags, rich-text structured JSON, or link fields before rendering them in the Ghost Admin panel and front-end template rendering contexts.

Amit Schendel
Amit Schendel
4 views•7 min read
•about 3 hours ago•CVE-2026-53948
5.4

CVE-2026-53948: Stored Cross-Site Scripting via File Upload Content-Type Spoofing in Ghost

CVE-2026-53948 is a stored cross-site scripting (XSS) vulnerability in the Ghost content management system. Affected versions (v6.19.4 up to v6.21.0) trusted the client-supplied Content-Type header during file uploads via the Admin API. This allowed authenticated attackers to upload benignly-named files with executable MIME types (like text/html), executing scripts in visitor browsers when hosted on integrated cloud platforms like S3 or GCS.

Alon Barad
Alon Barad
4 views•6 min read
•about 4 hours ago•CVE-2026-70589
4.8

CVE-2026-70589: Improper Status Validation in Ghost CMS Offer Redemption

A business logic vulnerability in Ghost CMS allows unauthenticated remote users to redeem deactivated or archived promotional subscription offers by programmatically passing old offer identifiers during the checkout session initialization.

Alon Barad
Alon Barad
3 views•6 min read
•about 5 hours ago•CVE-2026-53944
5.8

CVE-2026-53944: Server-Side Request Forgery Private IP Filtering Bypass in Ghost CMS

A Server-Side Request Forgery (SSRF) vulnerability exists in the Ghost content management system from version 6.0.9 up to, but not including, 6.21.1. The flaw resides in the 'request-external.js' module, where the IP address validation blocklist fails to account for fully expanded IPv4-mapped IPv6 formats. This allows unauthenticated remote attackers to bypass the private IP filter and initiate unauthorized connections to loopback services, internal subnets, or cloud instance metadata endpoints.

Amit Schendel
Amit Schendel
5 views•7 min read