flawopen.com/Teardowns/cve-2026-97662-aws-security-agent-mcp-git-argument-injection
CVE-2026-97662 : injection d’arguments Git dans AWS Security Agent MCP
CVE-2026-97662 permettait à une référence Git influencée par l’appelant dans les diff scans AWS Security Agent MCP d’être interprétée comme option de commande, de contourner le confinement du workspace et d’écrire des fichiers sur l’hôte. Passez à la version 0.2.0 ou ultérieure.[1], [2]
Vecteur 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:NUn employé doit retrouver un dossier à partir de son étiquette, mais accepte une étiquette qui commence par une instruction de contrôle. Le système suit l’instruction au lieu de chercher le dossier. Ici, une référence Git commençant par un tiret pouvait être interprétée comme option ; rejeter les références vides ou ressemblant à une option avant de lancer Git ferme cette entrée. Il s’agit de l’analyse des options par Git, et non de l’exécution arbitraire de commandes par le shell.[2]
Concepts Clés et Termes
Serveur MCP- Processus local qui expose des outils à une application d’IA via le Model Context Protocol. Les arguments d’outil arrivent au serveur comme données non fiables.
Injection d’arguments (CWE-88)- Un programme en ligne de commande interprète une entrée non fiable comme option ou délimiteur, même si le processus reçoit une liste d’arguments plutôt qu’une chaîne de shell.[2], [4]
Correspondances de référentiels
- Référence CWE pour la faiblesse décrite dans ce guide : CWE-88
- OWASP GenAI 2025 — LLM01:2025 Injection de prompt
Analyse de Cause Racine
AWS décrit une injection d’arguments contextuelle dans l’opération diff scan : une référence transmise au scan pouvait être interprétée comme option de ligne de commande plutôt que comme révision Git. Le PR amont confirme que start_diff_scan transmettait base_ref à git diff <base_ref> -- et git archive ; une valeur vide ou commençant par un tiret pouvait donc être mal interprétée. Il ne s’agit pas d’injection de métacaractères shell : une liste d’arguments évite l’analyse du shell, mais le programme appelé peut toujours interpréter une option. Selon l’avis AWS, cela pouvait créer, écraser ou tronquer des fichiers hors du workspace prévu, dans les limites des droits du processus. Le correctif fusionné valide base_ref avant Git et rejette les valeurs blanches ou dont le texte épuré commence par - ; les tests vérifient qu’aucun sous-processus ni téléversement n’a lieu pour les entrées rejetées. Les versions >=0.1.1 et <0.2.0 sont touchées ; la version 0.2.0 corrige le problème. Le CVE indique CVSS 4.0 6,9 Moyen ; l’avis GitHub indique également CVSS 3.1 8,2 Élevé. Aucun payload d’exploitation n’est reproduit ici.[1], [2], [3], [4]
Déroulement de l'Attaque Étape par Étape
Un agent appelle l’outil diff scan
Le serveur MCP local reçoit un base_ref influencé par l’appelant. Le risque suppose un flux où un dépôt, un contenu ou un utilisateur non fiable peut influer sur cette valeur ; une prompt injection n’atteint pas automatiquement ce code.[2]
Traçage de la frontière : révision ou option Git
Flux de données conceptuel, pas une suite de commandes ni une reproduction d’exploit.
Deux analyseurs, deux frontières distinctes
- Analyse du shell
- Un tableau d’arguments empêche le shell d’interpréter la valeur comme une syntaxe shell et ferme cette frontière.[3]
Code Source : Vulnérable vs Sécurisé
Comparaison ciblée du point d’appel amont, et non copie complète du scanner. Le changement fusionné valide la référence avant Git ; les tests couvrent les valeurs vides et commençant par un tiret sans sous-processus ni téléversement. Une liste d’arguments évite l’analyse du shell, mais pas l’interprétation d’options par Git. Cet extrait montre uniquement l’appel à git diff ; la même validation doit protéger chaque utilisation de base_ref, y compris git archive.[3]
def start_diff_scan(path: str, base_ref: str):
# La référence ressemblant à une option atteint Git avant validation.
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) # Rejeter avant tout lancement de sous-processus ou téléversement.
return subprocess.run(
["git", "diff", base_ref, "--"],
cwd=path,
check=False,
)
Liste de Contrôle de Sécurité pour l'Ingénierie
- ✓Mettez à jour
awslabs.security-agent-mcp-serverdes versions 0.1.1 à 0.1.x vers 0.2.0 ou ultérieure ; vérifiez la version du processus MCP réellement exécuté.[1], [2], [6] - ✓Validez chaque référence Git influencée par un utilisateur ou dépôt avant tout sous-processus Git, et rejetez les valeurs vides ou commençant par un tiret avant tout téléversement ou effet secondaire.[2], [3]
- ✓Ajoutez des tests prouvant que les références commençant par un tiret ou composées d’espaces ne lancent aucun sous-processus, téléversement ni appel distant ; incluez des références valides telles que
main,origin/mainetHEAD~1.[3] - ✓Utilisez des listes d’arguments plutôt que des chaînes shell, mais validez aussi chaque argument selon la grammaire d’options du programme appelé ; l’échappement shell n’empêche pas l’injection d’arguments.[3]
- ✓Exécutez les serveurs MCP locaux avec des droits de fichiers minimaux et un workspace isolé. Cela limite l’impact, sans remplacer la mise à jour.[1]
- ✓Analyse de FlawOpen : dans les flux qui transmettent du contenu non fiable aux arguments des outils de l’agent, tracez le chemin jusqu’à l’appel de l’outil et appliquez autorisation et validation dans le serveur MCP.