
Detektor + Root-Cause-Analyse für CVE-2026-72898 (Metabase unauthenticated SQLi via reset_password)
Unauthentifizierte SQL-Injection in Metabase über POST /api/session/reset_password.
CVSS 10.0, im CISA-KEV-Katalog, wird in freier Wildbahn ausgenutzt.
Ein nicht deklariertes Feld im Passwort-Reset-Request-Body erreicht die Anwendungsdatenbank-
Benutzersuche als HoneySQL-Struktur statt als validierte Kennung. Ein JSON-Objekt-
Schlüssel wird zu einem Clojure-Keyword, sodass {"raw": "<SQL>"} zu HoneySQLs -Klausel
kompiliert und ausgegeben wird — beliebiges SQL gegen die
Metabase-Anwendungsdatenbank, ohne Authentifizierung.
:rawDieses Repository enthält einen Detektor (ein blindes, zeitbasiertes Bewertungswerkzeug) und eine Ursachenanalyse, die aus dem Hersteller-Patch abgeleitet wurde. Es richtet sich an Verteidiger, die ihre eigene Gefährdung überprüfen, und an Sicherheitsforscher, die den Fehler untersuchen. Es exfiltriert keine Daten und bietet keinen bewaffneten Admin-Übernahme-Exploit.
cve-2026-72898.py — versionsgeprüfter, fail-closed Detektor (VULN / SAFE / UNTESTED)TECHNICAL.md — vollständige Ursachenanalyse aus dem v0.63.2 → v0.63.15-Patch-Difflab/docker-compose.yml — eine verwundbare + gepatchte Instanz zur ReproduktionDer Detektor meldet VULN gegen eine betroffene Instanz und SAFE gegen eine gepatchte —
und UNTESTED (niemals ein falsches SAFE), wenn eine Anfrage gedrosselt, zwischengespeichert oder nie
die App erreicht. Eine Aufzeichnung ist auch als asciinema-Cast verfügbar.
| Branch | Verwundbar | Behoben |
|---|---|---|
| 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 |
Advisory: GHSA-vwf4-m7j8-wcjf. Wenn Sie eine betroffene Version ausführen, aktualisieren Sie jetzt — dies wird in freier Wildbahn ausgenutzt.
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>"}}
ergibt in der Anwendungsdatenbank:
SELECT id, ... FROM core_user WHERE id = (<ARBITRARY SQL>)
Der Fehler ist blind — der Reset-Ablauf verschluckt SQL-Fehler und gibt in jedem Fall eine identische
400 {"errors":{"password":"Invalid reset token"}} zurück — daher verwendet der Detektor ein
Timing-Orakel. Siehe TECHNICAL.md für den vollständigen Datenfluss und den Patch-Diff.
python3 cve-2026-72898.py https://metabase.example.com # H2-App-DB (Standard)
python3 cve-2026-72898.py https://metabase.example.com --engine postgres # pg_sleep-Orakel
python3 cve-2026-72898.py https://metabase.example.com --json --trials 5
Exit-Code 0 = VULN, 1 = SAFE oder UNTESTED.
Bewertungen sind VULN / SAFE / UNTESTED — niemals „wahrscheinlich in Ordnung". Das Werkzeug:
--force überschreibt dies absichtlich;X-Forwarded-For pro Anfrage, da der Reset-Endpunkt bei 10 Versuchen drosselt
und die Drosselungsantwort ein schnelles 400 ist, das sonst ein Negativ vortäuscht;sum(x) über SYSTEM_RANGE), das die Engine nicht wegoptimieren kann, und
verlangt, dass die Verzögerung sowohl eine absolute Untergrenze als auch die eigene Timing-Streuung der Kontrolle übersteigt;UNTESTED, nicht als SAFE.cd lab
docker compose up -d # 3300 = verwundbar v0.63.2, 3301 = gepatcht v0.63.15
# ~90s auf die Erstinitialisierung der DB warten
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
Verifiziert: v0.63.2 zeigt eine 8+ Sekunden-Differenz, die linear mit der Payload-Zeilenanzahl skaliert (5M→0.85s, 10M→1.96s, 20M→4.61s, 40M→7.97s); v0.63.15 zeigt keine Differenz.
Testen Sie nur Systeme, die Sie besitzen oder für die Sie ausdrücklich autorisiert sind. Unbefugter Zugriff auf Computersysteme ist in den meisten Rechtsordnungen illegal. Dieses Werkzeug erkennt die Schwachstelle mit einer harmlosen Timing-Sonde und liest, modifiziert oder exfiltriert absichtlich keine Daten.
MIT — siehe LICENSE.