CVEs 돌아가기
cveHigh대기Databasepublic2026년 9월 7일

MariaDB .frm 파싱 OOB Read를 통한 vtable Hijacking RCE

MariaDB의 .frm 메타데이터 파싱 과정에서 key_part->fieldnr의 상한 검증 누락으로 share->field[] 배열을 범위 밖으로 읽게 되고, 조작된 C++ 객체와 가짜 vtable을 가리키게 만들어 mariadbd 프로세스 권한의 원격 코드 실행에 이르는 취약점 (MDEV-40571).

개요

MariaDB .frm 파일(테이블 메타데이터) 파서가 key_part->fieldnr 값의 상한 검증 없이 share->field[] 배열의 인덱스로 그대로 사용한다. 이 값이 Field* 포인터로 해석되면서 공격자가 조작한 C++ 객체와 가짜 vtable을 가리키게 만들 수 있고, 이어지는 가상 함수 호출이 공격자가 지정한 주소로 분기해 mariadbd 프로세스 권한의 원격 코드 실행으로 이어진다.

공격에 필요한 것은 FILE 권한을 가진 인증된 SQL 세션뿐이며, OS 셸이나 직접적인 파일시스템 접근은 필요하지 않다. LOAD DATA INFILE, DUMPFILE, FLUSH TABLES, SHOW CREATE TABLE만으로 완결되는 원격 공격 체인이 MariaDB 10.4.18에서 재현됐고, MariaDB 11.8.8/12.3.2/13.1.0 Preview에서도 로컬 체인이 검증됐다.

팀원 배대식(pinebudweiser)이 발견해 HackerOne을 통해 제보했으며, 분석과 재현 과정은 Ph4nt0m 팀이 공동으로 수행했다.

근본 원인

.frm 파일의 키 정의 블록을 파싱하는 코드가 fieldnr.frm 바이트에서 검증 없이 그대로 읽어, 이후 share->field[fieldnr-1]로 인덱싱할 때 share->fields(실제 필드 개수)를 넘는 값도 그대로 통과시킨다. share->field[] 뒤에는 multi_alloc_root()가 같은 청크에 연속 배치한 comment_pos(컬럼 COMMENT 절 내용, 공격자가 SQL로 완전히 제어 가능한 버퍼)가 이어지는데, fieldnr을 정확히 조작하면 이 영역을 가짜 Field 객체로 치환할 수 있다.

패치(MariaDB 커밋 3b1c2e58a)는 DBUG_ASSERT(릴리스 빌드에서 사라지는 디버그 전용 검증)로만 존재하던 다수의 검증을, 항상 동작하는 if (fieldnr <= 0 || fieldnr > share->fields) goto err; 런타임 체크로 교체했다.

영향 범위

  • 영향받는 버전: 10.6.1-10.6.27, 10.11.1-10.11.18, 11.4.1-11.4.12, 11.8.1-11.8.8, 12.3.1-12.3.2, 13.0.1
  • 수정된 버전: 10.6.28, 10.11.19, 11.4.13, 11.8.9, 12.3.3, 13.0.2

상세 분석

메모리 배치, exploitation 체인(leak-calibration-arm-trigger), 실제 디스어셈블리, 패치 diff, PoC 코드/영상 등 전체 기술 분석은 아래 블로그 글에 정리되어 있다.

참고 링크

참고

CVE 번호는 이 글 작성 시점 기준 미할당 상태다. MariaDB 측이 요청을 넣었으나 발급 대기 중이며, 발급되는 대로 이 페이지의 식별자를 갱신할 예정이다.