
Détecteur + analyse de cause racine pour CVE-2026-72898 (SQLi non authentifié via reset_password dans Metabase)
Injection SQL non authentifiée dans Metabase via POST /api/session/reset_password.
CVSS 10.0, dans le catalogue CISA KEV, exploitée activement dans la nature.
Un champ non déclaré dans le corps de la requête de réinitialisation de mot de passe atteint
la recherche d'utilisateur de la base de données applicative en tant que structure HoneySQL
plutôt qu'un identifiant validé. Une clé d'objet JSON devient un mot-clé Clojure, donc
{"raw": "<SQL>"} se compile en clause de HoneySQL et est émise — du SQL arbitraire contre la base de données applicative de Metabase, sans
aucune authentification.
:rawCe dépôt contient un détecteur (un outil de verdict aveugle basé sur le temps) et une analyse de cause racine dérivée du correctif du fournisseur. Il est destiné aux défenseurs vérifiant leur propre exposition et aux chercheurs en sécurité étudiant le bug. Il n'exfiltre pas de données et ne fournit pas d'exploit d'usurpation d'administrateur armé.
cve-2026-72898.py — détecteur verrouillé par version, à échec sûr (VULN / SAFE / UNTESTED)TECHNICAL.md — analyse complète de cause racine à partir du diff de correctif v0.63.2 → v0.63.15lab/docker-compose.yml — une instance vulnérable + corrigée pour la reproductionLe détecteur rapporte VULN contre une instance affectée et SAFE contre une instance corrigée —
et UNTESTED (jamais un faux SAFE) lorsqu'une requête est limitée, mise en cache, ou n'atteint
jamais l'application. Un enregistrement est également fourni sous forme de cast asciinema.
| Branche | Vulnérable | Corrigée |
|---|---|---|
| 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 |
Avis de sécurité : GHSA-vwf4-m7j8-wcjf. Si vous exécutez une version affectée, mettez à jour immédiatement — cette vulnérabilité est exploitée activement dans la nature.
POST /api/session/reset_password HTTP/1.1
Content-Type: application/json
{"token":"1_00000000-0000-0000-0000-000000000000",
"password":"Placeholder1!",
"user-id":{"raw":"<SQL ARBITRAIRE>"}}
produit, dans la base de données applicative :
SELECT id, ... FROM core_user WHERE id = (<SQL ARBITRAIRE>)
Le bug est aveugle — le flux de réinitialisation avale les erreurs SQL et renvoie une
400 {"errors":{"password":"Invalid reset token"}} identique dans tous les cas — donc le
détecteur utilise un oracle temporel. Voir TECHNICAL.md pour le flux de données complet et le diff du correctif.
python3 cve-2026-72898.py https://metabase.example.com # base de données applicative H2 (défaut)
python3 cve-2026-72898.py https://metabase.example.com --engine postgres # oracle pg_sleep
python3 cve-2026-72898.py https://metabase.example.com --json --trials 5
Code de sortie 0 = VULN, 1 = SAFE ou UNTESTED.
Les verdicts sont VULN / SAFE / UNTESTED — jamais « probablement sûr ». L'outil :
--force le remplace délibérément ;X-Forwarded-For à chaque requête, car le point de terminaison de réinitialisation
limite à 10 tentatives et la réponse de limitation est un 400 rapide qui imiterait sinon un négatif ;sum(x) sur SYSTEM_RANGE) que le moteur ne peut pas optimiser, et
exige que le délai dépasse à la fois un plancher absolu et la propre dispersion temporelle du témoin ;UNTESTED, pas SAFE.cd lab
docker compose up -d # 3300 = v0.63.2 vulnérable, 3301 = v0.63.15 corrigée
# attendre ~90s pour l'initialisation de la base de données au premier lancement
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
Vérifié : v0.63.2 montre un delta de 8+ secondes qui évolue linéairement avec le nombre de lignes de la charge utile (5M→0,85s, 10M→1,96s, 20M→4,61s, 40M→7,97s) ; v0.63.15 ne montre aucune différence.
Testez uniquement les systèmes que vous possédez ou pour lesquels vous êtes explicitement autorisé à évaluer. L'accès non autorisé à des systèmes informatiques est illégal dans la plupart des juridictions. Cet outil détecte la vulnérabilité avec une sonde temporelle bénigne et ne lit, ne modifie, ni n'exfiltre intentionnellement aucune donnée.
MIT — voir LICENSE.