Katalog CVE

CVE-2026-9277

WysokieCVSS 8.1
Opublikowano: Zaktualizowano: Przetłumaczono: NVD NIST

Prawdopodobieństwo exploitacji (EPSS)

Podwyższone ryzyko
0.85%

Percentyl 56 - wyżej niż 56% wszystkich znanych CVE

Streszczenie

W shell-quote funkcja quote() nie walidowała tokenów obiektowych względem modelu operatorów używanego przez parse(). Pole .op było escapowane znak po znaku za pomocą wyrażenia regularnego /(.)/g, które w JavaScript nie dopasowuje terminatorów linii (\n, \r, U+2028, U+2029). Terminator linii w .op przechodził więc nieescapowany do wyniku; powłoki POSIX traktują nową linię jako separator poleceń, więc zawartość po niej jest wykonywana jako drugie polecenie. Podatność jest osiągalna przez bezpośrednie konstruowanie { op: '...\n...' } lub przez parse(cmd, envFn) gdy envFn zwraca tokeny obiektowe z polem .op kontrolowanym przez atakującego. Poprawka polega na zastąpieniu escapowania znak po znaku ścisłą walidacją kształtu.

Ocena ryzyka

Atakujący może wstrzyknąć dowolne polecenia powłoki, co może prowadzić do zdalnego wykonania kodu na serwerze.

Rekomendacja

Należy zaktualizować shell-quote do wersji zawierającej poprawkę.

Powiązane podatności

Oryginalny opis (angielski, źródło NVD)

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`.

Dane podatności pochodzą z NVD (NIST) · CISA KEV · EPSS