
Rilevatore + analisi della causa principale per CVE-2026-72898 (SQLi non autenticato in Metabase tramite reset_password)
SQL injection non autenticata in Metabase tramite POST /api/session/reset_password.
CVSS 10.0, nel catalogo CISA KEV, sfruttata in natura.
Un campo non dichiarato nel corpo della richiesta di reset della password raggiunge la
ricerca dell'utente nel database dell'applicazione come struttura HoneySQL anziché come
identificatore validato. Una chiave di un oggetto JSON diventa una keyword Clojure, quindi
{"raw": "<SQL>"} viene compilata nella clausola di HoneySQL e viene emessa
— SQL arbitrario contro il database
dell'applicazione Metabase, senza alcuna autenticazione.
:rawQuesto repository contiene un rilevatore (uno strumento di verdetto cieco basato sul tempo) e un'analisi della causa principale derivata dalla patch del fornitore. È destinato ai difensori che verificano la propria esposizione e ai ricercatori di sicurezza che studiano il bug. Non esfiltra dati né fornisce un exploit weaponizzato per l'acquisizione di privilegi di amministratore.
cve-2026-72898.py — rilevatore con controllo versione e fail-closed (VULN / SAFE / UNTESTED)TECHNICAL.md — analisi completa della causa principale dal diff della patch v0.63.2 → v0.63.15lab/docker-compose.yml — un'istanza vulnerabile e una patchata per la riproduzioneIl rilevatore riporta VULN contro un'istanza vulnerabile e SAFE contro una patchata —
e UNTESTED (mai un falso SAFE) quando una richiesta viene limitata, memorizzata nella cache o non raggiunge
mai l'app. È disponibile anche una registrazione come cast asciinema.
| Branch | Vulnerabile | Corretta |
|---|---|---|
| 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 |
Avviso: GHSA-vwf4-m7j8-wcjf. Se esegui una versione vulnerabile, aggiorna subito — questa vulnerabilità viene sfruttata in natura.
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>"}}
produce, nel database dell'applicazione:
SELECT id, ... FROM core_user WHERE id = (<ARBITRARY SQL>)
Il bug è cieco — il flusso di reset inghiotte gli errori SQL e restituisce un
400 {"errors":{"password":"Invalid reset token"}} identico in ogni caso — quindi il rilevatore usa un
oracolo temporale. Vedi TECHNICAL.md per il flusso dati completo e il diff della patch.
python3 cve-2026-72898.py https://metabase.example.com # H2 app db (default)
python3 cve-2026-72898.py https://metabase.example.com --engine postgres # pg_sleep oracle
python3 cve-2026-72898.py https://metabase.example.com --json --trials 5
Codice di uscita 0 = VULN, 1 = SAFE o UNTESTED.
I verdetti sono VULN / SAFE / UNTESTED — mai "probabilmente a posto". Lo strumento:
--force lo sovrascrive deliberatamente;X-Forwarded-For per ogni richiesta, perché l'endpoint di reset limita a 10 tentativi
e la risposta di limitazione è un 400 veloce che altrimenti imiterebbe un negativo;sum(x) su SYSTEM_RANGE) che il motore non può ottimizzare via, e
richiede che il ritardo superi sia una soglia assoluta sia la dispersione temporale del controllo stesso;UNTESTED, non SAFE.cd lab
docker compose up -d # 3300 = vulnerabile v0.63.2, 3301 = patchata v0.63.15
# attendi ~90s per l'inizializzazione iniziale del DB
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
Verificato: v0.63.2 mostra un delta di 8+ secondi che scala linearmente con il numero di righe del payload (5M→0.85s, 10M→1.96s, 20M→4.61s, 40M→7.97s); v0.63.15 non mostra alcuna differenza.
Testa solo sistemi di tua proprietà o per i quali sei esplicitamente autorizzato a effettuare valutazioni. L'accesso non autorizzato a sistemi informatici è illegale nella maggior parte delle giurisdizioni. Questo strumento rileva la vulnerabilità con una sonda temporale benigna e intenzionalmente non legge, modifica o esfiltra dati.
MIT — vedi LICENSE.