fix: escape executable name for Windows shell in libnpmexec#9554
Open
tufstraka wants to merge 1 commit into
Open
fix: escape executable name for Windows shell in libnpmexec#9554tufstraka wants to merge 1 commit into
tufstraka wants to merge 1 commit into
Conversation
f6db0d5 to
d58e1fb
Compare
When npx runs a package on Windows, the bin name from package.json is passed to cmd.exe with no escaping. Characters like &, |, and spaces allow a malicious package to inject arbitrary commands. This patch escapes cmd.exe metacharacters (&, |, <, >, ^, (, ), @, !, ", \t) with ^ and rejects bin names containing characters that cannot be safely neutralized: spaces and tabs (cmd.exe always splits on these regardless of escaping), % (env var expansion precedes ^ processing), and newlines/carriage returns (act as command separators).
d58e1fb to
3926183
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
When
npxruns a package on Windows, the bin name frompackage.jsonends up in acmd.execommand. Certain characters allow a malicious package to inject arbitrary commands.Example: a package published with
"bin": {"evil&calc": "./index.js"}will runcalc.exeon a victim's machine when theynpxit —cmd.exetreats&as a command separator.This patch escapes cmd.exe metacharacters (
&,|,<,>,^,(,),@,!,",\t) with^. It also rejects bin names containing characters that cannot be safely neutralized: spaces and tabs (cmd.exe always splits on these regardless of escaping strategy),%(environment variable expansion occurs before^processing), and newlines/carriage returns (act as command separators).Verified on real Windows via GitHub Actions —
cmd.execorrectly rejects the command when the bin name contains these characters.