Skip to content
Heist/ feed
Back to feed
Critical

vm2 3.9.6 through 3.11.5 Sandbox Escape via node:test

Type: advisorySources: OSV

vm2 versions >= 3.9.6 and <= 3.11.6 are affected by a NodeVM builtin allowlist bypass that permits a sandbox escape on Node.js 24 and newer when the embedder explicitly allows the node:test builtin (e.g. require: { builtin: ['node:test'] }). On Node.js 24+, module.builtinModules exposes the scheme-only key node:test, which is not covered by vm2's family-based DANGEROUS_BUILTINS protection, so it is stored in the generic host-passthrough loader. Because requireImpl() in lib/setup-node-sandbox.js strips a single 'node:' prefix before the builtin lookup, sandbox code calling require('node:node:test') resolves to the stored node:test key and receives a readonly proxy to the host module. Calls to node:test.run() are forwarded to the host implementation, which spawns a separate Node process for process-isolated test execution and passes through attacker-controlled execArgv values; supplying --eval= therefore executes arbitrary JavaScript in an unrestricted host Node process outside the NodeVM sandbox. Fixed in vm2 3.11.7.

Products
Not specified
Affected versions
Not specified
Fixed versions
Not specified
CVEs
CVE-2026-92948
Confirmed fixed CVEs
Not specified
Updated in this feed
7 Nov 2026, 04:05 UTC · Revision 1

Source evidence

vm2 3.9.6 through 3.11.5 Sandbox Escape via node:test

core-osv · Original source

Published 17 Sept 2026, 13:46 UTC

vm2 versions >= 3.9.6 and <= 3.11.6 are affected by a NodeVM builtin allowlist bypass that permits a sandbox escape on Node.js 24 and newer when the embedder explicitly allows the node:test builtin (e.g. require: { builtin: ['node:test'] }). On Node.js 24+, module.builtinModules exposes the scheme-only key node:test, which is not covered by vm2's family-based DANGEROUS_BUILTINS protection, so it is stored in the generic host-passthrough loader. Because requireImpl() in lib/setup-node-sandbox.js strips a single 'node:' prefix before the builtin lookup, sandbox code calling require('node:node:test') resolves to the stored node:test key and receives a readonly proxy to the host module. Calls to node:test.run() are forwarded to the host implementation, which spawns a separate Node process for process-isolated test execution and passes through attacker-controlled execArgv values; supplying --eval= therefore executes arbitrary JavaScript in an unrestricted host Node process outside the NodeVM sandbox. Fixed in vm2 3.11.7.

osv:CVE-2026-92948
Complete source record
{
  "id": "5c53ddb53cc33a01ef6525986d2d7ac80d8948913f4ba978b2e95c1689c5a37c",
  "url": "https://osv.dev/vulnerability/CVE-2026-92948",
  "method": "structured",
  "payload": {
    "kind": "advisory",
    "title": "vm2 3.9.6 through 3.11.5 Sandbox Escape via node:test",
    "summary": "vm2 versions >= 3.9.6 and <= 3.11.6 are affected by a NodeVM builtin allowlist bypass that permits a sandbox escape on Node.js 24 and newer when the embedder explicitly allows the node:test builtin (e.g. require: { builtin: ['node:test'] }). On Node.js 24+, module.builtinModules exposes the scheme-only key node:test, which is not covered by vm2's family-based DANGEROUS_BUILTINS protection, so it is stored in the generic host-passthrough loader. Because requireImpl() in lib/setup-node-sandbox.js strips a single 'node:' prefix before the builtin lookup, sandbox code calling require('node:node:test') resolves to the stored node:test key and receives a readonly proxy to the host module. Calls to node:test.run() are forwarded to the host implementation, which spawns a separate Node process for process-isolated test execution and passes through attacker-controlled execArgv values; supplying --eval= therefore executes arbitrary JavaScript in an unrestricted host Node process outside the NodeVM sandbox. Fixed in vm2 3.11.7.",
    "evidence": "osv:CVE-2026-92948",
    "products": [],
    "severity": "critical",
    "structured": {
      "id": "CVE-2026-92948",
      "aliases": [
        "CVE-2026-92948",
        "GHSA-qhwx-74w5-xhxq"
      ],
      "metrics": [
        {
          "type": "CVSS_V4",
          "score": "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"
        }
      ],
      "affected": [
        {
          "ranges": [
            {
              "repo": "https://github.com/patriksimek/vm2",
              "type": "GIT",
              "events": [
                {
                  "introduced": "532120d5cdec7da8225fc6242e154ebabc63fe4d"
                },
                {
                  "fixed": "0c5b63a228c0af88d4a0d364ab0b90df278d710e"
                }
              ],
              "database_specific": {
                "extracted_events": [
                  {
                    "range": [
                      {
                        "introduced": "3.9.6"
                      },
                      {
                        "fixed": "3.11.7"
                      }
                    ],
                    "source": "AFFECTED_FIELD",
                    "strategy": "StandardRange"
                  }
                ]
              }
            }
          ],
          "versions": [
            "3.11.6",
            "v3.11.5",
            "v3.11.4",
            "v3.11.3",
            "v3.11.2",
            "v3.11.1",
            "v3.11.0",
            "v3.10.5",
            "v3.10.4",
            "v3.10.3",
            "v3.10.2",
            "v3.10.1",
            "v3.10.0",
            "3.9.19",
            "3.9.18",
            "3.9.17",
            "3.9.16",
            "3.9.15",
            "3.9.14",
            "3.9.13",
            "3.9.12",
            "3.9.11",
            "3.9.10",
            "3.9.9",
            "3.9.8",
            "3.9.7",
            "3.9.6"
          ],
          "database_specific": {
            "source": "https://storage.googleapis.com/cve-osv-conversion/osv-output/CVE-2026-92948.json"
          }
        }
      ],
      "modified": "2026-10-28T02:30:49.422028456Z",
      "provider": "osv",
      "references": [
        "https://github.com/CVEProject/cvelistV5/tree/main/cves/2026/92xxx/CVE-2026-92948.json",
        "https://github.com/patriksimek/vm2/security/advisories/GHSA-qhwx-74w5-xhxq",
        "https://nvd.nist.gov/vuln/detail/CVE-2026-92948",
        "https://www.vulncheck.com/advisories/vm2-3.9.6-through-3.11.5-sandbox-escape-via-node-test"
      ],
      "provider_metadata": {
        "cwe_ids": [
          "CWE-693"
        ],
        "cna_assigner": "VulnCheck",
        "osv_generated_from": "https://github.com/CVEProject/cvelistV5/tree/main/cves/2026/92xxx/CVE-2026-92948.json"
      }
    },
    "related_cves": [
      {
        "value": "CVE-2026-92948",
        "evidence": "/id"
      }
    ],
    "security_relevant": true,
    "severity_evidence": "/severity/0/score"
  },
  "source_id": "core-osv",
  "document_id": 517989,
  "published_at": "2026-09-17T13:46:08.814+00:00"
}