flawopen.com/Teardowns/cve-2026-97662-aws-security-agent-mcp-git-argument-injection
CVE-2026-97662: injeção de argumentos Git no AWS Security Agent MCP
CVE-2026-97662 permitia que uma referência Git influenciada pelo chamador em diff scans do AWS Security Agent MCP fosse interpretada como opção de comando, contornando o confinamento do workspace e permitindo gravações no host. Atualize para 0.2.0 ou posterior.[1], [2]
Vetor 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:NUm funcionário recebe o rótulo de uma pasta, mas aceita um rótulo que começa com uma instrução de controle. O sistema de arquivos executa a instrução em vez de procurar a pasta. Aqui, uma referência Git iniciada por hífen podia ser interpretada como opção; rejeitar referências vazias ou parecidas com opções antes de chamar o Git fecha essa entrada. Isso é interpretação de opções pelo Git, não execução arbitrária de comandos pelo shell.[2]
Conceitos Centrais e Termos
Servidor MCP- Processo local que oferece ferramentas a um aplicativo de IA pelo Model Context Protocol. Os argumentos das ferramentas entram no servidor como dados não confiáveis.
Injeção de argumentos (CWE-88)- Entrada não confiável é interpretada como opção ou delimitador por um programa de linha de comando, mesmo quando o processo recebe uma lista de argumentos e não uma string de shell.[2], [4]
Mapeamentos de frameworks
- Referência CWE para a fraqueza descrita neste guia: CWE-88
- OWASP GenAI 2025 — LLM01:2025 Injeção de prompt
Análise de Causa Raiz
A AWS descreve uma falha contextual de injeção de argumentos na operação diff scan: uma referência fornecida à verificação podia ser tratada como opção de linha de comando, e não como revisão Git. O PR upstream confirma que start_diff_scan passava base_ref para git diff <base_ref> -- e git archive; valores vazios ou iniciados por hífen podiam ser interpretados incorretamente. Não é injeção de metacaracteres de shell: uma lista de argumentos evita a análise pelo shell, mas o programa chamado ainda pode interpretar uma opção. A AWS informa que isso poderia criar, sobrescrever ou truncar arquivos fora do workspace pretendido, limitado às permissões do processo. A correção mesclada valida base_ref antes de chamar Git e rejeita valores em branco ou cujo texto aparado começa com -; os testes confirmam que nenhuma subprocesso ou upload ocorre para entradas rejeitadas. Afeta versões >=0.1.1 e <0.2.0; 0.2.0 corrige o problema. O CVE registra CVSS 4.0 6,9 Médio; o GitHub Advisory também informa CVSS 3.1 8,2 Alto. Não reproduzimos payload de exploração.[1], [2], [3], [4]
Fluxo de Ataque Passo a Paso
Um agente chama a ferramenta diff scan
O servidor MCP local recebe um base_ref influenciado pelo chamador. O risco depende de um fluxo que permita a um repositório, conteúdo ou usuário não confiável influenciar esse valor; prompt injection, por si só, não alcança automaticamente esse código.[2]
Rastro do limite: texto de revisão e opções do Git
Fluxo conceitual de dados, não uma sequência de comandos nem a reprodução de um exploit.
Dois parsers, dois limites distintos
- Análise do shell
- Uma lista de argumentos impede que o shell interprete o valor como sintaxe de shell, fechando esse limite.[3]
Código-Fonte: Vulnerável vs. Seguro
Comparação focada no limite de chamada upstream, não uma cópia completa do scanner. A alteração mesclada valida a referência antes do Git, e os testes cobrem entradas vazias e iniciadas por hífen sem subprocesso ou upload. Uma lista de argumentos evita a análise pelo shell, mas não impede o Git de interpretar opções. Este trecho mostra apenas a chamada a git diff; a mesma validação deve proteger todo uso de base_ref, inclusive em git archive.[3]
def start_diff_scan(path: str, base_ref: str):
# A referência semelhante a uma opção chega ao Git antes da validação.
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) # Rejeite antes de iniciar subprocessos ou enviar arquivos.
return subprocess.run(
["git", "diff", base_ref, "--"],
cwd=path,
check=False,
)
Lista de Verificação de Segurança para Engenharia
- ✓Atualize
awslabs.security-agent-mcp-serverdas versões 0.1.1 a 0.1.x para 0.2.0 ou posterior; confirme a versão do processo MCP em execução.[1], [2], [6] - ✓Valide cada referência Git influenciada por usuário ou repositório antes de iniciar subprocessos Git e rejeite valores em branco ou iniciados por hífen antes de uploads ou outros efeitos colaterais.[2], [3]
- ✓Inclua testes que provem que referências com hífen inicial ou só espaços não iniciam subprocessos, uploads ou chamadas remotas; inclua referências válidas como
main,origin/maineHEAD~1.[3] - ✓Use listas de argumentos em vez de strings de shell, mas valide cada argumento conforme a gramática de opções do programa chamado; escapar o shell não evita injeção de argumentos.[3]
- ✓Execute servidores MCP locais com permissões mínimas de arquivo e workspace isolado. Isso limita impacto, mas não substitui a atualização.[1]
- ✓Análise da FlawOpen: em fluxos que encaminham conteúdo não confiável para argumentos de ferramentas do agente, rastreie todo o caminho até a chamada da ferramenta e aplique autorização e validação no servidor MCP.