
Детектор + анализ первопричины для CVE-2026-72898 (неаутентифицированная SQLi в Metabase через reset_password)
Неаутентифицированная SQL-инъекция в Metabase через POST /api/session/reset_password.
CVSS 10.0, находится в каталоге CISA KEV, эксплуатируется в реальных атаках.
Необъявленное поле в теле запроса на сброс пароля попадает в поиск пользователя в
базе данных приложения как структура HoneySQL, а не как проверенный идентификатор.
Ключ JSON-объекта становится ключевым словом Clojure, поэтому {"raw": "<SQL>"}
компилируется в предложение HoneySQL и передаётся —
произвольный SQL против базы данных приложения Metabase, без какой-либо аутентификации.
:rawЭтот репозиторий содержит детектор (слепой инструмент проверки на основе временной задержки) и анализ первопричины, полученный из патча вендора. Он предназначен для защитников, проверяющих собственную подверженность уязвимости, и для исследователей безопасности, изучающих эту ошибку. Он не извлекает данные и не предоставляет готовый эксплойт для захвата административного доступа.
cve-2026-72898.py — детектор с проверкой версии и отказом по умолчанию (VULN / SAFE / UNTESTED)TECHNICAL.md — полный анализ первопричины из диффа патча v0.63.2 → v0.63.15lab/docker-compose.yml — уязвимый и пропатченный экземпляры для воспроизведенияДетектор сообщает VULN для уязвимого экземпляра и SAFE для пропатченного —
и UNTESTED (никогда не ложный SAFE), когда запрос ограничен по частоте, кэширован или не достигает
приложения. Также предоставлена запись в виде asciinema cast.
| Ветка | Уязвимая | Исправленная |
|---|---|---|
| 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 |
Консультативное заключение: GHSA-vwf4-m7j8-wcjf. Если вы используете затронутую версию, обновитесь немедленно — эта уязвимость эксплуатируется в реальных атаках.
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>"}}
даёт в базе данных приложения:
SELECT id, ... FROM core_user WHERE id = (<ARBITRARY SQL>)
Ошибка является слепой — процесс сброса проглатывает ошибки SQL и возвращает одинаковый
400 {"errors":{"password":"Invalid reset token"}} во всех случаях — поэтому детектор использует
временной оракул. См. TECHNICAL.md для полного потока данных и диффа патча.
python3 cve-2026-72898.py https://metabase.example.com # H2 app db (по умолчанию)
python3 cve-2026-72898.py https://metabase.example.com --engine postgres # pg_sleep оракул
python3 cve-2026-72898.py https://metabase.example.com --json --trials 5
Код выхода 0 = VULN, 1 = SAFE или UNTESTED.
Вердикты: VULN / SAFE / UNTESTED — никогда «вероятно, безопасно». Инструмент:
--force переопределяет это намеренно;X-Forwarded-For для каждого запроса, поскольку конечная точка сброса ограничивает частоту до 10 попыток,
а ответ на ограничение — это быстрый 400, который иначе имитирует отрицательный результат;sum(x) по SYSTEM_RANGE), который движок не может оптимизировать, и
требует, чтобы задержка превышала как абсолютный минимум, так и собственный разброс времени контроля;UNTESTED, а не SAFE.cd lab
docker compose up -d # 3300 = уязвимая v0.63.2, 3301 = пропатченная v0.63.15
# подождите ~90 секунд для инициализации БД при первом запуске
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
Проверено: v0.63.2 показывает дельту 8+ секунд, которая линейно масштабируется с количеством строк полезной нагрузки (5M→0.85s, 10M→1.96s, 20M→4.61s, 40M→7.97s); v0.63.15 не показывает разницы.
Тестируйте только системы, которыми вы владеете или на оценку которых у вас есть явное разрешение. Несанкционированный доступ к компьютерным системам незаконен в большинстве юрисдикций. Этот инструмент обнаруживает уязвимость с помощью безвредного временного зонда и намеренно не читает, не изменяет и не извлекает данные.
MIT — см. LICENSE.