{"id":"CVE-2026-49402","aliases":["EUVD-2026-38546","GHSA-7xh3-mhg9-jcw8","JLSEC-2026-656"],"status":"published","title":"Deno: Command Injection via spawnSync \u0026 spawn on Windows","description":"Deno is a JavaScript, TypeScript, and WebAssembly runtime. Prior to 2.7.10, Deno's node:child_process implementation provided an escapeShellArg() helper used when callers passed shell: true to spawn / spawnSync / exec and friends. On Windows, the helper failed to quote arguments that contained cmd.exe metacharacters and did not neutralize % (which cmd.exe expands even inside double-quoted strings). An attacker who controlled any portion of an argument passed to such a call could inject arbitrary additional commands into the spawned cmd.exe invocation. This vulnerability is fixed in 2.7.10.","severity":{"version":"3.1","score":8.1,"vector":"CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H","level":"high","assessor":"cna","from":"cve"},"epss":{"day":"2026-11-10","score":0.00445,"percentile":0.3897,"model":"v2026.06.15"},"facts":{"in_kev":false,"known_exploited":false,"public_exploit":false,"fix_available":true},"cwes":["CWE-78"],"published":"2026-06-16T19:07:44Z","modified":"2026-10-28T02:31:07Z","fixes":[{"ecosystem":"crates.io","package":"deno","fixed_in":["2.7.10"],"sources":["ghsa","osv"]},{"ecosystem":"Julia","package":"Deno_jll","fixed_in":["2.8.1+0"],"sources":["osv"]}],"affected":[{"source":"ghsa","ecosystem":"crates.io","package":"deno","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0"},{"fixed":"2.7.10"}]}]},{"source":"osv","ecosystem":"crates.io","package":"deno","ranges":[{"type":"SEMVER","events":[{"introduced":"0"},{"fixed":"2.7.10"}]}]},{"source":"osv","ecosystem":"Julia","package":"Deno_jll","ranges":[{"type":"SEMVER","events":[{"introduced":"0"},{"fixed":"2.8.1+0"}]}]}],"products":[{"vendor":"deno","product":"deno"},{"vendor":"denoland","product":"deno"}],"references":[{"url":"https://github.com/denoland/deno/security/advisories/GHSA-7xh3-mhg9-jcw8","tags":["x_refsource_CONFIRM","exploit","Exploit","Mitigation","Vendor Advisory","advisory","web"]},{"url":"https://nvd.nist.gov/vuln/detail/CVE-2026-49402","tags":["advisory"]},{"url":"https://github.com/advisories/GHSA-7xh3-mhg9-jcw8","tags":["web"]},{"url":"https://github.com/CVEProject/cvelistV5/tree/main/cves/2026/49xxx/CVE-2026-49402.json","tags":["advisory"]},{"url":"https://github.com/denoland/deno","tags":["package"]}],"sources":{"cve":[{"id":"CVE-2026-49402","title":"Deno: Command Injection via spawnSync \u0026 spawn on Windows","description":"Deno is a JavaScript, TypeScript, and WebAssembly runtime. Prior to 2.7.10, Deno's node:child_process implementation provided an escapeShellArg() helper used when callers passed shell: true to spawn / spawnSync / exec and friends. On Windows, the helper failed to quote arguments that contained cmd.exe metacharacters and did not neutralize % (which cmd.exe expands even inside double-quoted strings). An attacker who controlled any portion of an argument passed to such a call could inject arbitrary additional commands into the spawned cmd.exe invocation. This vulnerability is fixed in 2.7.10.","status":"published","published":"2026-06-23T17:20:50.122Z","modified":"2026-06-25T03:55:49.852Z","cvss":[{"version":"3.1","score":8.1,"vector":"CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H","level":"high","assessor":"cna"}],"cwes":["CWE-78"],"updated_at":"2026-11-02T13:35:10.963527Z"}],"euvd":[{"id":"EUVD-2026-38546","description":"Deno is a JavaScript, TypeScript, and WebAssembly runtime. Prior to 2.7.10, Deno's node:child_process implementation provided an escapeShellArg() helper used when callers passed shell: true to spawn / spawnSync / exec and friends. On Windows, the helper failed to quote arguments that contained cmd.exe metacharacters and did not neutralize % (which cmd.exe expands even inside double-quoted strings). An attacker who controlled any portion of an argument passed to such a call could inject arbitrary additional commands into the spawned cmd.exe invocation. This vulnerability is fixed in 2.7.10.","status":"published","published":"2026-06-23T17:20:50Z","modified":"2026-06-25T03:55:49Z","cvss":[{"version":"3.1","score":8.1,"vector":"CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H","level":"high"}],"updated_at":"2026-11-02T18:20:29.723653Z"}],"ghsa":[{"id":"GHSA-7xh3-mhg9-jcw8","title":"Deno: Command Injection via spawnSync \u0026 spawn on Windows","description":"## Summary\n\nDeno's `node:child_process` implementation provided an `escapeShellArg()` helper used when callers passed `shell: true` to `spawn` / `spawnSync` / `exec` and friends. On Windows, the helper failed to quote arguments that contained `cmd.exe` metacharacters such as `\u0026`, `|`, `\u003c`, `\u003e`, `^`, `!`, `(`, `)`, and did not neutralize `%` (which `cmd.exe` expands even inside double-quoted strings). An attacker who controlled any portion of an argument passed to such a call could inject arbitrary additional commands into the spawned `cmd.exe` invocation.\n\nThis was the Windows counterpart to CVE-2026-27190, which fixed the same class of bug in the Unix branch of `escapeShellArg`.\n\n## Details\n\nOn Windows, `child_process` with `shell: true` ran the command via `cmd.exe /d /s /c \"\u003ccommand line\u003e\"`. Deno assembled that command line by joining the program name and each argument through `escapeShellArg()`.\n\nThe vulnerable check was:\n\n```ts\n// If no special characters, return as-is\nif (!/[\\s\"\\\\]/.test(arg)) {\n  return arg;\n}\n```\n\nThe regex covered only whitespace, double-quote, and backslash. Any argument containing `cmd.exe`-significant characters but none of those three was returned unquoted and therefore interpreted by the shell. The most straightforward exploit chained commands with `\u0026`:\n\n```js\nimport { spawnSync } from \"node:child_process\";\n\nspawnSync(\"echo\", [\"test\u0026calc.exe\"], { shell: true, encoding: \"utf-8\" });\n```\n\nThe reporter confirmed this launched `calc.exe` on Windows 11 with Deno 2.7.5. The same shape worked for `|`, `\u003c`, `\u003e`, `^`, `!`, `(`, and `)`.\n\nA secondary defect existed even when arguments were quoted: `cmd.exe` expands `%FOO%` environment-variable references inside double-quoted strings. Without either doubling `%` or rejecting it, an argument like `\"%USERPROFILE%\"` leaked environment data into the command line.\n\n## Proof of concept\n\nFrom the report, run on Windows with Deno `\u003c 2.7.10`:\n\n```js\nimport { spawnSync } from \"node:child_process\";\n\nconst maliciousInput = \"test\u0026calc.exe\";\nconst result = spawnSync(\"echo\", [maliciousInput], {\n  shell: true,\n  encoding: \"utf-8\",\n});\nconsole.log(result);\n```\n\nObserved: `calc.exe` launched as a side effect of the `echo` call.\n\n## Impact\n\nAny Deno program on Windows that called `child_process.spawn` / `spawnSync` / `exec` (or any shell helper that funneled through `escapeShellArg`) with `shell: true` and incorporated untrusted input into an argument was exposed to arbitrary command execution in the context of the Deno process. The CVSS vector treated this as network-reachable / high-complexity because the typical exposure path was a Deno service accepting external input and forwarding it to a shelled-out subprocess.\n\nNot affected:\n\n- Calls without `shell: true` (the default), which executed the program directly via `CreateProcess` without `cmd.exe` interpretation.\n- Unix platforms, which used the single-quote branch of `escapeShellArg` and were already fixed under CVE-2026-27190.\n- Callers that built command strings themselves and passed them as a single string with `shell: true` — those were the caller's responsibility and were never sanitized by Deno.\n\n## Workarounds\n\nUsers on unpatched versions could mitigate by:\n\n- Avoiding `shell: true` in `node:child_process` calls on Windows.\n- Building the argv directly and invoking the program without a shell.\n- Filtering or rejecting any externally-supplied argument values that contained `cmd.exe` metacharacters (`\u0026 | \u003c \u003e ^ ! ( ) %`) before passing them to `spawn` / `spawnSync` / `exec`.","status":"published","published":"2026-06-16T19:07:44Z","modified":"2026-07-20T21:01:32Z","cvss":[{"version":"3.1","score":8.1,"vector":"CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H","level":"high"}],"cwes":["CWE-78"],"updated_at":"2026-11-02T14:40:47.245721Z"}],"nvd":[{"id":"CVE-2026-49402","description":"Deno is a JavaScript, TypeScript, and WebAssembly runtime. Prior to 2.7.10, Deno's node:child_process implementation provided an escapeShellArg() helper used when callers passed shell: true to spawn / spawnSync / exec and friends. On Windows, the helper failed to quote arguments that contained cmd.exe metacharacters and did not neutralize % (which cmd.exe expands even inside double-quoted strings). An attacker who controlled any portion of an argument passed to such a call could inject arbitrary additional commands into the spawned cmd.exe invocation. This vulnerability is fixed in 2.7.10.","status":"published","published":"2026-06-23T18:18:03.177Z","modified":"2026-10-25T23:10:00.167Z","cvss":[{"version":"3.1","score":8.1,"vector":"CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H","level":"high","assessor":"secondary"},{"version":"3.1","score":8.1,"vector":"CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H","level":"high","assessor":"primary"}],"cwes":["CWE-78"],"updated_at":"2026-11-02T14:12:25.288279Z"}],"osv":[{"id":"CVE-2026-49402","title":"Deno: Command Injection via spawnSync \u0026 spawn on Windows","description":"Deno is a JavaScript, TypeScript, and WebAssembly runtime. Prior to 2.7.10, Deno's node:child_process implementation provided an escapeShellArg() helper used when callers passed shell: true to spawn / spawnSync / exec and friends. On Windows, the helper failed to quote arguments that contained cmd.exe metacharacters and did not neutralize % (which cmd.exe expands even inside double-quoted strings). An attacker who controlled any portion of an argument passed to such a call could inject arbitrary additional commands into the spawned cmd.exe invocation. This vulnerability is fixed in 2.7.10.","status":"published","published":"2026-06-23T17:20:50.122Z","modified":"2026-10-28T02:31:07.451296762Z","cvss":[{"version":"3.1","score":8.1,"vector":"CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H","level":"high"}],"cwes":["CWE-78"],"updated_at":"2026-11-02T15:45:07.060148Z"},{"id":"GHSA-7xh3-mhg9-jcw8","title":"Deno: Command Injection via spawnSync \u0026 spawn on Windows","description":"## Summary\n\nDeno's `node:child_process` implementation provided an `escapeShellArg()` helper used when callers passed `shell: true` to `spawn` / `spawnSync` / `exec` and friends. On Windows, the helper failed to quote arguments that contained `cmd.exe` metacharacters such as `\u0026`, `|`, `\u003c`, `\u003e`, `^`, `!`, `(`, `)`, and did not neutralize `%` (which `cmd.exe` expands even inside double-quoted strings). An attacker who controlled any portion of an argument passed to such a call could inject arbitrary additional commands into the spawned `cmd.exe` invocation.\n\nThis was the Windows counterpart to CVE-2026-27190, which fixed the same class of bug in the Unix branch of `escapeShellArg`.\n\n## Details\n\nOn Windows, `child_process` with `shell: true` ran the command via `cmd.exe /d /s /c \"\u003ccommand line\u003e\"`. Deno assembled that command line by joining the program name and each argument through `escapeShellArg()`.\n\nThe vulnerable check was:\n\n```ts\n// If no special characters, return as-is\nif (!/[\\s\"\\\\]/.test(arg)) {\n  return arg;\n}\n```\n\nThe regex covered only whitespace, double-quote, and backslash. Any argument containing `cmd.exe`-significant characters but none of those three was returned unquoted and therefore interpreted by the shell. The most straightforward exploit chained commands with `\u0026`:\n\n```js\nimport { spawnSync } from \"node:child_process\";\n\nspawnSync(\"echo\", [\"test\u0026calc.exe\"], { shell: true, encoding: \"utf-8\" });\n```\n\nThe reporter confirmed this launched `calc.exe` on Windows 11 with Deno 2.7.5. The same shape worked for `|`, `\u003c`, `\u003e`, `^`, `!`, `(`, and `)`.\n\nA secondary defect existed even when arguments were quoted: `cmd.exe` expands `%FOO%` environment-variable references inside double-quoted strings. Without either doubling `%` or rejecting it, an argument like `\"%USERPROFILE%\"` leaked environment data into the command line.\n\n## Proof of concept\n\nFrom the report, run on Windows with Deno `\u003c 2.7.10`:\n\n```js\nimport { spawnSync } from \"node:child_process\";\n\nconst maliciousInput = \"test\u0026calc.exe\";\nconst result = spawnSync(\"echo\", [maliciousInput], {\n  shell: true,\n  encoding: \"utf-8\",\n});\nconsole.log(result);\n```\n\nObserved: `calc.exe` launched as a side effect of the `echo` call.\n\n## Impact\n\nAny Deno program on Windows that called `child_process.spawn` / `spawnSync` / `exec` (or any shell helper that funneled through `escapeShellArg`) with `shell: true` and incorporated untrusted input into an argument was exposed to arbitrary command execution in the context of the Deno process. The CVSS vector treated this as network-reachable / high-complexity because the typical exposure path was a Deno service accepting external input and forwarding it to a shelled-out subprocess.\n\nNot affected:\n\n- Calls without `shell: true` (the default), which executed the program directly via `CreateProcess` without `cmd.exe` interpretation.\n- Unix platforms, which used the single-quote branch of `escapeShellArg` and were already fixed under CVE-2026-27190.\n- Callers that built command strings themselves and passed them as a single string with `shell: true` — those were the caller's responsibility and were never sanitized by Deno.\n\n## Workarounds\n\nUsers on unpatched versions could mitigate by:\n\n- Avoiding `shell: true` in `node:child_process` calls on Windows.\n- Building the argv directly and invoking the program without a shell.\n- Filtering or rejecting any externally-supplied argument values that contained `cmd.exe` metacharacters (`\u0026 | \u003c \u003e ^ ! ( ) %`) before passing them to `spawn` / `spawnSync` / `exec`.","status":"published","published":"2026-06-16T19:07:44Z","modified":"2026-07-20T21:15:27.148628005Z","cvss":[{"version":"3.1","score":8.1,"vector":"CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H","level":"high"}],"cwes":["CWE-78"],"updated_at":"2026-11-02T15:46:41.732368Z"},{"id":"JLSEC-2026-656","title":"Deno: Command Injection via spawnSync \u0026 spawn on Windows","description":"## Summary\n\nDeno's `node:child_process` implementation provided an `escapeShellArg()` helper used when callers passed `shell: true` to `spawn` / `spawnSync` / `exec` and friends. On Windows, the helper failed to quote arguments that contained `cmd.exe` metacharacters such as `\u0026`, `|`, `\u003c`, `\u003e`, `^`, `!`, `(`, `)`, and did not neutralize `%` (which `cmd.exe` expands even inside double-quoted strings). An attacker who controlled any portion of an argument passed to such a call could inject arbitrary additional commands into the spawned `cmd.exe` invocation.\n\nThis was the Windows counterpart to CVE-2026-27190, which fixed the same class of bug in the Unix branch of `escapeShellArg`.\n\n## Details\n\nOn Windows, `child_process` with `shell: true` ran the command via `cmd.exe /d /s /c \"\u003ccommand line\u003e\"`. Deno assembled that command line by joining the program name and each argument through `escapeShellArg()`.\n\nThe vulnerable check was:\n\n```ts\n// If no special characters, return as-is\nif (!/[\\s\"\\\\]/.test(arg)) {\n  return arg;\n}\n```\n\nThe regex covered only whitespace, double-quote, and backslash. Any argument containing `cmd.exe`-significant characters but none of those three was returned unquoted and therefore interpreted by the shell. The most straightforward exploit chained commands with `\u0026`:\n\n```js\nimport { spawnSync } from \"node:child_process\";\n\nspawnSync(\"echo\", [\"test\u0026calc.exe\"], { shell: true, encoding: \"utf-8\" });\n```\n\nThe reporter confirmed this launched `calc.exe` on Windows 11 with Deno 2.7.5. The same shape worked for `|`, `\u003c`, `\u003e`, `^`, `!`, `(`, and `)`.\n\nA secondary defect existed even when arguments were quoted: `cmd.exe` expands `%FOO%` environment-variable references inside double-quoted strings. Without either doubling `%` or rejecting it, an argument like `\"%USERPROFILE%\"` leaked environment data into the command line.\n\n## Proof of concept\n\nFrom the report, run on Windows with Deno `\u003c 2.7.10`:\n\n```js\nimport { spawnSync } from \"node:child_process\";\n\nconst maliciousInput = \"test\u0026calc.exe\";\nconst result = spawnSync(\"echo\", [maliciousInput], {\n  shell: true,\n  encoding: \"utf-8\",\n});\nconsole.log(result);\n```\n\nObserved: `calc.exe` launched as a side effect of the `echo` call.\n\n## Impact\n\nAny Deno program on Windows that called `child_process.spawn` / `spawnSync` / `exec` (or any shell helper that funneled through `escapeShellArg`) with `shell: true` and incorporated untrusted input into an argument was exposed to arbitrary command execution in the context of the Deno process. The CVSS vector treated this as network-reachable / high-complexity because the typical exposure path was a Deno service accepting external input and forwarding it to a shelled-out subprocess.\n\nNot affected:\n\n  - Calls without `shell: true` (the default), which executed the program directly via `CreateProcess` without `cmd.exe` interpretation.\n  - Unix platforms, which used the single-quote branch of `escapeShellArg` and were already fixed under CVE-2026-27190.\n  - Callers that built command strings themselves and passed them as a single string with `shell: true` — those were the caller's responsibility and were never sanitized by Deno.\n\n## Workarounds\n\nUsers on unpatched versions could mitigate by:\n\n  - Avoiding `shell: true` in `node:child_process` calls on Windows.\n  - Building the argv directly and invoking the program without a shell.\n  - Filtering or rejecting any externally-supplied argument values that contained `cmd.exe` metacharacters (`\u0026 | \u003c \u003e ^ ! ( ) %`) before passing them to `spawn` / `spawnSync` / `exec`.","status":"published","published":"2026-07-07T13:43:33.746Z","modified":"2026-07-18T00:02:18.301285826Z","cvss":[{"version":"3.1","score":8.1,"vector":"CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H","level":"high"}],"updated_at":"2026-11-02T15:47:18.573531Z"}]}}
