Git MCPの引数注入: ref入力とCLI optionの境界
git_diffとgit_checkoutのref入力がGitのCLI optionとして解釈され、ローカルファイルの上書きにつながる脆弱性が公表されました。修正版、入力検証、実行権限を分けた導入条件です。
Read in EnglishModel Context Protocol公式のserversプロジェクトは2025年12月17日、pipパッケージ mcp-server-git のgit_diffとgit_checkoutについて、refとして渡された値がGitのCLI optionとして解釈される脆弱性を公表しました。対象は2025.12.18より前の版で、公式advisoryはローカルファイルの上書きが可能だったと説明しています。修正版は2025.12.18です。
境界が破られた理由は、tool schema上の「比較対象」や「branch名」と、下流のGit CLIが受け取る「引数」の意味が一致していなかったことです。git_diffが画面上で読取操作に見えても、入力がoptionへ変われば、下流commandの別機能が選ばれる可能性があります。tool名やread-only表示だけでは、プロセスが実際に起こす変更を証明できません。
ref入力の形と意味の確認
公式patchは2つの確認を追加しました。最初に、入力が-から始まる場合はGitへ渡す前に拒否します。次にrev_parseで、入力が実在するGit refとして解決できることを確認します。両方を通った値だけがgit_diffまたはgit_checkoutへ渡されます。
| 確認対象 | 不十分な証拠 | 受入れに必要な証拠 |
|---|---|---|
| 配布版 | 設定ファイルのpackage名 | 実行環境のmcp-server-gitが2025.12.18以降で修正を含む版 |
| 引数の形 | branch名らしい文字列 | option形式を事前拒否し、Git refとして解決済み |
| 正常系 | 起動できたことだけ | commit hash、branch、相対refなど必要な入力が動作 |
| 影響範囲 | アプリ内の入力検証だけ | 専用userやcontainerで不要なhost fileへの書込を制限 |
-から始まる入力を拒否するだけでは、存在しない文字列や用途外の値まで正しいrefにはなりません。逆に、rev_parseだけに頼ると、異常なrefが別経路で作られていた場合の防御が弱くなります。公式patchが形と意味の両方を確認するのは、この二つが別の検証だからです。
実配布物と挙動の確認
採用側は、MCP clientに書かれた起動command、実際に使うPython環境、展開済みversionを一組で記録します。公式READMEはuvxによる直接実行とpip installの両方を案内しているため、projectの依存宣言だけでは実行版を確定できません。uvxの解決結果やcache、virtual environment、container image内のpackageを、実際の起動経路に沿って確認します。
無害なtest repositoryでは、有効なbranch、commit hash、相対refで必要なdiffとcheckoutが成立することを確認します。同時に、optionとして解釈され得る入力がGit実行前に拒否され、test領域の外にfileが作成・変更されないことを記録します。checkoutは本来working treeを変更する機能なので、修正版でも利用者が許可したbranch切替の副作用は残ります。自動実行を許すrepository、未commit変更の扱い、利用者確認の条件は別途必要です。
確認範囲と限界
2026年9月22日に、公式advisory、公式patch、公式READMEを確認した解説です。MCP Guardがこの脆弱性を発見したという主張ではなく、特定の現在環境が影響を受けるという判定でもありません。影響判断には、pip package mcp-server-gitの実versionと、該当toolを呼べる主体の確認が必要です。公表内容とpatchはgit_diffとgit_checkoutを対象としており、他のGit toolの全引数や、正当なGit操作による変更まで安全だと証明するものではありません。
