NOW Briefing
Metabase 비밀번호 재설정 API 미인증 SQL 인젝션 취약점 (CVE-2026-72898)
■ 개요
Metabase는 데이터베이스에 연결해 질의, 시각화, 대시보드 기능을 제공하는 오픈소스 비즈니스 인텔리전스(BI) 도구입니다. Metabase 애플리케이션 데이터베이스에는 연결된 데이터 소스의 접속 자격증명이 저장됩니다. 이번 취약점은 이 데이터베이스에서 인증 없이 임의 SQL을 실행할 수 있게 하므로, Metabase 인스턴스 하나의 침해가 연결된 데이터 웨어하우스와 업무 데이터 노출로 이어질 수 있습니다.
영향 범위는 v58 계열부터 v63 계열까지이며, 오픈소스 버전(0.x)과 엔터프라이즈 버전(1.x)이 모두 해당됩니다. 브랜치별 취약 버전은 요약 표와 같고, v58 미만 버전은 영향을 받지 않습니다. 비밀번호 재설정 경로를 이용하는 CVE-2026-72898은 해당 API가 외부에 노출돼 있으면 인증이나 사용자 상호작용 없이 악용될 수 있습니다. CVE-2026-72899는 공개 링크 공유가 활성화돼 있고, 필드 필터 파라미터가 포함된 카드나 대시보드가 공개된 환경에 영향을 줍니다.
Metabase는 2026년 8월 6일 자사 클라우드 환경에서 미공개 취약점을 이용한 공격이 발생했다고 공지했습니다. 이후 8월 7일부터 10일 사이 Framework, Tally, n8n, Kilo Code(Anaconda), ChecklyHQ가 잇따라 침해 사실을 공개했습니다. CISA는 8월 11일 CVE-2026-72898을 알려진 악용 취약점 목록(KEV)에 추가했으며, 미국 연방기관의 조치 기한은 8월 14일입니다. Wiz에 따르면 8월 10일에는 제3자가 공개한 PoC도 관측됐습니다. 자체 호스팅 환경은 운영 조직이 직접 패치하고 침해 여부를 점검해야 합니다.
■ 요약
| 항목 | 내용 |
|---|---|
| CVE ID | CVE-2026-72898 - 비밀번호 재설정 API CVE-2026-72899 - 공개 링크 필드 필터 |
| CVSS | CVE-2026-72898: 10.0 CVE-2026-72899: 9.6(Metabase), 10.0(CISA) |
| 취약점 유형 | CWE-89, 인증 없는 SQL 인젝션 |
| 영향 | • 인증 없이 애플리케이션 DB에서 임의 SQL 실행 • 관리자 계정 탈취 및 설정 변경 • 저장된 연결 DB 자격증명 탈취 • 연결된 데이터 소스 내용 질의·반출 |
| 취약 버전 | v58.0~v58.23, v59.0~v59.20, v60.0~v60.16, v61.0~v61.10, v62.0~v62.8, v63.0~v63.4 v58 미만은 영향 없음 |
| 패치 버전 | v58.24, v59.21, v60.17, v61.11, v62.9, v63.5 이상 |
■ 기술 분석
Metabase는 Clojure로 작성됐으며, 데이터 구조(맵)를 SQL로 변환하는 쿼리 빌더 HoneySQL을 사용합니다. HoneySQL은 {:raw "..."} 형태의 맵에 담긴 문자열을 바인딩 값이 아닌 SQL 조각으로 처리합니다.
비밀번호 재설정 요청에서 스키마에 정의되지 않은 필드는 걸러지지 않은 채 Clojure의 맵 병합 과정을 통과했습니다. 이 과정에서 사용자 식별자 필드인 user-id도 정수인지 확인하지 않고 사용자 조회 조건으로 전달됐습니다. 따라서 정수 대신 {:raw "..."} 맵이 들어오면 그 안의 문자열이 SQL 조각으로 컴파일됩니다. HTTP 요청은 400 응답으로 끝나더라도 주입된 SQL은 그 전에 실행될 수 있습니다.
Wiz가 공개한 패치 발췌를 보면, Metabase는 사용자 조회 직전에 값이 양의 정수인지 확인하는 검사를 추가했습니다.
(when-let [user-id (:user-id $)]
- (t2/select-one [:model/User ...] :id user-id))
+ (if (pos-int? user-id)
+ (t2/select-one [:model/User ...] :id user-id)
+ (log/warnf "Provider %s returned a non-positive-int :user-id (type %s); refusing to resolve a user."
+ provider (type user-id))))
관련 취약점: CVE-2026-72899
CVE-2026-72899도 외부 입력이 HoneySQL의 SQL 조각으로 해석되는 문제입니다. 공개 링크로 공유된 카드나 대시보드의 질의 API는 파라미터 값을 임의의 JSON 값(:any)으로 받았고, 맵 형태의 값이 전달되면 HoneySQL이 이를 SQL 조각으로 처리했습니다. 공개 링크 공유가 활성화돼 있고, 필드 필터를 사용하는 네이티브 SQL 질문이 공개된 환경에서 인증 없이 악용될 수 있습니다.
주입된 SQL은 공유된 카드가 사용하는 데이터베이스 연결 권한으로 실행됩니다. 따라서 실제 노출 범위는 카드에 연결된 데이터 소스와 서비스 계정 권한에 따라 달라집니다. 애플리케이션 데이터베이스를 데이터 소스로 등록한 환경에서는 Metabase의 사용자·연결 정보도 영향을 받을 수 있습니다.
■ PoC
아래 코드는 공개 PoC의 일부를 인용했으며, 악용 가능한 후속 SQL 구성과 데이터 조회 로직은 생략했습니다. 전체 코드는 참고 자료의 원본 PoC 링크에서 확인할 수 있습니다.
http:
- raw:
- |
POST /api/session/reset_password HTTP/1.1
Host: {{Hostname}}
Content-Type: application/json
{"token":{"select":1},"password":"TestPassword1!"}
matchers:
- type: dsl
dsl:
- 'status_code == 400'
- 'contains_all(body, "should be a string", "{:select 1}")'
condition: and
internal: true
# ... 악용 가능한 후속 SQL 구성·조회 단계 생략 ...
⚠️ WARN
운영 인스턴스에서 실행하지 말고 격리된 복제본에서만 검증합니다.
■ 탐지 및 점검
• 웹 서버·리버스 프록시 접근 로그에서 POST /api/session/reset_password가 400으로 응답한 직후 동일 출처가 GET /api/user/current를 200으로 성공시킨 시퀀스를 찾습니다. 벤더가 보안 공지에서 침해 지표로 제시한 공격 패턴입니다.
• 요청 본문을 기록하는 환경이라면 user-id 값이 정수가 아닌 요청, 특히 raw 키를 포함한 JSON 객체가 전달된 요청을 침해 시도로 분류합니다.
• 애플리케이션 데이터베이스의 core_user 테이블에서 승인되지 않은 계정과 관리자 권한 변경 이력을 확인합니다. 세션 테이블 core_session과 API 키 목록에서는 발급 기록이 없는 항목을 찾습니다. 단일 항목만으로 침해를 단정하지 말고 접근 로그 시퀀스, 생성 시각, 발급 출처 IP를 함께 대조합니다.
• 공개 링크 공유 목록에서 필드 필터가 포함된 카드·대시보드를 확인하고, 해당 링크의 질의 이력에 정상적인 대시보드 사용으로 설명하기 어려운 요청이 있는지 점검합니다.
• 연결된 데이터 웨어하우스 측 감사 로그에서 Metabase 서비스 계정 명의의 대량 조회·반출과 평소 사용 패턴을 벗어난 테이블 접근을 대조합니다.
📌 NOTE
조사 자료를 먼저 확보한 뒤 조치합니다.
업그레이드나 컨테이너 재생성 과정에서 접근 로그와 애플리케이션 데이터베이스가 초기화되면 침해 여부 판단 근거가 사라집니다.
■ 대응 방안
• 운영 중인 브랜치에 맞춰 v58.24, v59.21, v60.17, v61.11, v62.9, v63.5 이상으로 즉시 업그레이드합니다.
• 즉시 업그레이드하기 어렵다면 프록시나 WAF에서 /api/session/reset_password 엔드포인트를 임시로 차단합니다. CVE-2026-72899에 대비해 공개 링크 공유를 비활성화하거나 필드 필터가 포함된 공개 링크도 회수합니다.
• 업그레이드 후 core_session 테이블의 모든 행을 삭제해 기존 세션을 폐기합니다. 승인되지 않은 API 키를 삭제하고 관리자 계정과 권한의 변경 여부도 점검합니다.
• 세션과 계정을 정리했더라도 애플리케이션 DB에 보관된 자격증명은 그대로 남으므로, Metabase에 등록된 모든 데이터 소스의 접속 자격증명을 교체합니다. 노출 여부가 확인되지 않아도, 재설정 엔드포인트가 외부에 열려 있던 인스턴스는 자격증명이 유출된 것으로 간주하고 처리해야 합니다.
• 자격증명 교체 후에는 해당 데이터베이스 측에서 구 자격증명의 잔여 사용 시도와 신규 접속 출처를 일정 기간 추적해 재사용 여부를 확인합니다.
💡 TIP
Metabase 인스턴스를 인터넷에 직접 노출할 필요가 없다면 이번 대응을 계기로 접근 경로를 사내망 또는 VPN·인증 프록시 뒤로 옮깁니다.
이번 두 취약점 모두 인증 없이 성립하므로, 노출면 축소가 동일 유형의 후속 취약점을 막는 구조적 완화 조치가 됩니다.
[참고 자료]
• Metabase 보안 권고 - CVE-2026-72898
• Metabase 보안 권고 - CVE-2026-72899
• Wiz - Inside the Metabase SQLi: Exploited in the Wild



