FlawOpen

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

● CVE-2026-97662 · CVSS v4 6.9 · Moyenne
Recherche · FlawOpen

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 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
💡 Explication en Langage Simple (ELI5)

Un 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]
Référence Git
Nom ou expression désignant un commit ou un arbre, comme main ou HEAD~1. Une valeur commençant par - peut être lue comme une option.[2], [3]
Confinement du workspace
Limite censée maintenir les opérations de fichiers d’un outil dans le répertoire du projet. Elle est contournable si une entrée modifie le sens de la commande du sous-processus.[1], [3]

Correspondances de référentiels

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

Étape 1

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]

Étape 2

La valeur arrive à Git comme argument positionnel

Le code touché transmet la référence aux commandes Git diff et archive. Un tiret initial peut faire interpréter la valeur comme option, même si Python n’utilise pas de shell.[2], [3]

Étape 3

L’analyse d’options de Git dépasse la limite supposée

Une option adaptée à ce contexte peut diriger une écriture hors du workspace. L’impact documenté est la création, l’écrasement ou la troncature de fichiers accessibles au processus ; la portée dépend des droits et du flux.[1], [3]

Étape 4

Rejeter les références dangereuses avant tout effet

La version 0.2.0 valide base_ref avant Git, le téléversement S3 ou la vérification de l’espace agent. Mettez à jour et exécutez le processus MCP avec des droits minimaux et dans un environnement isolé.[1], [3], [6]

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]
Analyse des options Git
Git analyse toujours sa propre grammaire de ligne de commande. Le tableau n’empêche pas une référence contrôlée par l’appelant d’être interprétée comme une option ; validez-la avant d’appeler Git.[2], [3]
1

L’appelant influence la révision

L’outil diff scan reçoit base_ref depuis un flux de travail. Le risque existe uniquement si une source non fiable peut influencer cette valeur.[2], [3]

2

Le tableau d’arguments atteint quand même l’analyseur de Git

Python peut transmettre chaque valeur séparément et éviter l’analyse du shell, mais Git interprète toujours ses propres options de ligne de commande.[3], [2]

3

L’hypothèse de confinement au workspace peut échouer

Si Git traite la valeur comme une option, des fichiers peuvent être écrits hors du workspace prévu, dans la limite des permissions système du processus MCP.[1], [2]

4

La validation ferme la frontière d’entrée

La version 0.2.0 rejette les références vides ou ressemblant à des options avant Git et les autres effets de bord. L’entrée ne peut plus choisir le comportement des options Git ; les références valides sélectionnent toujours la révision demandée.[3], [6]

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]

IMPLÉMENTATION VULNÉRABLE
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,
    )
PATCH SÉCURISÉ ET ROBUSTE
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

Sources