flawopen.com/Teardowns/cve-2026-105697-langflow-mcp-stdio-command-injection
CVE-2026-105697: Langflow-MCP-Befehlsinjektion
Vor Version 1.10.3 gab Langflow MCP-stdio-Konfiguration an einen über eine Shell gestarteten Prozess weiter. Bei einer erreichbaren Instanz mit LANGFLOW_AUTO_LOGIN=true konnte ein Angreifer ohne Zugangsdaten ein Token erhalten; bei deaktivierter automatischer Anmeldung reichte weiterhin ein angemeldeter Nicht-Administrator für die Befehlsausführung auf dem Host. Version 1.10.3 prüft alle Pfade bis unmittelbar vor dem Prozessstart und startet das Programm ohne Shell.[1], [2], [3]
Stell dir einen Mitarbeiter vor, der einen Satz erhält, bei dem die Zeichensetzung den Auftrag ändern kann: Ein Zeichen kann aus einer Lieferanweisung einen zweiten Befehl machen. Langflow übergab den konfigurierten Befehl an eine Shell, die solche Syntax als Steuerzeichen interpretiert, statt Programm und Argumente als getrennte Daten zu behandeln. Die Korrektur prüft den erlaubten Befehl und startet das Programm direkt ohne Shell.[1], [2]
Kernkonzepte & Begriffe
MCP-stdio-Transport- Startet einen MCP-Server als lokalen Kindprozess und tauscht Nachrichten über die Standardein- und -ausgabe aus.[1], [2]
Befehlsinjektion (CWE-78)- Extern beeinflusster Text verändert den Betriebssystembefehl, der an Shell oder Prozessstarter übergeben wird.[1], [5]
Framework-Zuordnungen
- CWE-Referenz für die in diesem Leitfaden beschriebene Schwachstelle: CWE-78
Ursachenanalyse
Vor Version 1.10.3 setzte die MCP-stdio-Konfiguration Befehl und Argumente zu einer Zeichenfolge zusammen und startete damit bash -c. Die Konfigurations-API erhielt in 1.9.0 eine Zulassungsliste sowie Prüfungen für Argumente und Umgebung. Eingebettete MCP-Tools-Konfigurationen in Flows oder Tweaks konnten diese Modellprüfung jedoch umgehen, da die Ausführungsstelle keine gemeinsame Richtlinie durchsetzte. Langflow 1.10.3 bündelt die Prüfung in lfx.base.mcp.security.validate_mcp_stdio_config, wendet sie auf API, Flows, Tweaks, die alte Komponente und unmittelbar vor dem Prozessstart an und entfernt die Shell. CVE-2026-105697 ist CWE-78, CVSS 3.1 9.9. Bei deaktivierter automatischer Anmeldung benötigt der Angriff weiterhin einen angemeldeten Nicht-Administrator, der den betreffenden MCP-Pfad konfigurieren oder ausführen kann; die standardmäßige automatische Anmeldung kann exponierte Entwicklungsinstanzen ohne Zugangsdaten erreichbar machen.[1], [2], [4], [5]
Schritt-für-Schritt Angriffsablauf
Benutzer erreicht einen MCP-Konfigurationspfad
Der Hinweis beschreibt den Zugriff über MCP-Servereinstellungen oder einen Flow mit der MCP-Tools-Komponente. Bei einer erreichbaren Instanz mit dem Entwicklungsstandard LANGFLOW_AUTO_LOGIN=true konnte ein Angreifer ohne Zugangsdaten ein Token erhalten. Bei deaktivierter automatischer Anmeldung konnte weiterhin ein angemeldeter Nicht-Administrator ausreichen.[1]
Konfiguration erreicht die Prozessvorbereitung
Befehl und Argumente werden zu command_str, während Langflow eine MCP-stdio-Verbindung vorbereitet.[1]
Die Shell interpretiert die Zeichenfolge
Vor 1.10.3 verwendete der Startpfad bash -c; die Ausführung begann beim Verbindungsversuch und vor einem erfolgreichen MCP-Handshake.[1]
Eingangsprüfungen sind unvollständig
Version 1.9.0 prüft REST-Einstellungen, doch Flow- und Tweak-Konfigurationen können diese Modellprüfung umgehen.[1]
Hostprozess läuft mit Langflow-Rechten
Der Befehl läuft als Langflow-Dienstkonto. Die Oberfläche kann trotzdem melden, dass der MCP-Server nicht gestartet wurde.[1]
Quellcode: Verwundbar vs. Sicher
Der verwundbare Auszug zeigt das in der Meldung dokumentierte Startmuster über eine Shell; er ist kein ausführbarer Exploit. Der korrigierte Auszug fasst das Design aus Version 1.10.3 zusammen: Eine gemeinsame Richtlinie prüft die Konfiguration an jedem Eingang und erneut unmittelbar vor der Prozesserstellung; die API erhält Programm und Argumente getrennt. Der direkte Start verhindert Shell-Interpretation, macht aber nicht jedes erlaubte Programm oder Paket automatisch sicher. Betreiber müssen zusätzlich passende Kontrollen für Paketquellen und Isolation einsetzen.[1], [2]
Quelltextauszug: lfx/base/mcp/util.py — gezielte Quelltextauszüge
# Betroffene Startform laut Hinweis (gezielter Auszug):
server_params = StdioServerParameters(
command="bash",
args=["-c", f"exec {command_str}"],
env=env_data,
)
# An der Version 1.10.3 orientierte Kurzfassung: Richtlinie prüfen und den Prozess direkt starten.
command_parts = shlex.split(command_str)
if not command_parts:
raise ValueError("MCP stdio command is required")
command, args = command_parts[0], command_parts[1:]
validate_mcp_stdio_config(command, args, env_data) # Repeat at the execution boundary.
server_params = StdioServerParameters(
command=command,
args=args,
env=env_data,
) # No shell wrapper. The shared validator rejects disallowed configurations.
Checkliste für Engineering & Systemsicherheit
- ✓Aktualisiere
langflowauf 1.10.3+,langflow-baseauf 0.10.3+ undlfxauf 1.10.3+; prüfe die bereitgestellten Paketversionen.[1], [3] - ✓Behandle die REST-Prüfungen aus 1.9.0 nicht als vollständige Korrektur; untersuche eingebettete MCP-Konfigurationen in Flows und Tweaks älterer Versionen.[1]
- ✓Prüfe Befehl, Argumente, Umgebung, Paketquelle und Isolation an jedem Eingang und unmittelbar vor der Prozesserstellung.[1], [2]
- ✓Übergib ausführbare Datei und Argumentvektor getrennt an die Prozess-API; vermeide Shell-Befehlszeichenfolgen.[2]
- ✓Lege in mandantenfähigen Installationen erlaubte
npx-/uvx-Pakete fest und aktiviere die dokumentierten Interpreter- und Docker-Härtungseinstellungen.[1] - ✓FlawOpen-Empfehlung zur Reaktion auf Sicherheitsvorfälle: Prüfe, wer während der Exposition MCP-stdio-Verbindungen konfigurieren oder ausführen konnte; untersuche Host-Telemetrie auf unerwartete Langflow-Kindprozesse.[1]
- ✓Ergänze Tests für REST-API, Flow, Tweak, alte Komponente und Pre-Spawn; stelle sicher, dass abgelehnte Konfigurationen nie Prozesse erzeugen.[2]