CVE-2026–33017 — уязвимость удаленного выполнения кода (RCE) в Langflow версиях до 1.9.0.
Langflow — это инструмент для создания и развертывания агентов и рабочих процессов на основе ИИ.
🫡 Метрики
Base Score: 9.3 CRITICAL
CWE: CWE-94, CWE-95, CWE-306.
🫡 Об уязвимости
В уязвимых версиях Langflow существует API-точка
/api/v1/build_public_tmp/{flow_id}/flow, которая предназначена для создания общедоступных потоков (flows) без авторизации. Конечная точка принимает необязательный параметр data с JSON-описанием графа. При его наличии сервер использует переданные данные вместо сохраненного flow из БД, что позволяет выполнить произвольный Python-код через CustomComponent не изолированно.🫡 Векторы реализации атак
1) При установки конфигурации Langflow с параметром
LANGFLOW_AUTO_LOGIN: "true" , злоумышленник может посмотреть flow_id любого публичного потока через GET-запрос на конечную точку /api/v1/flows/.Или создать публичный поток через запрос POST/PATCH на конечную точку
/api/v1/flows/
После эксплуатации уязвимости публичный поток может быть удален через DELETE-запрос к
/api/v1/flows/.2) При установки конфигурации Langflow с параметром
LANGFLOW_AUTO_LOGIN: "false" получение значения flow_id публичного потока злоумышленником, усложниться. Так как все запросы на /api/v1/flows/ будут требовать авторизации. Значение Cookie client_id в обоих вариантах может быть авто сгенерированным, например, через str(uuid.uuid4()).
LANGFLOW_AUTO_LOGIN: "true" включает функцию автоматического входа и позволяет получать авторизационные cookies без явной авторизации через логин/пароль. Проверить, включена ли эта настройка, можно с помощью GET-запроса к /api/v1/auto_login: если в ответе возвращается токен авторизации, значит автоматический вход активен. Данная настройка усложняет получение flow_id, но не закрывает уязвимость.
🫡 Эксплуатация
После получения всех необходимых ID-эксплуатация структурно, выглядит так:
POST /api/v1/build_public_tmp/27a7a181-f100-4b9a-a963-13099384eac0/flow HTTP/1.1
Host: localHost
Cookie: client_id=RANDOM_STRING
Content-Type: application/json
{"data": {...}}
Пример можно увидеть на скриншоте.
🫡 Как защищаться
1) Установить LANGFLOW_AUTO_LOGIN: "false”.
2) Обновиться.
3) Написать IDS/WAF-правила, блокирующие POST-запросы на /api/v1/build_public_tmp/{flow_id}/flow, где в параметре data могут передаться потенциально опасные функции, например: import, system, exec, os, popen и т.д.
