flawopen.com/Teardowns/cve-2026-97662-aws-security-agent-mcp-git-argument-injection
CVE-2026-97662: inyección de argumentos Git en AWS Security Agent MCP
CVE-2026-97662 permitía que una referencia Git controlada por quien llama a AWS Security Agent MCP diff scan se interpretara como opción de comando, eludiendo el aislamiento del workspace y permitiendo escribir archivos en el host. Actualiza a 0.2.0 o posterior.[1], [2]
Vector 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:NA un empleado le dan la etiqueta de una carpeta, pero acepta una etiqueta que empieza con una instrucción de control. El sistema de archivo sigue la instrucción en vez de buscar la carpeta. Aquí, una referencia Git que empezaba con guion podía interpretarse como opción; rechazar referencias vacías o con aspecto de opción antes de ejecutar Git cierra esa entrada. Esto es análisis de opciones de Git, no ejecución arbitraria de comandos del shell.[2]
Conceptos Clave y Términos
Servidor MCP- Proceso local que ofrece herramientas a una aplicación de IA mediante Model Context Protocol. Los argumentos de las herramientas llegan al servidor como datos no confiables.
Inyección de argumentos (CWE-88)- Un programa de línea de comandos interpreta una entrada no confiable como opción o delimitador, aunque el proceso reciba una lista de argumentos y no una cadena de shell.[2], [4]
Mapeos de marcos
- Referencia CWE para la debilidad descrita en esta guía: CWE-88
- OWASP GenAI 2025 — LLM01:2025 Inyección de prompts
Análisis de Causa Raíz
AWS describe un fallo contextual de inyección de argumentos en la operación diff scan: una referencia proporcionada al escaneo podía tratarse como opción de línea de comandos en lugar de revisión Git. El PR upstream confirma que start_diff_scan pasaba base_ref a git diff <base_ref> -- y git archive; valores vacíos o que empezaban con guion podían interpretarse de forma distinta. No es inyección de metacaracteres de shell: una lista de argumentos evita el análisis del shell, pero el programa invocado aún puede interpretar una opción. AWS indica que el resultado podía crear, sobrescribir o truncar archivos fuera del workspace previsto, dentro de los permisos del proceso. La corrección integrada valida base_ref antes de Git y rechaza valores en blanco o cuyo texto recortado empieza con -; las pruebas confirman que no hay proceso ni carga para entradas rechazadas. Afecta a versiones >=0.1.1 y <0.2.0; 0.2.0 lo corrige. El registro CVE asigna CVSS 4.0 6,9 Medio; GitHub Advisory también informa CVSS 3.1 8,2 Alto. No se reproduce una carga de explotación.[1], [2], [3], [4]
Flujo de Ataque Paso a Paso
Un agente invoca diff scan
El servidor MCP local recibe un base_ref influido por quien llama. El riesgo depende de un flujo que permita que un repositorio, contenido o usuario no confiable influya en ese valor; una prompt injection no llega automáticamente a esta ruta.[2]
Trazado del límite: texto de revisión y opciones de Git
Flujo conceptual de datos; no es una secuencia de comandos ni una reproducción del exploit.
Dos analizadores, dos límites distintos
- Análisis del shell
- Una lista de argumentos impide que el shell interprete el valor como sintaxis del shell y cierra ese límite.[3]
La validación cierra el límite de entrada
La versión 0.2.0 rechaza referencias vacías o similares a opciones antes de ejecutar Git u otros efectos secundarios. La entrada ya no puede elegir el comportamiento de las opciones de Git; las referencias válidas siguen seleccionando la revisión solicitada.[3], [6]
Código Fuente: Vulnerable vs. Seguro
Comparación enfocada en el límite de llamada upstream, no una copia completa del scanner. El cambio integrado valida la referencia antes de Git; las pruebas cubren valores vacíos y con guion inicial sin proceso ni carga. Una lista de argumentos evita el análisis del shell, pero no evita que Git interprete opciones. Este fragmento muestra solo la llamada a git diff; la misma validación debe proteger cada uso de base_ref, incluido git archive.[3]
def start_diff_scan(path: str, base_ref: str):
# La referencia similar a una opción llega a Git antes de validarse.
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) # Rechace antes de iniciar subprocesos o subir archivos.
return subprocess.run(
["git", "diff", base_ref, "--"],
cwd=path,
check=False,
)
Lista de Verificación de Seguridad para Ingeniería
- ✓Actualiza
awslabs.security-agent-mcp-serverde las versiones 0.1.1 a 0.1.x a 0.2.0 o posterior; comprueba la versión del proceso MCP en ejecución.[1], [2], [6] - ✓Valida cada referencia Git influida por usuarios o repositorios antes de cualquier proceso Git y rechaza valores vacíos o con guion inicial antes de cargas u otros efectos secundarios.[2], [3]
- ✓Añade pruebas que demuestren que las referencias con guion inicial o solo espacios no inician procesos, cargas ni llamadas remotas; incluye referencias válidas como
main,origin/mainyHEAD~1.[3] - ✓Usa listas de argumentos en lugar de cadenas de shell, pero valida cada argumento según la gramática de opciones del programa invocado; escapar el shell no evita la inyección de argumentos.[3]
- ✓Ejecuta servidores MCP locales con permisos mínimos de archivos y un workspace aislado. Esto limita el impacto, pero no sustituye la actualización.[1]
- ✓Análisis de FlawOpen: en los flujos que llevan contenido no confiable a los argumentos de herramientas del agente, sigue todo el recorrido hasta la invocación y aplica autorización y validación en el servidor MCP.