flawopen.com/Teardowns/cve-2026-5027-langflow-multipart-file-write
Langflow CVE-2026-5027: обход пути при загрузке файла
CVE-2026-5027 позволяла записывать файлы вне каталога загрузки Langflow. GTIG сообщает об эксплуатации; обновитесь до 1.9.0+.[1], [2], [6]
Почтовое отделение принимает посылку, адрес и ярлык которой выбирает отправитель. Если сотрудник приклеит ярлык к папке отделения, не проверив конечный путь, посылка может оказаться за его пределами. Маршрут загрузки Langflow доверял multipart-имени файла, а слой хранения отдельно не проверял, что итоговый путь остается внутри разрешенной папки.[2], [3]
Ключевые понятия и термины
CVE-2026-5027- Идентификатор Tenable для обхода пути через multipart-имя в POST /api/v2/files Langflow:
CWE-22, CVSS 3.1 8,8; нужны низкие привилегии.[1], [2] Multipart-имя файла- Имя, переданное клиентом в заголовке Content-Disposition multipart-запроса. Это недоверенные данные, а не безопасный файловый путь.[1], [2]
Связи со стандартами
- Ссылка CWE для слабого места, описанного в этом руководстве: CWE-22
Анализ первопричины
Запись Tenable для CVE-2026-5027 сообщает, что POST /api/v2/files принимал multipart-имя с компонентами обхода пути и записывал файл вне целевого каталога. Граница безопасности проходит через API-маршрут и локальное хранилище: проверка параметров URL не проверяет имя из multipart Content-Disposition, а добавление имени к каталогу не доказывает, что путь остается внутри него. Вектор CVE требует низких привилегий (PR:L); не утверждайте, что сама CVE обходит аутентификацию. Google GTIG включает CVE-2026-5027 в список подтвержденных случаев эксплуатации в реальных атаках, но публичное резюме не доказывает универсальное выполнение кода. Последствия произвольной записи зависят от доступных для записи путей, прав процесса и конфигурации; это условный риск, а не гарантированный RCE. В связанном GHSA Langflow указан CVE-2026-33309 и также указано исправление в 1.9.0. Здесь используется CVE-2026-5027 по данным Tenable и GTIG; расхождение идентификаторов отмечено явно. Влитый патч Langflow проверяет имена на уровне API и каноническое ограничение пути в хранилище, в том числе до создания каталогов.[1], [2], [3], [4], [5], [6]
Пошаговый сценарий атаки
Исходный код: Уязвимый vs Защищённый вариант
Это сокращенные примеры, повторяющие форму исходного кода, а не дословный diff upstream. Уязвимый путь считает имя клиента путем хранения. Защищенный шаблон проверяет имя и каноническое положение назначения относительно корня на уровне хранения; PR upstream также запрещает разделители и управляющие символы и проверяет границу до создания каталогов. Проверка в хранилище нужна даже при валидации HTTP-слоем. Пример требует версию Python с Path.is_relative_to и сам по себе не устраняет гонки проверки и использования в доступных злоумышленнику каталогах. В production используйте устойчивые к гонкам файловые операции и строгие права. Защита здесь — ограничение пути, а не только черный список имен.[3], [2], [4], [7]
Фрагмент исходного кода: Langflow api/v2/files.py и services/storage/local.py — сокращенный пример границы безопасности
# Упрощенный пример уязвимого потока данных.
new_filename = file.filename
file_path = folder_path / new_filename
await write_upload(file, file_path)
from pathlib import Path
def confined_upload_path(root: Path, client_name: str | None) -> Path:
name = Path(client_name or "").name
if not name or name in {".", ".."} or chr(0) in name:
raise ValueError("invalid upload filename")
base = root.resolve()
target = (base / name).resolve()
if not target.is_relative_to(base):
raise ValueError("upload path escapes storage root")
return target
# Вызывайте на границе хранилища непосредственно перед созданием или записью.
target = confined_upload_path(upload_root, file.filename)
await write_upload(file, target)
Чек-лист по защите системы для инженеров
- ✓Обновите Langflow до 1.9.0 или новее и проверьте версии langflow и langflow-base внутри развернутого образа.[2], [4]
- ✓Проверяйте multipart-имена независимо от URL-параметров; отклоняйте разделители, управляющие символы, пустые имена и неверные кодировки.[1], [2], [3]
- ✓Канонически разрешайте назначение и ограничивайте его корнем загрузки в слое хранения до создания каталога и записи файла.[3], [4], [7]
- ✓Проверьте traversal, абсолютные пути, альтернативные разделители, нулевые байты, Unicode и символьные ссылки; файлы не должны появляться вне временного корня.[3], [7]
- ✓Запускайте Langflow от отдельной учетной записи с минимальными правами; храните загрузки без права исполнения и отдельно от кода, задач и учетных данных.[2], [4]
- ✓Проверьте доступность из Интернета и журналы загрузки на имена за пределами корня; расследуйте их и меняйте секреты только при признаках доступа к хосту.[6], [2]
- ✓Явно сохраняйте соответствие идентификаторов: Tenable/GTIG используют
CVE-2026-5027; связанный GHSA Langflow указываетCVE-2026-33309. Не объединяйте severity и диапазоны версий без проверки записей.[1], [2], [4], [5], [6]
Источники
- Запись CVE — CVE-2026-5027
- Tenable TRA-2026-26 — traversal при multipart-загрузке Langflow
- Влитый PR Langflow #12227 — проверка имен и ограничение пути
- Langflow GHSA-g2j9-7rj2-gm6c — связанный бюллетень, CVE-2026-33309
- Запись CVE — CVE-2026-33309
- Google GTIG — тенденции обнаружения и эксплуатации уязвимостей в эпоху ИИ
- MITRE CWE-22 — неправильное ограничение пути закрытым каталогом