← Back to CVE Explorer

CVE-2026-47209

Full vulnerability record from the local CVENow database.

Description

vm2 is an open source vm/sandbox for Node.js. Prior to version 3.11.4, the BaseHandler.set trap in bridge.js (line 1231) ignores the receiver parameter and unconditionally writes to the host target object. Per the Proxy set trap specification, when receiver !== proxy (e.g., when a child object inherits from the proxy via Object.create), the property assignment should create an own property on the receiver, not on the proxy target. The current implementation always calls otherReflectSet(object, key, value) against the host target, causing all inherited property writes to leak through to the host object. This bug provides an alternative attack vector for writing dangerous cross-realm Symbol keys (e.g., nodejs.util.promisify.custom) to host objects, bypassing any future per-trap isDangerousCrossRealmSymbol guard on the direct set path. This issue has been patched in version 3.11.4.

Severity
HIGH
CVSS score
8.6 (v3.1)
Vulnerability status
Deferred
Source identifier
Published
2026-06-12 15:16:28.900000
Last modified
2026-10-26 11:10:00.157000
View original CVE JSON
{
  "id": "CVE-2026-47209",
  "sourceIdentifier": "[email protected]",
  "published": "2026-06-12T15:16:28.900",
  "lastModified": "2026-10-26T11:10:00.157",
  "vulnStatus": "Deferred",
  "cveTags": [],
  "descriptions": [
    {
      "lang": "en",
      "value": "vm2 is an open source vm/sandbox for Node.js. Prior to version 3.11.4, the BaseHandler.set trap in bridge.js (line 1231) ignores the receiver parameter and unconditionally writes to the host target object. Per the Proxy set trap specification, when receiver !== proxy (e.g., when a child object inherits from the proxy via Object.create), the property assignment should create an own property on the receiver, not on the proxy target. The current implementation always calls otherReflectSet(object, key, value) against the host target, causing all inherited property writes to leak through to the host object. This bug provides an alternative attack vector for writing dangerous cross-realm Symbol keys (e.g., nodejs.util.promisify.custom) to host objects, bypassing any future per-trap isDangerousCrossRealmSymbol guard on the direct set path. This issue has been patched in version 3.11.4."
    },
    {
      "lang": "es",
      "value": "vm2 es una vm/sandbox de código abierto para Node.js. Antes de la versión 3.11.4, la trampa BaseHandler.set en bridge.js (línea 1231) ignora el parámetro receiver y escribe incondicionalmente en el objeto objetivo del host. Según la especificación de la trampa set de Proxy, cuando receiver !== proxy (por ejemplo, cuando un objeto hijo hereda del proxy a través de Object.create), la asignación de propiedad debería crear una propiedad propia en el receiver, no en el objetivo del proxy. La implementación actual siempre llama a otherReflectSet(object, key, value) contra el objetivo del host, lo que provoca que todas las escrituras de propiedades heredadas se filtren al objeto del host. Este error proporciona un vector de ataque alternativo para escribir claves Symbol peligrosas entre reinos (por ejemplo, nodejs.util.promisify.custom) en objetos del host, eludiendo cualquier futura protección isDangerousCrossRealmSymbol por trampa en la ruta de establecimiento directo. Este problema ha sido parcheado en la versión 3.11.4."
    }
  ],
  "affected": [
    {
      "source": "[email protected]",
      "affectedData": [
        {
          "vendor": "patriksimek",
          "product": "vm2",
          "versions": [
            {
              "version": "< 3.11.4",
              "status": "affected"
            }
          ]
        }
      ]
    }
  ],
  "metrics": {
    "cvssMetricV31": [
      {
        "source": "[email protected]",
        "type": "Secondary",
        "cvssData": {
          "version": "3.1",
          "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:N/I:H/A:N",
          "baseScore": 8.6,
          "baseSeverity": "HIGH",
          "attackVector": "NETWORK",
          "attackComplexity": "LOW",
          "privilegesRequired": "NONE",
          "userInteraction": "NONE",
          "scope": "CHANGED",
          "confidentialityImpact": "NONE",
          "integrityImpact": "HIGH",
          "availabilityImpact": "NONE"
        },
        "exploitabilityScore": 3.9,
        "impactScore": 4.0
      }
    ],
    "ssvcV203": [
      {
        "source": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
        "ssvcData": {
          "timestamp": "2026-06-12T15:00:52.593086Z",
          "id": "CVE-2026-47209",
          "options": [
            {
              "exploitation": "poc"
            },
            {
              "automatable": "yes"
            },
            {
              "technicalImpact": "partial"
            }
          ],
          "role": "CISA Coordinator",
          "version": "2.0.3"
        }
      }
    ]
  },
  "weaknesses": [
    {
      "source": "[email protected]",
      "type": "Secondary",
      "description": [
        {
          "lang": "en",
          "value": "CWE-693"
        }
      ]
    }
  ],
  "references": [
    {
      "url": "https://github.com/patriksimek/vm2/commit/26d0318b5e6555be4b187ba05d6cf378ccecfe22",
      "source": "[email protected]"
    },
    {
      "url": "https://github.com/patriksimek/vm2/releases/tag/v3.11.4",
      "source": "[email protected]"
    },
    {
      "url": "https://github.com/patriksimek/vm2/security/advisories/GHSA-c4cf-2hgv-2qv6",
      "source": "[email protected]"
    }
  ]
}