flawopen.com/Teardowns/cve-2026-97662-aws-security-agent-mcp-git-argument-injection
CVE-2026-97662:AWS セキュリティエージェント MCPのGit引数インジェクション
CVE-2026-97662では、AWS Security Agent MCPの差分スキャンで呼び出し元が影響できるGit参照がコマンドオプションとして解釈され、workspaceの制約を回避してホスト上のファイルを書き換えられる可能性がありました。0.2.0以降へ更新してください。[1], [2]
CVSS ベクトル
CVSS:4.0/AV:L/AC:L/AT:N/PR:N/UI:P/VC:N/VI:H/VA:H/SC:N/SI:N/SA:N係員がラベルを頼りに書類を探しますが、制御指示で始まるラベルも受け付けてしまいます。保管システムは書類を探す代わりに、その指示を実行します。この問題では、ハイフンで始まるGit参照がオプションとして扱われる可能性がありました。Gitを起動する前に空の参照やオプションに見える参照を拒否すれば、この入力境界を閉じられます。 これは Git によるオプション解析であり、任意のシェルコマンド実行ではありません。[2]
主要な概念と専門用語
MCPサーバー- Model Context Protocolを介してAIアプリケーションにツールを提供するローカルプロセスです。ツール引数は信頼できないデータとして受け取ります。
フレームワーク対応
- このガイドで説明する弱点の CWE 参照: CWE-88
- OWASP GenAI 2025 — LLM01:2025 プロンプトインジェクション
根本原因の分析 (Root Cause)
AWSはdiff scan操作における条件付きの引数インジェクションを説明しています。スキャンに渡した参照がGitのリビジョンではなくコマンドラインオプションとして解釈される可能性がありました。上流PRによると、start_diff_scanはbase_refをgit diff <base_ref> --とgit archiveに渡しており、空の値やハイフンで始まる値が誤解釈され得ました。これはシェルメタ文字のインジェクションではありません。引数配列はシェルによる解析を防ぎますが、呼び出されたプログラムは引き続きオプションを解析します。AWSの説明では、プロセスのOS権限の範囲で、意図したworkspace外のファイルを作成、上書き、切り詰める可能性がありました。マージ済みの修正はGit呼び出し前にbase_refを検証し、空白値と、空白除去後に-で始まる値を拒否します。テストでは拒否時にサブプロセスもアップロードも起きないことを確認しています。対象は>=0.1.1かつ<0.2.0で、0.2.0で修正されました。CVE記録はCVSS 4.0 6.9(中)、GitHub AdvisoryはCVSS 3.1 8.2(高)も掲載しています。ここでは実行可能な攻撃ペイロードを示しません。[1], [2], [3], [4]
ステップ・バイ・ステップの攻撃フロー
エージェントがdiff scanツールを呼び出す
ローカルMCPサーバーは呼び出し元が影響できるbase_refを受け取ります。信頼できないリポジトリ、コンテンツ、ユーザーがこの値を決められるワークフローでリスクが生じます。プロンプトインジェクションだけで自動的にこのコード経路へ到達するわけではありません。[2]
境界トレース:リビジョン文字列と Git オプション
概念的なデータフローであり、コマンド列や exploit の再現ではありません。
2つのパーサー、別々の境界
- Shell の解析
- 引数配列を使うと、shell が値を shell 構文として解釈するのを防ぎ、この境界を閉じられます。[3]
ソースコード比較:脆弱 vs 堅牢化
上流の呼び出し境界に絞った比較であり、scanner全体のコピーではありません。マージ済み修正はGitの前に参照を検証し、空値とハイフンで始まる値をサブプロセスやアップロードなしで拒否するテストを追加しています。引数配列はシェル解析を防ぎますが、Gitによるオプション解析は防ぎません。 この抜粋は git diff の呼び出しだけを示します。git archive を含め、base_ref を使うすべての箇所で同じ検証を行う必要があります。[3]
def start_diff_scan(path: str, base_ref: str):
# オプションのような ref 値が検証前に Git に渡されます。
return subprocess.run(
["git", "diff", base_ref, "--"],
cwd=path,
check=False,
)
def _validate_git_ref(base_ref: str) -> None:
if not base_ref or not base_ref.strip():
raise ValueError("base_ref must not be empty.")
if base_ref.strip().startswith("-"):
raise ValueError("base_ref must not start with '-'.")
def start_diff_scan(path: str, base_ref: str):
_validate_git_ref(base_ref) # サブプロセスの起動やアップロードより前に拒否します。
return subprocess.run(
["git", "diff", base_ref, "--"],
cwd=path,
check=False,
)
エンジニアリング&システム堅牢化チェックリスト
- ✓
awslabs.security-agent-mcp-serverの0.1.1から0.1.xを0.2.0以降に更新し、実際に動作中のMCPプロセスのバージョンを確認します。[1], [2], [6] - ✓ユーザーやリポジトリの影響を受けるすべてのGit参照をGitサブプロセスの前に検証し、アップロードなどの副作用前に空値やハイフン始まりの値を拒否します。[2], [3]
- ✓ハイフン始まりや空白のみの参照でサブプロセス、アップロード、リモート呼び出しが発生しない回帰テストを追加し、
main、origin/main、HEAD~1などの有効値も確認します。[3] - ✓シェル文字列ではなく引数配列を使用し、呼び出すプログラムのオプション文法に沿って各引数を別途検証します。シェルエスケープだけでは引数インジェクションを防げません。[3]
- ✓ローカルMCPサーバーは最小限のファイル権限と隔離workspaceで実行します。これは影響を抑える策であり、更新の代替ではありません。[1]
- ✓FlawOpen の分析: 信頼できないコンテンツをエージェントのツール引数に渡すワークフローでは、ツール呼び出しまでの経路全体を追跡し、MCPサーバーで認可と検証を実施します。