
Detector + análise de causa-raiz para CVE-2026-72898 (SQLi não autenticado no Metabase via reset_password)
Injeção SQL não autenticada no Metabase via POST /api/session/reset_password.
CVSS 10.0, no catálogo CISA KEV, explorada ativamente.
Um campo não declarado no corpo da solicitação de redefinição de senha chega à consulta
de usuário do banco de dados da aplicação como uma estrutura HoneySQL em vez de um
identificador validado. Uma chave de objeto JSON torna-se uma keyword Clojure, então
{"raw": "<SQL>"} compila para a cláusula do HoneySQL e é emitida — SQL arbitrário contra o banco de dados da aplicação Metabase, sem
qualquer autenticação.
:rawEste repositório contém um detector (uma ferramenta de veredito cega baseada em tempo) e uma análise de causa raiz derivada do patch do fornecedor. Destina-se a defensores que verificam sua própria exposição e a pesquisadores de segurança que estudam o bug. Ele não exfiltra dados nem fornece um exploit de tomada de controle administrativo.
cve-2026-72898.py — detector com verificação de versão e falha segura (VULN / SAFE / UNTESTED)TECHNICAL.md — análise completa de causa raiz a partir do diff do patch v0.63.2 → v0.63.15lab/docker-compose.yml — uma instância vulnerável + corrigida para reproduçãoO detector reporta VULN contra uma instância afetada e SAFE contra uma corrigida —
e UNTESTED (nunca um falso SAFE) quando uma solicitação é limitada, armazenada em cache
ou nunca chega à aplicação. Uma gravação também é fornecida como um cast asciinema.
| Branch | Vulnerável | Corrigida |
|---|---|---|
| 0.58 / 1.58 | < 0.58.24 | 0.58.24 |
| 0.59 / 1.59 | < 0.59.21 | 0.59.21 |
| 0.60 / 1.60 | < 0.60.17 | 0.60.17 |
| 0.61 / 1.61 | < 0.61.11 | 0.61.11 |
| 0.62 / 1.62 | < 0.62.9 | 0.62.9 |
| 0.63 / 1.63 | < 0.63.5 | 0.63.5 |
Aviso: GHSA-vwf4-m7j8-wcjf. Se você executa uma versão afetada, atualize agora — isto está sendo explorado ativamente.
POST /api/session/reset_password HTTP/1.1
Content-Type: application/json
{"token":"1_00000000-0000-0000-0000-000000000000",
"password":"Placeholder1!",
"user-id":{"raw":"<ARBITRARY SQL>"}}
produz, no banco de dados da aplicação:
SELECT id, ... FROM core_user WHERE id = (<ARBITRARY SQL>)
O bug é cego — o fluxo de redefinição engole erros SQL e retorna um
400 {"errors":{"password":"Invalid reset token"}} idêntico em todos os casos — então o
detector usa um oráculo de tempo. Consulte TECHNICAL.md para o fluxo de dados completo e
o diff do patch.
python3 cve-2026-72898.py https://metabase.example.com # banco de dados da aplicação H2 (padrão)
python3 cve-2026-72898.py https://metabase.example.com --engine postgres # oráculo pg_sleep
python3 cve-2026-72898.py https://metabase.example.com --json --trials 5
Código de saída 0 = VULN, 1 = SAFE ou UNTESTED.
Os vereditos são VULN / SAFE / UNTESTED — nunca "provavelmente seguro". A ferramenta:
--force substitui deliberadamente;X-Forwarded-For a cada solicitação, porque o endpoint de redefinição limita a
10 tentativas e a resposta de limitação é um 400 rápido que de outra forma imitaria um negativo;sum(x) sobre SYSTEM_RANGE) que o mecanismo não pode otimizar, e
exige que o atraso ultrapasse tanto um piso absoluto quanto a própria dispersão de tempo do controle;UNTESTED, não SAFE.cd lab
docker compose up -d # 3300 = vulnerável v0.63.2, 3301 = corrigida v0.63.15
# aguarde ~90s para a inicialização do banco de dados na primeira execução
python3 ../cve-2026-72898.py http://127.0.0.1:3300 # -> VULN
python3 ../cve-2026-72898.py http://127.0.0.1:3301 --force # -> SAFE
Verificado: v0.63.2 mostra um delta de 8+ segundos que escala linearmente com a contagem de linhas do payload (5M→0.85s, 10M→1.96s, 20M→4.61s, 40M→7.97s); v0.63.15 não mostra diferencial.
Teste apenas sistemas que você possui ou para os quais está explicitamente autorizado a avaliar. O acesso não autorizado a sistemas de computador é ilegal na maioria das jurisdições. Esta ferramenta detecta a vulnerabilidade com uma sonda de tempo benigna e intencionalmente não lê, modifica ou exfiltra dados.
MIT — consulte LICENSE.