Public mode

No access to your tenant or devices. Every item links to its source. What this means

Some sources, documents or advisories need attention: 274/275 feeds/APIs · 469/469 docs · 8/9 advisories · checked 22:09 UTC Customize Public modeDiscuss ChangeIntel on Discord

vm2 before 3.11.7 NodeVM Builtin Deny-List Bypass via node: Prefix

Collected exploitation and prediction evidence

Risk source coverage

CISA 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-92957

Published

vm2 through 3.11.6 does not normalize `node:`-prefixed builtin specifiers when evaluating user-supplied negative (deny) entries in a NodeVM wildcard require policy. Although NodeVM strips the `node:` prefix during require() resolution, negative wildcard entries are matched by exact string comparison against the canonical builtin names, so a policy such as `new NodeVM({ require: { builtin: ['*', '-node:child_process'] } })` fails to deny the canonical `child_process` module. Sandboxed code can therefore obtain the host `child_process` builtin via `require('child_process')` or `require('node:child_process')`, gaining references to process-spawning APIs such as execSync and spawn, which is equivalent to host command-execution capability for untrusted sandbox code. Fixed in vm2 3.11.7.

Source published
17 Sep 2026 13:46:14 UTC
Source modified
26 Sep 2026 13:30:01 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.4 CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:H/VI:H/VA:H/SC:H/SI:H/SA:H

CVSS 3.1 · 9.9 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H

euvd · EUVD-2026-81606

Published

vm2 through 3.11.6 does not normalize `node:`-prefixed builtin specifiers when evaluating user-supplied negative (deny) entries in a NodeVM wildcard require policy. Although NodeVM strips the `node:` prefix during require() resolution, negative wildcard entries are matched by exact string comparison against the canonical builtin names, so a policy such as `new NodeVM({ require: { builtin: ['*', '-node:child_process'] } })` fails to deny the canonical `child_process` module. Sandboxed code can therefore obtain the host `child_process` builtin via `require('child_process')` or `require('node:child_process')`, gaining references to process-spawning APIs such as execSync and spawn, which is equivalent to host command-execution capability for untrusted sandbox code. Fixed in vm2 3.11.7.

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:14 PM

dateUpdated: Sep 26, 2026, 1:30:01 PM

6 related source bulletins · separate from aliases

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: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: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: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: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

Source published
Sep 17, 2026, 1:46:14 PM (timezone not stated)
Source modified
Sep 26, 2026, 1:30:01 PM (timezone not stated)
Observed here
11 Nov 2026 17:05:21 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.4 CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:H/VI:H/VA:H/SC:H/SI:H/SA:H

nvd · CVE-2026-92957

Published

vm2 through 3.11.6 does not normalize `node:`-prefixed builtin specifiers when evaluating user-supplied negative (deny) entries in a NodeVM wildcard require policy. Although NodeVM strips the `node:` prefix during require() resolution, negative wildcard entries are matched by exact string comparison against the canonical builtin names, so a policy such as `new NodeVM({ require: { builtin: ['*', '-node:child_process'] } })` fails to deny the canonical `child_process` module. Sandboxed code can therefore obtain the host `child_process` builtin via `require('child_process')` or `require('node:child_process')`, gaining references to process-spawning APIs such as execSync and spawn, which is equivalent to host command-execution capability for untrusted sandbox code. Fixed in vm2 3.11.7.

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-269

Original publisher date fields

published: 2026-09-17T14:18:01.813

lastModified: 2026-09-26T14:17:00.297

Source published
17 Sep 2026 14:18:01 UTC
Source modified
26 Sep 2026 14:17:00 UTC
Observed 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

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.4 CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/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 · 9.9 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H

osv · GHSA-28q4-xrqh-9479

Withdrawn

## Duplicate Advisory This advisory has been withdrawn because it is a duplicate of GHSA-8686-vhfx-7r3j. This link is maintained to preserve external references. ## Original Description vm2 through 3.11.6 does not normalize `node:`-prefixed builtin specifiers when evaluating user-supplied negative (deny) entries in a NodeVM wildcard require policy. Although NodeVM strips the `node:` prefix during require() resolution, negative wildcard entries are matched by exact string comparison against the canonical builtin names, so a policy such as `new NodeVM({ require: { builtin: ['*', '-node:child_process'] } })` fails to deny the canonical `child_process` module. Sandboxed code can therefore obtain the host `child_process` builtin via `require('child_process')` or `require('node:child_process')`, gaining references to process-spawning APIs such as execSync and spawn, which is equivalent to host command-execution capability for untrusted sandbox code. Fixed in vm2 3.11.7. (Suggested title: "vm2 before 3.11.7: NodeVM builtin deny-list bypass via node:-prefixed specifiers exposes child_process")

Source published
17 Sep 2026 15:32:16 UTC
Source modified
1 Oct 2026 15:45:05 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:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H

CVSS_V4 · CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/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-8686-vhfx-7r3j

Published

## Summary NodeVM normalizes `node:`-prefixed builtin specifiers during `require()` resolution, but it does not normalize user-provided negative builtin entries in wildcard policy. As a result, this configuration: ```js new NodeVM({ require: { builtin: ['*', '-node:child_process'] } }); ``` does not deny the canonical `child_process` builtin. Sandboxed code can require both `child_process` and `node:child_process`, and receives the host module with process-spawning APIs such as `execSync` and `spawn`. The safe proof below only checks module and function reachability. It does not execute any OS command. ## Affected Mode NodeVM. ## Affected Configuration ```js new NodeVM({ require: { builtin: ['*', '-node:child_process'] } }); ``` This affects users who deny builtins using their `node:`-prefixed spelling, expecting `-node:child_process` to deny `require('node:child_process')` and `require('child_process')`. ## Affected Files / Functions - `lib/builtin.js` - `makeBuiltinsFromLegacyOptions` - wildcard builtin expansion - exact negative entry check: `builtins.indexOf(\`-${name}\`)` - `addDefaultBuiltin` - `lib/resolver.js` - `Resolver.resolve` - `lib/setup-node-sandbox.js` - `requireImpl` - `node:` prefix stripping before builtin load ## Root Cause `lib/setup-node-sandbox.js` strips the `node:` prefix from resolved builtin filenames before loading the builtin: ```js if (localStringPrototypeStartsWith(filename, 'node:')) { id = localStringPrototypeSlice(filename, 5); let nmod = cacheBuiltins[id]; if (!nmod) { nmod = loadBuiltinModule(id); if (!nmod) throw new VMError(`Cannot find module '${filename}'`, 'ENOTFOUND'); cacheBuiltins[id] = nmod; } return nmod; } ``` But `lib/builtin.js` checks wildcard negative entries by exact string match against the names in `BUILTIN_MODULES`: ```js if (builtins.indexOf(`-${name}`) === -1) { addDefaultBuiltin(res, name, hostRequire); } ``` `BUILTIN_MODULES` contains the canonical name `child_process`, not `node:child_process`. Therefore `-node:child_process` does not exclude `child_process`, and `addDefaultBuiltin()` registers the host builtin. ## Security Boundary Crossed Sandboxed code reaches a host builtin that the embedder attempted to deny. Boundary crossed: - sandbox -> host `child_process` builtin - sandbox -> host process-spawning function references ## Impact Confirmed impact: - `require('child_process')` succeeds inside the sandbox. - `require('node:child_process')` succeeds inside the sandbox. - The returned module exposes `execSync` and `spawn` as functions. Worst confirmed impact is access to host process-spawning APIs. The proof does not execute any command. The proof does not execute a command, but it confirms access to the host child_process module and its process-spawning APIs. For untrusted sandbox code, this is equivalent to command execution capability. ## Safe Local Reproduction Tested on Node.js `v24.14.0`. This proof only checks whether the module and dangerous functions are reachable. It does not spawn a process and does not run OS commands. ```js 'use strict'; const { NodeVM } = require('./'); function probe(builtin) { const vm = new NodeVM({ require: { builtin } }); return vm.run(` const out = {}; for (const spec of ['child_process', 'node:child_process']) { try { const cp = require(spec); out[spec] = { loaded: true, execSyncType: typeof cp.execSync, spawnType: typeof cp.spawn, moduleToStringTag: Object.prototype.toString.call(cp) }; } catch (e) { out[spec] = { loaded: false, name: e && e.name, code: e && e.code, message: e && e.message }; } } module.exports = out; `); } console.log(JSON.stringify({ nodeVersion: process.version, denyNodePrefixed: probe(['*', '-node:child_process']), denyCanonical: probe(['*', '-child_process']) }, null, 2)); ``` Observed result: ```json { "nodeVersion": "v24.14.0", "denyNodePrefixed": { "child_process": { "loaded": true, "execSyncType": "function", "spawnType": "function", "moduleToStringTag": "[object Object]" }, "node:child_process": { "loaded": true, "execSyncType": "function", "spawnType": "function", "moduleToStringTag": "[object Object]" } }, "denyCanonical": { "child_process": { "loaded": false, "name": "VMError", "code": "ENOTFOUND", "message": "Cannot find module 'child_process'" }, "node:child_process": { "loaded": false, "name": "VMError", "code": "ENOTFOUND", "message": "Cannot find module 'node:child_process'" } } } ``` ## Expected Secure Behavior `-node:child_process` and `-child_process` should be equivalent. If either spelling is denied, both of these should fail: ```js require('child_process') require('node:child_process') ``` ## Suggested Fix 1. Canonicalize builtin names before allow/deny comparison: - Strip `node:` from user-provided builtin entries. - Preserve whether an entry is negative (`-...`) before canonicalizing. - Store and compare one canonical builtin key. 2. Apply the same normalization to: - wildcard negative entries - explicit allowlist entries - object-form builtin entries - mock/override keys if they are intended to support `node:` spelling 3. Add regression tests: - `builtin: ['*', '-node:child_process']` blocks `child_process`. - `builtin: ['*', '-node:child_process']` blocks `node:child_process`. - `builtin: ['*', '-node:fs']` blocks `fs` and `node:fs`. - `builtin: ['*', '-node:fs/promises']` and `-fs/promises` behave consistently. - Canonical dangerous builtins remain denied even if explicitly requested with `node:` spelling.

Source published
1 Oct 2026 15:36:01 UTC
Source modified
1 Oct 2026 15:45:05 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:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H

Publisher rating · CRITICAL

ChangeIntel

An IT change radar: releases, security, known issues, retirements, documentation changes, and service status from public sources. Every item links to supporting evidence; dates and statuses can change after they are read.

Sources read 11 Nov 22:09 UTC · 274 of 275 readable · 272 fully read · documentation 469/469 current