
CVE-2026-72898 (reset_password를 통한 Metabase 인증 우회 SQLi) 탐지기 + 근본 원인 분석
POST /api/session/reset_password를 통한 Metabase의 인증 우회 SQL 인젝션.
CVSS 10.0, CISA KEV 카탈로그에 등재, 실제 공격에 악용됨.
비밀번호 재설정 요청 본문의 선언되지 않은 필드가 검증된 식별자가 아닌 HoneySQL 구조로
애플리케이션 데이터베이스 사용자 조회에 도달합니다. JSON 객체 키가 Clojure 키워드가 되어
{"raw": "<SQL>"}이 HoneySQL의 :raw 절로 컴파일되고 출력됩니다 —
Metabase 애플리케이션 데이터베이스에 대한 임의 SQL이 인증 없이 실행됩니다.
이 저장소는 탐지기(블라인드, 시간 기반 판정 도구)와 벤더 패치에서 파생된 근본 원인 분석을 포함합니다. 방어자가 자신의 노출을 확인하고 보안 연구자가 버그를 연구하기 위한 용도입니다. 데이터를 유출하거나 무기화된 관리자 탈취 익스플로잇을 제공하지 않습니다.
cve-2026-72898.py — 버전 게이트, 실패 시 안전 종료 탐지기 (VULN / SAFE / UNTESTED)TECHNICAL.md — v0.63.2 → v0.63.15 패치 diff의 전체 근본 원인 분석lab/docker-compose.yml — 취약 + 패치된 인스턴스 재현용탐지기는 영향받는 인스턴스에 대해 VULN, 패치된 인스턴스에 대해 SAFE를 보고합니다 —
그리고 요청이 스로틀링, 캐시되거나 앱에 도달하지 못하면 UNTESTED(절대 거짓 SAFE 아님)를
보고합니다. 녹화본도 asciinema 캐스트로 제공됩니다.
| 브랜치 | 취약 | 수정 |
|---|---|---|
| 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"}}을 반환합니다 — 따라서 탐지기는
타이밍 오라클을 사용합니다. 전체 데이터 흐름과 패치 diff는 TECHNICAL.md를 참조하세요.
python3 cve-2026-72898.py https://metabase.example.com # H2 앱 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를 회전합니다;SYSTEM_RANGE에 대한 sum(x))을 사용하고,
지연이 절대 하한과 대조군의 자체 타이밍 분산을 모두 초과해야 합니다;SAFE가 아닌 UNTESTED로 분류합니다.cd lab
docker compose up -d # 3300 = 취약 v0.63.2, 3301 = 패치 v0.63.15
# 첫 실행 DB 초기화에 ~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 참조.