MediumGHSA-698v-4r3x-3vcvCVE-2026-112943

launch-editor: escapeCmdArgs() omits % escaping on Windows

Published 20 Oct 2026 · Updated 20 Oct 2026

Affected packages

Affected
<2.14.2
Fixed in
2.14.2
Update to the fixed version for your release line, for example:npm install launch-editor@2.14.2
vitenpm
Affected
>=8.3.0 <8.3.3
Fixed in
8.3.3
Update to the fixed version for your release line, for example:npm install vite@8.3.3
vitenpm
Affected
>=8.2.0 <8.2.4
Fixed in
8.2.4
Update to the fixed version for your release line, for example:npm install vite@8.2.4
vitenpm
Affected
>=8.0.0 <8.1.6
Fixed in
8.1.6
Update to the fixed version for your release line, for example:npm install vite@8.1.6
vitenpm
Affected
>=7.0.0 <7.3.7
Fixed in
7.3.7
Update to the fixed version for your release line, for example:npm install vite@7.3.7
vitenpm
Affected
<6.4.4
Fixed in
6.4.4
Update to the fixed version for your release line, for example:npm install vite@6.4.4
Affected
<1.1.0
Fixed in
1.1.0
Update to the fixed version for your release line, for example:npm install vite-plus@1.1.0

Details

Summary

launch-editor did not escape % on Windows when passing an argument to cmd. When an environment variable contained a malicious value, it was possible that that content to be executed.

Impact

Only apps that match all of the following conditions are affected:

  • The user uses Windows
  • An attacker can place a file with the malicious filename containing & or %
  • Either of
  • An attacker can inject an environment variable with a malicious value
  • An attacker can add a NTFS alternate data stream to the file placed

Details

Unlike .sh files, .bat / .cmd files on Windows cannot be called directly using `child_process.spawn` and requires passing them as an argument of cmd.exe. To do so, launch-editor escapes the arguments passed to cmd.exe. But launch-editor did not escape % which is used for environment variables.

Because launch-editor checks if the argument matches an existing filename, the attack requires the attacker to be able to place a file.

  • If the attacker can inject an environment variable as well, they can include the subcommand in the env variable (e.g. set &calc.exe to %ENV%) and call launchEditor with something%ENV%.
  • If the attacker can place a NTFS alternate data stream to the file (e.g. a NTFS alternate data stream named ~-38%calc.exe), they can call launchEditor with something %CMDCMDLINE:~-38%calc.exe.
  • If the attacker can create a filename containing the %CD% and the subcommand (e.g. &calc.exe ), they can call launchEditor with ./%CD%

Is GHSA-698v-4r3x-3vcv in any of your client repos?

Checking one package by hand is fine. Checking it across forty client projects is not. NPMscan reads the lockfiles in every GitHub repo you pick, finds each project with an affected launch-editor, and gives you the command that fixes it.

References

Advisory data from OSV.dev (opens OSV.dev in a new tab), refreshed daily.