Skip to main content
← All vulnerabilities
CVE-2026-9277GHSA-W7JW-789Q-3M8P

shell-quote `quote()` does not validate object-token shapes, allowing command injection via line terminators in `.op`

Published
Last modified
published
Not listed in CISA KEV
Fix
Fixed in 1.8.4
1 proof of concept on GitHub
  • Exploitation: none
  • Automatable: no
  • Technical impact: total

Summary

shell-quote's `quote()` function did not validate object-token inputs against the operator model used by `parse()`. The `.op` field was backslash-escaped character by character using `/(.)/g`, which in JavaScript does not match line terminators (\n, \r, U+2028, U+2029). A line terminator in `.op` therefore passed through unescaped into the output; POSIX shells treat a literal newline as a command separator, so any content after it would execute as a second command. The vulnerable code path is reachable in two ways: (1) direct construction of `{ op: '...\n...' }` from external input, and (2) via `parse(cmd, envFn)` when `envFn` returns object tokens whose `.op` is attacker-influenced. Both are documented API surface. Fixed by replacing the per-character escape with strict shape validation: `.op` must match the parser's control-operator allowlist; `{ op: 'glob', pattern }` validates `pattern` and forbids line terminators; `{ comment }` validates `comment` and forbids line terminators; any other object shape throws `TypeError`.

Timeline

  1. CVE published
  2. CISA SSVC assessment

    Exploitation: none · Automatable: no · Technical impact: total

  3. Record last updated

Affected versions

  • shell-quote

    From 1.1.0 · fixed in 1.8.4

  • shell-quotenpm

    From 1.1.0 · fixed in 1.8.4

References 5

GitHub · ljharb/shell-quote

npmjs.com

GitHub · DylanZahedi/CVE-2026-9277