shell-quote: `quote()`コマンドにおける、トークン内の改行文字によるコマンドインジェクションの脆弱性。これは、`{ comment }`トークンに続くトークン内で発生します。
### 影響
`quote()`は、`{ comment }`トークンを`#`に続いてそのテキストを付加した形で出力します。これにより、シェル行の残りの部分がコメントアウトされます。このコメントアウトには、後続の文字列トークンの開始引用符も含まれます。その後続の文字列内の改行文字がコメントを終了し、残りの文字列がシェル入力として解釈されます。
```js
quote(['echo', 'ok', { comment: 'x' }, 'a\nid;#']);
// echo ok #x 'a
// id;#'
```
この結果、`sh`、`bash`、`dash`、`ksh`、または`zsh`に渡されると、`id`コマンドが実行されます。
`parse()`は、単語の中央にある`#`に対してコメントトークンを出力します(例:`http://example.com/#frag`)。したがって、`parse()`の出力と別の信頼できない文字列を組み合わせるような処理(例:`quote(parse(untrustedCommand).concat(untrustedArg))`)を行うコードは影響を受けます。CVE-2026-9277の修正では、コメント自身のテキスト内の改行文字は排除されましたが、その後のトークン内の改行文字は排除されていません。
この脆弱性を悪用するには、攻撃者が制御する文字列に、`quote()`呼び出し内で`{ comment }`トークンに続く改行文字が含まれている必要があります。
### 修正
v1.11.0で修正されました。`quote()`は、`{ comment }`トークンに続く文字列に改行文字(`\n`、`\r`、U+2028、またはU+2029)が含まれている場合に、`TypeError`をスローします。
### 対策
`quote()`を呼び出す前に、`{ comment }`トークン以降のすべてのトークンを削除するか、信頼できない文字列内の改行文字を拒否してください。また、`quote()`の出力にコメントが含まれている場合は、その後に他のシェルテキストを付加しないでください。なぜなら、コメントによってそのテキストが無視されるからです。
影響を受けるパッケージ:
- npm (JavaScript) shell-quote: 影響範囲は1.8.4以上、1.11.0未満。1.11.0で修正済み。