simple-git の安全な操作を保護する機能が、末尾コマンドの設定をブロックしない。
## 対象製品
`simple-git` のデフォルトの `blockUnsafeOperationsPlugin` は、アプリケーションが信頼できない値を `SimpleGitOptions.config` または Git のインライン設定引数(例:`-c <key>=<value>`)に渡す場合に問題となる。
## 概要
`trailer.<token>.cmd` は、デフォルトの保護機能によって危険なものとして認識されない。そのため、設定されたインラインの値が、`GitPluginError` を引き起こすことなく Git に渡される。
Git のドキュメントでは、`trailer.<token>.cmd` は `git interpret-trailers` によって呼び出されるシェルコマンドとして記述されている。したがって、安全でない設定を拒否するためにデフォルトのプラグインに依存するアプリケーションは、信頼できない末尾コマンドの設定値を通じてコマンドを実行してしまう可能性がある。
## 技術的な詳細
`simple-git/src/lib/git-factory.ts` は、`blockUnsafeOperationsPlugin` の前に `commandConfigPrefixingPlugin` をインストールする。`simple-git/src/lib/plugins/command-config-prefixing-plugin.ts` のプレフィックスプラグインは、`SimpleGitOptions.config` のすべての項目を `-c <key>=<value>` に変換し、その後、安全な操作を保護するプラグインが最終的な引数を評価する。
`simple-git@3.36.0` では、`blockUnsafeOperationsPlugin` は `@simple-git/argv-parser` に委譲する。`packages/argv-parser/src/vulnerabilities/detect-vulnerable-config-writes.ts` は、解析された設定を `preventUnsafeConfig` と比較する。このリストには `trailer.<token>.cmd` に一致するものがないため、その呼び出しは許可される。
Git v2.39.5 の `Documentation/git-interpret-trailers.txt` では、`trailer.<token>.cmd` は、トレーラーを生成または変更するために呼び出されるシェルコマンドを指定すると記述されている。
## 前提条件
アプリケーションは、デフォルトの安全な操作を保護するプラグインが有効になっている影響を受ける `simple-git` のバージョンを使用している必要がある。また、攻撃者が制御するデータを、インスタンスの設定または Git コマンドの引数として渡し、`trailer.<token>.cmd` を設定する必要がある。
呼び出されたGitバイナリは、ドキュメントに記載されているトレーラコマンドの動作をサポートしている必要があります。また、アプリケーションは、攻撃者が制御できる設定で`git interpret-trailers`コマンドを実行する必要があります。このコマンドは、Node.jsプロセスのオペレーティングシステム上のIDと権限で実行されます。
## 検証
隔離されたテスト環境と、自身の呼び出しのみを記録する無害な実行可能テストヘルパーを使用します。
**制御:** `core.editor=<test-helper>`を`SimpleGitOptions.config`を通じて設定し、安全なGitタスクを実行します。デフォルトのプラグインは、`core.editor`が`preventUnsafeConfig`に含まれているため、Gitを起動する前に`GitPluginError`を発生させるはずです。
**回避:** 同じオプションを通じて`trailer.audit.cmd=<test-helper>`を設定し、同等のargv引数でGitを実行します。
`git -c trailer.audit.cmd=<test-helper> interpret-trailers --trailer audit:<value> <input-file>`
脆弱なビルドでは、`GitPluginError`が発生しません。Gitは、トレーラを処理する際にテストヘルパーを呼び出します。ヘルパーの呼び出しを確認し、その後、テスト関連のファイルを削除します。
## 影響
指定された設定入力を制御できる攻撃者は、GitにNode.jsアプリケーションプロセスとしてシェルコマンドを実行させる可能性があります。この影響は、そのプロセスのファイルシステム、ネットワーク、およびサービス権限によって制限されます。`simple-git`に信頼できない設定やコマンド引数を公開しないアプリケーションは、この脅威モデルの範囲外です。
## 影響を受けるバージョン
コミット`6b3c631eadea81f80ed10f6dec7d19a9db4d7084`によって、デフォルトの安全でない操作プラグインが導入され、`simple-git@3.15.0`が、それを包含する最初のリリースとして確認されています。この実装では、`protocol.allow`の設定のみが拒否され、トレーラコマンドの設定はブロックされていませんでした。
最新の`simple-git`リリースである`3.36.0`でも、トレーラコマンドのマッチャーはまだ実装されていません。現在の`main`ブランチにも、そのマッチャーはありません。リリースされた修正プログラムは特定されていません。
## 対策
実行可能な動作を引き起こす可能性のある、デフォルトで拒否する設定キーを使用するか、専用の危険なカテゴリを追加して、Git を起動する前に `trailer.<token>.cmd` を拒否します。ただし、アプリケーションが明示的にオプトインする場合は例外とします。
`trailer.<token>.command` を `.cmd` とともに評価してください。Git のドキュメントでは、これらは関連するコマンドの動作として記述されています。先頭の `-c`、設定されたインスタンスのプレフィックス、および `git config` の書き込み形式について、パーサーと統合テストを追加し、明示的な危険な動作のオプトインなしに Git の子プロセスが起動されないことを確認します。
## 証拠
- `simple-git@3.15.0` は 2022年11月12日にリリースされ、初期の危険な操作プラグインが含まれています。
- `simple-git@3.36.0` は 2026年4月12日にリリースされました。そのパーサーのソースコードは `trailer.<token>.cmd` と一致しません。
- `main` ブランチでは、`packages/argv-parser/src/vulnerabilities/detect-vulnerable-config-writes.ts` に、不足しているマッチング機能が残っています。
- Git v2.39.5 は、`Documentation/git-interpret-trailers.txt` で、トレーラーコマンドの動作を記述しています。
- PR #1167 は、他の設定チェックを拡張しましたが、トレーラーコマンドのマッチング機能を追加していません。また、修正策としてリリースされていません。
- このレビューでは、GitHub を通じてリポジトリ、リリース、およびソースコードを確認しましたが、実行時の再現を独自に実施していません。
影響を受けるパッケージ:
- npm (JavaScript) simple-git: 影響範囲は 3.15.0 以降、4.0.1 未満。4.0.1 で修正済み。