FlawOpen

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

● CVE-2026-97662 · CVSS v4 6.9 · Mittel
Sicherheitsforschung · FlawOpen

CVE-2026-97662: Git-Argument-Injection im AWS Security Agent MCP

CVE-2026-97662 ermöglichte, dass eine vom Aufrufer beeinflussbare Git-Referenz in AWS-Security-Agent-MCP-Diff-Scans als Befehlsoption statt als Revision interpretiert wurde. Dadurch konnte die Workspace-Begrenzung umgangen und auf dem Host geschrieben werden. Aktualisieren Sie auf 0.2.0 oder neuer.[1], [2]

CVSS-VektorCVSS:4.0/AV:L/AC:L/AT:N/PR:N/UI:P/VC:N/VI:H/VA:H/SC:N/SI:N/SA:N
💡 Einfache Erklärung (ELI5)

Ein Mitarbeiter soll einen Ordner anhand seines Etiketts finden, akzeptiert aber ein Etikett, das mit einer Steueranweisung beginnt. Das Ablagesystem führt die Anweisung aus, statt den Ordner zu suchen. Hier konnte eine mit einem Bindestrich beginnende Git-Referenz als Option gelten. Leere und optionähnliche Referenzen vor dem Git-Aufruf abzulehnen, schließt diese Eingabestelle. Hier geht es um die Optionsauswertung durch Git, nicht um die beliebige Ausführung von Shell-Befehlen.[2]

Kernkonzepte & Begriffe

MCP-Server
Ein lokaler Prozess, der einer KI-Anwendung über das Model Context Protocol Werkzeuge bereitstellt. Werkzeugargumente gelangen als nicht vertrauenswürdige Daten in den Server.
Argument-Injection (CWE-88)
Ein Kommandozeilenprogramm interpretiert nicht vertrauenswürdige Eingaben als Option oder Trennzeichen, selbst wenn es eine Argumentliste statt eines Shell-Strings erhält.[2], [4]
Git-Referenz
Ein Name oder Ausdruck für einen Commit oder Baum, etwa main oder HEAD~1. Ein mit - beginnender Wert kann als Option interpretiert werden.[2], [3]
Workspace-Begrenzung
Eine Grenze, die Dateioperationen eines Werkzeugs im ausgewählten Projektverzeichnis halten soll. Sie greift nicht, wenn eine Eingabe die Bedeutung eines Unterprozessbefehls verändert.[1], [3]

Framework-Zuordnungen

Ursachenanalyse

AWS beschreibt eine kontextabhängige Argument-Injection in der Diff-Scan-Operation: Eine übergebene Referenz konnte als Kommandozeilenoption statt als Git-Revision interpretiert werden. Der Upstream-PR bestätigt, dass start_diff_scan base_ref an git diff <base_ref> -- und git archive übergab; leere oder mit Bindestrich beginnende Werte konnten daher anders gedeutet werden. Das ist keine Shell-Metazeichen-Injection: Eine Argumentliste verhindert Shell-Parsing, aber das aufgerufene Programm kann weiterhin Optionen erkennen. Laut AWS konnten dadurch Dateien außerhalb des vorgesehenen Workspace erstellt, überschrieben oder gekürzt werden, soweit die Betriebssystemrechte des Prozesses reichten. Der zusammengeführte Fix prüft base_ref vor Git und weist leere Werte sowie Werte zurück, deren getrimmter Text mit - beginnt; Tests bestätigen, dass bei abgewiesenen Eingaben weder Unterprozess noch Upload startet. Betroffen sind Versionen >=0.1.1 und <0.2.0; Version 0.2.0 behebt den Fehler. Der CVE-Eintrag nennt CVSS 4.0 6,9 Mittel; der GitHub-Advisory nennt zusätzlich CVSS 3.1 8,2 Hoch. Ein Exploit-Payload wird hier nicht wiedergegeben.[1], [2], [3], [4]

Schritt-für-Schritt Angriffsablauf

Schritt 1

Ein Agent ruft den Diff-Scan auf

Der lokale MCP-Server erhält ein vom Aufrufer beeinflusstes base_ref. Das Risiko setzt einen Ablauf voraus, in dem ein nicht vertrauenswürdiges Repository, ein Inhalt oder ein Benutzer diesen Wert beeinflussen kann; Prompt Injection erreicht diesen Codepfad nicht automatisch.[2]

Schritt 2

Der Wert erreicht Git als Positionsargument

Der betroffene Code übergibt die Referenz an Git-Diff- und Archive-Befehle. Ein führender Bindestrich kann dazu führen, dass Git den Wert als Option liest, obwohl Python keine Shell verwendet.[2], [3]

Schritt 3

Git-Optionen umgehen die angenommene Grenze

Eine passende Option kann Schreibvorgänge aus dem Workspace herausleiten. Dokumentiert ist das Erstellen, Überschreiben oder Kürzen von Dateien, auf die der Prozess zugreifen kann; die Reichweite hängt von Berechtigungen und Ablauf ab.[1], [3]

Schritt 4

Unsichere Referenzen vor Nebenwirkungen ablehnen

Version 0.2.0 prüft base_ref vor Git, S3-Upload und Agent-Space-Prüfung. Aktualisieren Sie und betreiben Sie den MCP-Prozess mit minimalen Rechten und isoliert.[1], [3], [6]

Ablauf an der Grenze: Revisionsangabe und Git-Optionen

Konzeptioneller Datenfluss, keine Befehlsfolge und keine Exploit-Wiedergabe.

Zwei Parser, zwei getrennte Grenzen

Shell-Auswertung
Ein Argument-Array verhindert, dass die Shell den Wert als Shell-Syntax interpretiert, und schließt diese Grenze.[3]
Auswertung von Git-Optionen
Git wertet weiterhin seine eigene Kommandozeilengrammatik aus. Ein Argument-Array verhindert nicht, dass eine beeinflusste Revision als Option gilt; validieren Sie sie vor dem Git-Aufruf.[2], [3]
1

Der Aufrufer beeinflusst die Revision

Das diff-scan-Werkzeug erhält base_ref aus einem Workflow. Das Risiko besteht nur, wenn eine nicht vertrauenswürdige Quelle diesen Wert beeinflussen kann.[2], [3]

2

Ein Argument-Array erreicht trotzdem Gits Parser

Python kann jeden Wert einzeln übergeben und die Shell-Auswertung vermeiden; Git interpretiert dennoch seine eigenen Kommandozeilenoptionen.[3], [2]

3

Die Workspace-Annahme kann scheitern

Behandelt Git den Wert als Option, können Dateien außerhalb des vorgesehenen Workspace geschrieben werden, begrenzt durch die Betriebssystemrechte des MCP-Prozesses.[1], [2]

4

Validierung schließt die Eingabegrenze

Version 0.2.0 weist leere und optionsähnliche Revisionen zurück, bevor Git oder andere Nebenwirkungen starten. Die Eingabe kann nicht mehr Gits Optionsverhalten bestimmen; gültige Revisionen wählen weiterhin die angeforderte Revision aus.[3], [6]

Quellcode: Verwundbar vs. Sicher

Gezielter Vergleich der Upstream-Aufrufgrenze, keine vollständige Kopie des Scanners. Die zusammengeführte Änderung prüft die Referenz vor Git; Tests decken leere und mit Bindestrich beginnende Werte ohne Unterprozess oder Upload ab. Eine Argumentliste verhindert Shell-Parsing, aber nicht die Optionsauswertung durch Git. Dieser Ausschnitt zeigt nur den Aufruf von git diff; dieselbe Validierung muss jede Verwendung von base_ref absichern, auch bei git archive.[3]

VERWUNDBARE IMPLEMENTIERUNG
def start_diff_scan(path: str, base_ref: str):
    # Die wie eine Option wirkende Referenz erreicht Git vor der Prüfung.
    return subprocess.run(
        ["git", "diff", base_ref, "--"],
        cwd=path,
        check=False,
    )
GEHÄRTETER SICHERHEITS-PATCH
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)  # Vor dem Start von Unterprozessen oder Uploads ablehnen.
    return subprocess.run(
        ["git", "diff", base_ref, "--"],
        cwd=path,
        check=False,
    )

Checkliste für Engineering & Systemsicherheit

Quellen