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 引用被解析为命令选项,而非修订版本,从而绕过工作区限制并在主机上写入文件。请升级到 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 对选项的解析,不是任意执行 shell 命令。[2]
核心概念与专有名词
MCP 服务器- 通过 Model Context Protocol 向 AI 应用提供工具的本地进程。工具参数进入服务器时应视为不可信数据。
框架映射
- 本指南所述弱点的 CWE 参考: CWE-88
- OWASP GenAI 2025 — LLM01:2025 提示注入
根本原因剖析 (Root Cause)
AWS 描述了差异扫描操作中的上下文相关参数注入:扫描引用可能被解释为命令行选项,而非 Git 修订版本。上游 PR 确认 start_diff_scan 将 base_ref 传入 git diff <base_ref> -- 和 git archive;空值或以短横线开头的值可能因此被误解。这不是 shell 元字符注入:参数数组能避免 shell 解析,但被调用程序仍会解析自身的选项。AWS 表示,该问题可能在预期工作区之外创建、覆盖或截断文件,具体受服务器进程的操作系统权限限制。合并的修复会在调用 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]
攻击执行流程分解
Agent 调用差异扫描工具
本地 MCP 服务器收到可能受调用方影响的 base_ref。风险取决于工作流是否允许不可信仓库、内容或用户影响该值;提示注入本身不会自动进入此代码路径。[2]
边界追踪:修订标识与 Git 选项
这是概念性数据流说明,不是命令序列或漏洞利用复现。
两个解析器,两道独立边界
- Shell 解析
- 参数数组可避免 shell 将该值解释为 shell 语法,从而封闭 shell 解析边界。[3]
源代码对比:漏洞与安全实现
这是对上游调用边界的聚焦示例,不是扫描器完整代码。合并的改动会在 Git 调用前验证引用;测试覆盖空值和短横线前缀,并确认不会启动子进程或上传。参数数组可避免 shell 解析,但不能阻止 Git 解析选项。 此代码片段仅展示 git diff 调用;每次使用 base_ref 都必须经过同一验证,包括 git archive。[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] - ✓使用参数数组而非 shell 命令字符串,同时按被调用程序的选项语法单独验证参数;shell 转义无法阻止参数注入。[3]
- ✓以最小文件权限和隔离工作区运行本地 MCP 服务器。这只能限制影响,不能替代升级。[1]
- ✓FlawOpen 分析:对于将不可信内容传入 Agent 工具参数的工作流,应追踪其到工具调用的完整路径,并在 MCP 服务器中实施授权和校验。