30秒で判断
- 対応すべき人:
shell-quoteを使って、外部入力(ユーザー入力・外部データ)からシェルコマンド文字列を組み立てているNode.jsアプリの開発者 - 対応不要な人:
shell-quoteを利用していない/quote()にオブジェクトトークンを外部入力から渡していない場合 - 確認コマンド:
npm ls shell-quote(依存ツリーに含まれるか確認)
概要
shell-quote はコマンドライン文字列のクォート/パースを行う、広く使われるnpmパッケージです。CVE-2026-9277 は、quote() 関数がオブジェクトトークンの入力を parse() のオペレータモデルに照らして検証していなかったことに起因します。
.op フィールドは1文字ずつバックスラッシュでエスケープされていましたが、この処理(/(.)/g)はJavaScriptの仕様上、改行類(\n, \r, U+2028, U+2029)にマッチしません。そのため .op に改行が含まれると、エスケープされないまま出力へ通過します。POSIXシェルは生の改行をコマンド区切りとして扱うため、改行以降の内容が別コマンドとして実行され得ます。
この経路は、(1) 外部入力から { op: '...\n...' } を直接構築する場合、(2) parse(cmd, envFn) で envFn が攻撃者の影響下にある .op を持つオブジェクトトークンを返す場合、の2通りで到達可能です。
CVSSベクトル
| 項目 | 値 |
|---|---|
| CVSSスコア | 8.1(High) |
| 攻撃区分 | 入力経路に依存(外部入力がコマンド組み立てに流れる構成) |
| 想定影響 | コマンドインジェクション(意図しないコマンド実行) |
| CWE | CWE-77 / CWE-78(コマンドインジェクション) |
影響を受けるソフトウェア
| パッケージ | エコシステム | 影響バージョン |
|---|---|---|
| shell-quote | npm | セキュリティ修正が入る前のバージョン |
shell-quoteは多くのツールの推移的依存として含まれることが多く、直接利用していなくても依存ツリーに存在する場合があります。
修正バージョンと回避策
- 修正では、1文字エスケープを厳格な形状検証に置き換え、
.opはパーサの制御オペレータ許可リストに一致する必要があり、改行類を含むトークンはTypeErrorを投げるようになりました。 - 対応:
shell-quoteを修正版(アドバイザリ GHSA-w7jw-789q-3m8p 記載のバージョン)へアップデートしてください。あわせて、外部入力をquote()のオブジェクトトークンとして渡さない設計を推奨します。
関連リンク
データソース: NVD (NIST), GitHub Advisory Database AI解説は Claude API により自動生成されています。正確性については原文をご確認ください。
