simple-git: unsafe-operations プラグインの回避:git の長いオプションの省略形 (--receive-p / --exe) を使用したコマンド実行(CVE-2026-28291 の残骸)

simple-git の `blockUnsafeOperationsPlugin` は、危険な git オプション(--upload-pack / --receive-pack / --exec / ...)をブロックしますが、ユーザーが `unsafe:{allowUnsafePack:true}` を設定した場合にのみ許可されます。検出機能 (`@simple-git/argv-parser detectVulnerableFlags`) は、解析されたフラグの名前を、リテラル文字列パターンと比較します。パターンは `/--(upload|receive)-pack/` (リテラル文字列の '-pack' が必要) と文字列 '--exec' です。しかし、git は曖昧さのない長いオプションの省略形を受け入れ、`expandToken` (token-expander.ts) は、リテラル文字列をフラグの名前として返します(仕様は `needsNext` の場合にのみ使用され、正規化には使用されません)。したがって、`git push --receive-p=<cmd>` は、フラグの名前が '--receive-p' と解析され、`/--(upload|receive)-pack/` パターンに一致しないため、`/--(upload|receive)-pack/` パターンには一致しませんが、git は `--receive-p` を `--receive-pack` に展開し、`<cmd>` を実行します(ローカルまたはファイルのリモートに対して、ローカルで)。クローン側の処理は堅牢です(`--u` という部分文字列ルールが、すべての `--upload*` の省略形を捕捉します)。一方、`--receive-*` および `--exe*` の省略形には対応するルールがなく、これらが回避されてしまいます。

概念実証(最新:simple-git 3.36.0、`@simple-git/argv-parser` 1.1.1、デフォルトの unsafe プラグインが有効):
脆弱性チェックのゲート:`push --receive-pack=touch...` -> ブロックされます。`push --receive-pa=touch...` および `push --receive-p=touch...` -> 回避されます(脆弱性が検出されません)。`--exec=` はブロックされますが、`--exe=` は回避されます。
simpleGit().push() を使用したエンドツーエンドのテスト:
コントロール:`git.push(['../bare','HEAD:refs/heads/c','--receive-pack=touch /tmp/pwned_ctrl;'])` -> `GitPluginError` が発生し、"Use of --upload-pack or --receive-pack is not permitted..." というメッセージが表示されます。コマンドは実行されません。
回避:`git.push(['../bare','HEAD:refs/heads/e2e','--receive-p=touch /tmp/pwned_e2e;'])` -> `GitPluginError` は発生しません。`/tmp/pwned_e2e` が作成されます(git が注入されたコマンドを実行しました)。後で `GitError` が発生します。
直接的な git コマンドで確認すると、`git push ../bare --receive-p='touch X;' HEAD:refs/heads/m` および `--exe='touch Y;'` の両方が、ローカルまたはパスのリモートで実行されます。

影響:simple-gitのデフォルトの安全対策に依存するアプリケーションで、攻撃者が操作できるオプションや引数をgit pushコマンド(ローカル/ファイルのリモート、または攻撃者が操作できるreceive-packのターゲット)に渡すと、任意のコマンドが実行される可能性があります。これは、CVE-2026-28291で提供された保護機能と同じもので、短縮されたスペルによって回避されます。影響は、GHSA-jcxm-m3jx-f287と同様で、pushの処理経路に関係します。

対策:gitオプションの短縮形を比較する前に、正規化を行う(expandTokenのタスクごとのフラグ仕様を使用して、完全な長い名前を解決する)。または、push receive-pack/execの処理において、オプションの接頭辞を最も短い曖昧さのない形式まで一致させる(clone側の「--u」アプローチと同様)。また、--templateや-c/config-writeの検出についても、同様の短縮形の問題がないか確認する必要があります。

情報提供者:anir0y(独立したセキュリティ研究者)。

影響を受けるパッケージ:
- npm (JavaScript) simple-git: 影響を受けるバージョンは3.36.0以下、4.0.0で修正済み。