GitPythonのコマンドラッパーにおける、安全でないプロトコルやオプションのチェックが省略されている。

### 概要

GitPythonは、2022年から2026年にかけて、再利用可能なガード機能をメソッドごとに導入してきた。具体的には、`Git.check_unsafe_protocols(url)`(`<transport>::`リモートヘルパーURLに対して`UnsafeProtocolError`を発生させる - CVE-2022-24439)と、`Git.check_unsafe_options(...)`(禁止リストに登録されたオプション名に対して`UnsafeOptionError`を発生させる - CVE-2023-40267、CVE-2026-42215、CVE-2026-67323)。しかし、呼び出し元が制御する値に基づいて`git`の引数を構築する3つのラッパーメソッドには、これらのガード機能が**いずれも実装されていない**。

1. **`Git.ls_remote`** (git/cmd.py:1128-1143) - オプションのチェックは行われる(:1139-1141)、しかし、URLの引数はチェックされずにそのまま渡される。`allow_unsafe_protocols`というパラメータは存在しない。同じURLを`clone_from`で使用すると、`UnsafeProtocolError`が発生する。
2. **`Repo.merge_base`** (git/repo/base.py:895-936) - `**kwargs`/`*rev`が、ガード機能なしで`self.git.merge_base`に渡される。ガード機能を持つ関連メソッド`iter_commits`は、12行上の位置にある。例外ハンドラは、128以外のすべての`GitCommandError`を`[]`に吸収し、インジェクションを隠蔽する。
3. **`IndexFile.move`** (git/index/base.py:1092-1168) - `**kwargs`が、ガード機能なしで`git mv`に2回渡される(:1147、:1167)。ガード機能を持つ関連メソッド`remove()`は、23行上の位置にある。

これらの問題は、`main @ a54d159`(2026年9月21日)のバージョンで未修正であり、最新リリースである3.1.62(2026年9月7日)のリリース後も確認されている。今日、これらの問題が再度確認された。

### 影響

**サイト1 (`ls_remote`)** - 影響は、被害者のGitのトランスポートポリシーに依存する。一般的な「まずプローブを行い、次にクローンする」というパターン(`Git(...).ls_remote(attacker_url)`)において、`ext::sh -c ...`というURLを使用すると、被害者のGitが`ext`トランスポートを許可している場合、任意のコマンドが実行される。これは、`protocol.ext.allow=always`という設定で動的に検証される(検証時に実行される)。gitの標準設定では、バージョン2.38.1以降で`ext`トランスポートが拒否される(`fatal: transport 'ext' not allowed`, rc 128)。GitPythonは、追加の防御機能を実装しておらず、単に`GitCommandError`を発生させるだけである。gitのバージョンが2.38.1より前の環境では、標準設定でこの脆弱性が存在する。この脆弱性は、CVE-2022-24439として報告されている。

**サイト2/3** - 潜在的な引数注入の脆弱性:呼び出し元のキーワード引数が、オペランドや「--」の前に `git` の引数としてそのまま渡される (cmd.py:1850 の `opt_args + ext_args`)。また、`execute_kwargs` (`shell=True`/`env` を含む - CVE-2023-40267 の Windows の仕組み) が、適切な保護なしに通過する。現在、`git merge-base`/`git mv` には実行オプションはないため、ここでは直接的なリモートコード実行 (RCE) ではなく、保護機能の欠如という問題である (ベンダーによって CVE-2026-67323 で報告され、archive/ls_remote/iter_commits/blame が一つの報告書にまとめられている)。

### 動的な検証 (現在; GitPython のメインブランチ @ a54d159, git 2.55.0, Linux)

| # | 呼び出し | 結果 |
|---|---|---|
| T1 | `repo.git.ls_remote('ext::/tmp/gp_touch.sh')`, デフォルト設定 | git が拒否 (リターンコード 128); **GitPython からの `UnsafeProtocolError` は発生しない** |
| T1b | 同上 + 攻撃対象の設定 `protocol.ext.allow=always` | **マルウェアが作成され、任意のコマンドが実行される** |
| T2 | `repo.git.ls_remote('.', upload_pack=...)` | cmd.py:1141 でブロックされる (オプション側の修正が完了 - プロトコル側の脆弱性が残っている) |
| T3 | `repo.merge_base('main','side', upload_pack=...)` | **ブロックされない**; 引数は `git merge-base --upload-pack=... main side` となる。リターンコード 129 が静かに `[]` に変換される。 |
| T4 | `repo.index.move(['f1','f2'], output=...)` | **ブロックされない**; オプションが `git mv` に到達する (リターンコード 129) |

### カバレッジマトリックス (メインブランチ @ a54d159)

`check_unsafe_protocols`: 7つの呼び出し箇所 (`_clone`, `archive`, `set_url`, `create`, `fetch`, `pull`, `push`) - `ls_remote` には含まれない。
`check_unsafe_options`: 24つの呼び出し箇所 ( `ls_remote`, `iter_commits`, `IndexFile.remove` を含む) - `merge_base` と `move` には含まれない。

### 先例 (同じリポジトリ、同じ保護機能のファミリー)

- **CVE-2022-24439 / GHSA-hcpj-qp55-gfph** (重大): クローンパスにおける `check_unsafe_protocols`。サイト1は、別のAPIにある同じ `ext::` という機能を使用しています。
- **CVE-2023-40267 / GHSA-pr76-5cm5-w9cj** (重大、CVE-2022-24439 の不完全な修正): `check_unsafe_options`。引数として渡されたオプションが、セキュリティ上の問題を引き起こす可能性があります(Windows環境での `shell=True`)。
- **CVE-2026-42215 / GHSA-rpm5-65cw-6hj4** (高、3.1.47で修正済み): スペルミスを悪用する脆弱性。この脆弱性は、2026年においてもまだ影響範囲に存在します。
- **CVE-2026-67323 / GHSA-956x-8gvw-wg5v** (高、8.4、3.1.51で修正済み): `archive`/`ls_remote`/`iter_commits`/`blame` に `check_unsafe_options` を追加しました。そのPoC(概念実証)は、文字通り `repo.git.ls_remote('.', upload_pack=...)` です。これは、チェック機能が不足しているラッパー自体が脆弱性であることを示しています。このレポートは、その修正の残された部分に関するものです。`ls_remote` はオプションを受け取りますが、プロトコルは受け取りません。`merge_base`/`move` はどちらも受け取りません。

### 推奨される修正方法(既存のヘルパー関数を使用、各サイトで1〜3行)

1. `Git.ls_remote`: `if not allow_unsafe_protocols: self.check_unsafe_protocols(args[0])` + 新しい `allow_unsafe_protocols: bool = False` ( `_clone` パターン、base.py:1536-1538)。
2. `Repo.merge_base`: `check_unsafe_options(Git._option_candidates(list(rev), kwargs), unsafe_options=self.unsafe_git_revision_options)` ( `iter_commits` パターン)。128以外のステータスを隠蔽するのをやめる。
3. `IndexFile.move`: `remove()` パターンを使用し、`unsafe_git_pathspec_from_file_options` を適用する。

1つのセキュリティアドバイザリ、3つの影響を受けるメソッド、深刻度はサイト1に依存。CVE-2026-67323 のバンドリングを反映。

影響を受けるパッケージ:
- pip (Python) GitPython: 影響を受けるバージョンは 3.1.62 以下、3.2.0 で修正済み。