FlawOpen

flawopen.com/Teardowns/cve-2026-97662-aws-security-agent-mcp-git-argument-injection

● CVE-2026-97662 · CVSS v4 6.9 · Média
Pesquisa · FlawOpen

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 CVSSCVSS:4.0/AV:L/AC:L/AT:N/PR:N/UI:P/VC:N/VI:H/VA:H/SC:N/SI:N/SA:N
💡 Explicação em Linguagem Simples (ELI5)

Um 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]
Referência Git
Nome ou expressão que identifica um commit ou árvore, como main ou HEAD~1. Um valor iniciado por - pode ser entendido como opção.[2], [3]
Confinamento do workspace
Limite que deve manter as operações de arquivo de uma ferramenta dentro do diretório do projeto. Ele falha se uma entrada alterar o significado do comando subprocesso.[1], [3]

Mapeamentos de frameworks

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

Passo 1

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]

Passo 2

O valor chega ao Git como argumento posicional

O código afetado passa a referência aos comandos Git de diff e archive. Um hífen inicial pode fazer o Git interpretá-la como opção, mesmo sem uso de shell.[2], [3]

Passo 3

A interpretação de opções do Git rompe o limite presumido

Uma opção criada para esse contexto pode direcionar gravações para fora do workspace. O impacto documentado é criar, sobrescrever ou truncar arquivos que o processo possa gravar; o alcance depende das permissões e do fluxo.[1], [3]

Passo 4

Rejeite referências inseguras antes de efeitos colaterais

A versão 0.2.0 valida base_ref antes do Git, do upload ao S3 ou da verificação do espaço do agente. Atualize e execute o processo MCP com privilégios mínimos e isolamento.[1], [3], [6]

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]
Análise de opções do Git
O Git ainda interpreta sua própria gramática de linha de comando. A lista não impede que uma referência controlada pelo chamador seja tratada como opção; valide-a antes de executar o Git.[2], [3]
1

O chamador influencia a revisão

A ferramenta diff scan recebe base_ref de um fluxo de trabalho. O risco só existe quando uma fonte não confiável pode influenciar esse valor.[2], [3]

2

A lista de argumentos ainda chega ao parser do Git

O Python pode passar cada valor separadamente e evitar a análise pelo shell, mas o Git ainda interpreta as próprias opções de linha de comando.[3], [2]

3

A premissa de confinamento ao workspace pode falhar

Se o Git tratar o valor como opção, a saída de arquivos pode escapar do workspace previsto, limitada pelas permissões do sistema operacional do processo MCP.[1], [2]

4

A validação fecha o limite de entrada

A versão 0.2.0 rejeita referências vazias ou semelhantes a opções antes do Git e de outros efeitos colaterais. A entrada do chamador não pode mais selecionar o comportamento das opções do Git; referências válidas ainda selecionam a revisão solicitada.[3], [6]

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]

IMPLEMENTAÇÃO VULNERÁVEL
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,
    )
PATCH SEGURO E ROBUSTO
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

Fontes