FlawOpen

flawopen.com/Teardowns/cve-2026-105697-langflow-mcp-stdio-command-injection

● CVE-2026-105697 · CVSS 9.9[1] · Kritisch
Sicherheitsforschung · FlawOpen

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]

CVSS-VektorCVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H[1]
💡 Einfache Erklärung (ELI5)

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]
Ausführungsstelle
Der letzte Codepfad, der einen Prozess erstellt; hier muss die Prüfung greifen, auch wenn die API bereits prüft.[1], [2]
Eingebettete Flow-/Tweak-Konfiguration
MCP-Einstellungen in einem Flow oder Laufzeit-Override statt über die Einstellungs-API erstellt.[1], [2]

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

Schritt 1

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]

Schritt 2

Konfiguration erreicht die Prozessvorbereitung

Befehl und Argumente werden zu command_str, während Langflow eine MCP-stdio-Verbindung vorbereitet.[1]

Schritt 3

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]

Schritt 4

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]

Schritt 5

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]

Schritt 6

1.10.3 schließt die Ausführungsgrenze

Eine gemeinsame Richtlinie prüft jede Eingabe und unmittelbar vor dem Prozessstart; das Programm wird ohne Shell gestartet.[1], [2]

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

VERWUNDBARE IMPLEMENTIERUNG
# Betroffene Startform laut Hinweis (gezielter Auszug):
server_params = StdioServerParameters(
    command="bash",
    args=["-c", f"exec {command_str}"],
    env=env_data,
)
GEHÄRTETER SICHERHEITS-PATCH
# 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

Quellen