本文へ

利用状態: ログイン状態を復元中...

Deep DiveAbcas Security Research

Git MCPの引数注入: ref入力とCLI optionの境界

git_diffとgit_checkoutのref入力がGitのCLI optionとして解釈され、ローカルファイルの上書きにつながる脆弱性が公表されました。修正版、入力検証、実行権限を分けた導入条件です。

Read in English

Model 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操作による変更まで安全だと証明するものではありません。