概要
- Gitで発見された新たな脆弱性 について解説
- .gitmodulesファイル経由でリモートコード実行 が可能となる危険性
- 制御文字(CR)処理の不備 が原因で発生
- Unix系OSで特に深刻、Windowsは直接影響なし
- 最新版Gitや関連ソフトへのアップデート推奨
GitのCR(キャリッジリターン)処理脆弱性の概要
- Git clone --recursive を未信頼リポジトリで実行すると リモートコード実行 のリスク
- .gitmodulesファイル はサブモジュール情報を管理する 信頼されないファイル
- 制御文字CR(キャリッジリターン, \r, ^M) の扱いに問題
- Unix系ファイルシステム はファイル名に制御文字を許容
- Windowsは制御文字をファイル名に使用不可 のため、直接的な影響なし
技術的詳細と脆弱性の原因
-
Gitの設定ファイル形式 はINI風で [section] key = value 形式
-
Gitのconfigパーサ は行末CRを 無条件で除去
-
値の書き出し(write_pair関数) では特定条件でのみ値を引用符で囲む仕様
- 先頭/末尾がスペース、値中に;や#がある場合のみ引用符付与
-
値の末尾にCRがある場合、再読込時にCRが除去され 値が変化
-
.gitmodules内のサブモジュールpathに制御文字含む場合、検証後にパスが変化し 意図しない場所にサブモジュール展開
- 例:[submodule "foo"] path = "foo^M" → 検証時はfoo^Mとして扱うが、config再読込時にfooになる
-
検証と実際の動作でパスが食い違い、 サブモジュールの内容が予期せぬディレクトリに書き込まれる
影響範囲と対策
-
GitHub Desktop はデフォルトで --recursive オプションを利用
- 自動的にサブモジュールも取得 し、脆弱性に直面しやすい
-
コマンドラインでの手動clone の場合、 --recursiveを使わずにまず.gitmodulesを確認 することで一時的な回避策
-
macOSはCVE-2024-32002と本脆弱性(CVE-2025-48384)両方に影響
-
パッチ内容 :write_pair関数で値中にCRが含まれていれば 必ず引用符で囲む よう修正
- 修正前:if (value[i] == ';' || value[i] == '#') quote = """;
- 修正後:if (value[i] == ';' || value[i] == '#' || value[i] == '\r') quote = """;
-
最新版GitやGitHub Desktop等の関連ソフトウェアへのアップデート が必須
類似事例・教訓
- 過去にもCRLFや設定パーサの脆弱性 が複数発見
- 例:CVE-2024-32002(大文字小文字の扱いミス)
- 例:2023年 André BaptistaとVítor Pinhoによるロジックエラー
- 本質的にはプログラミング言語依存ではなく、設計上のロジックミス
- インタープロセス通信や設定ファイル処理では入力値の厳格な検証が重要
- CRLFインジェクションやHTTP/SMTPスミッシングと類似性
- Postelの法則(寛容な入力受容)は現代のセキュリティ観点では再考が必要
まとめと推奨アクション
- .gitmodulesなど未信頼ファイルの処理には細心の注意
- 制御文字や特殊文字の扱いに注意
- 関連ソフトウェアの定期的なアップデート
- セキュリティ監査や入力検証の徹底
- 脆弱性詳細やPoCは現時点で非公開だが、修正コミットのテスト等にヒントあり
G-Research Open Source による監査で発見 今後も同様の設計ミスに注意喚起