Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
CVE-2026-39113 — 조작된 SZ 값이 잘린 할당과 zlib 범위 밖 쓰기를 유발하는 SQLite SQLAR 힙 버퍼 오버플로우에 대한 보안 권고 및 AddressSanitizer 재현기 | Kitploit
도구/GitHubGitHub/20000419/cve-2026-39113
Vulnerability AnalysisCode AnalysisExploitationDatabase SecurityBinary Exploitation
GitHub20000419/cve-2026-39113

CVE-2026-39113

조작된 SZ 값이 잘린 할당과 zlib 범위 밖 쓰기를 유발하는 SQLite SQLAR 힙 버퍼 오버플로우에 대한 보안 권고 및 AddressSanitizer 재현기

저장소 보기
1일 전아직 검토되지 않음

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

CVE-2026-39113: SQLite 옵션 SQLAR 확장의 힙 버퍼 오버플로

핵심 요약

CVE-2026-39113은 SQLite의 옵션 SQLAR 확장에서 발생하는 힙 버퍼 오버플로입니다. 확장을 로드한 애플리케이션에서 공격자가 제어된 압축 blob과 크기를 사용해 sqlar_uncompress()를 호출할 수 있다면, LP64 시스템에서 zlib가 힙 할당 경계를 넘어 쓰기를 수행하게 할 수 있습니다. 이는 호스트 프로세스 내부의 메모리 안전 경계 실패이며, SQLite 데이터베이스 파일 파싱 문제, 인증 우회, 또는 모든 기본 SQLite 배포에서 도달 가능한 결함이 아닙니다.

취약한 동작은 Git 커밋 169f68e(Fossil 체크인 8bdc0d485e3ad0c7...)에 의해 2026-03-11에 도입되었으며, Git 커밋 34e139d(Fossil 체크인 6194f3b5314ef98b...)에 의해 2026-04-01에 수정되었습니다. 영향을 받는 범위는 169f68e부터 34e139d의 부모까지의 소스 스냅샷 및 커스텀 빌드입니다. 공식 SQLite 릴리스 중 취약한 것으로 확인된 것은 없습니다. SQLite 3.52.0은 취약 동작 도입 이전이며, SQLite 3.53.0에는 도입 변경과 수정이 모두 포함되어 있습니다. 따라서 SQLite 3.53.0은 영향을 받는 릴리스가 아니라 수정된 코드를 포함한 최초의 공식 릴리스입니다.

저는 정확한 취약 리비전, 도입 및 수정 변경, 그리고 3.52.0과 3.53.0 릴리스 스냅샷을 검토했습니다. 또한 일회용 WSL2 Ubuntu 24.04 환경에서의 승인된 실행 결과로 보존된 출력을 검사했습니다. AddressSanitizer는 힙 버퍼 오버플로와 이어지는 프로세스 종료를 관찰하여 네이티브 힙 손상 및 서비스 거부를 확인했습니다. 코드 실행은 입증되지 않았습니다.

배경

SQLAR은 SQLite 아카이브 형식입니다. ext/misc/sqlar.c의 옵션 확장은 sqlar_compress()와 sqlar_uncompress()를 SQL 함수로 등록합니다. SQLite를 사용하는 모든 애플리케이션에 포함되는 것은 아니며, 취약 경로에 도달하려면 확장이 존재하고 로드되어 있어야 합니다.

이 보고서에서 Mallory는 다음에 전달되는 blob 및 SZ 인수를 제어합니다:

root@kitploit:~
SELECT sqlar_uncompress(?1, ?2);

테스트 환경은 32비트 int와 64비트 sqlite3_int64 및 zlib uLongf를 사용했습니다. 이 함수는 zlib가 쓸 수 있는 메모리 이상을 할당해야 합니다. 그러나 취약한 소스는 uncompress()에는 전체 값을 유지하면서 64비트 크기를 sqlite3_malloc()의 32비트 매개변수 유형으로 변환합니다.

취약한 소스 스냅샷은 구성 중 Configuring SQLite version 3.53.0을 출력했습니다. 이 개발 버전 문자열은 2026-04-09자 공식 SQLite 3.53.0 릴리스(해당 소스에는 수정이 포함됨)와 혼동되어서는 안 됩니다.

취약점 세부 사항

평가된 리비전에서 ext/misc/sqlar.c의 sqlarUncompressFunc()는 공격자가 제어하는 크기를 64비트 정수로 읽습니다:

root@kitploit:~
sqlite3_int64 sz;

sz = sqlite3_value_int64(argv[1]);

sz가 양수이고 입력 blob 길이와 다르면 동일한 값이 호환되지 않는 두 가지 방식으로 사용됩니다:

root@kitploit:~
uLongf szf = sz;
const Bytef *pData = sqlite3_value_blob(argv[0]);
Bytef *pOut = sqlite3_malloc(sz);

if( pOut==0 ){
  sqlite3_result_error_nomem(context);
}else if( Z_OK!=uncompress(pOut, &szf, pData, nData) ){
  sqlite3_result_error(context, "error in uncompress()", -1);
}

이 리비전에서 SQLite는 sqlite3_malloc(int)를 선언합니다. 테스트된 LP64 빌드에서 PoC 값 4294967328(0x100000020)은 해당 API에 전달될 때 32가 된 반면, szf는 전체 64비트 값을 유지했습니다. 따라서 SQLite는 작은 할당을 수행했지만, zlib에는 출력 버퍼가 4GiB 이상을 담을 수 있다고 전달되었습니다. 4096바이트의 데이터를 나타내는 42바이트 blob의 압축 해제는 이후 할당 경계를 넘어섰습니다.

불일치는 2026-03-11 변경이 할당 API를 변경하지 않은 채 sqlite3_value_int()를 sqlite3_value_int64()로 대체하면서 프로젝트에 들어왔습니다. SQLite 3.52.0의 소스 검토는 이전의 32비트 읽기를 보여주므로, 전체 폭/짧은 할당 불일치는 여기에 존재하지 않았습니다. 2026-04-01 수정은 할당을 sqlite3_malloc64(sz)로 변경했습니다. 공식 3.53.0 태그의 소스 검토는 수정된 호출을 확인합니다.

악용 가능성 분석

입증된 프리미티브는 SQLite를 호스팅하는 프로세스 내 힙 경계를 벗어난 쓰기입니다. 보존된 실행 결과는 AddressSanitizer가 sqlite3_malloc()을 통해 할당된 40바이트 힙 영역 바로 뒤에서 첫 번째 잘못된 1바이트 쓰기를 감지하고 이어서 중단(abort)이 발생함을 보여줍니다. 이는 프로세스 충돌 및 서비스 거부를 직접적으로 뒷받침합니다.

악용에는 다음이 모두 필요합니다:

  • 옵션 SQLAR 확장이 로드되어 있어야 함;
  • Mallory가 제어된 blob 및 SZ 값으로 sqlar_uncompress()를 호출할 수 있어야 함;
  • int는 32비트이고 sqlite3_int64와 zlib uLongf는 64비트여야 함; 그리고
  • 축소된 할당이 성공하여 zlib가 압축 해제를 시작할 수 있어야 함.

PoC는 압축 해제된 바이트를 제어하며, 이는 네이티브 힙 손상의 심각도와 관련이 있습니다. 그러나 이 프리미티브를 코드 실행으로 전환하려면 할당자 레이아웃, 주변 프로세스 상태, 완화 조치, 그리고 적절한 애플리케이션 수준 경로에 의존할 것입니다. 그러한 체인은 테스트되거나 입증되지 않았으므로, 이 보고서는 코드 실행을 주장하지 않습니다.

보존된 실행 결과에는 수정된 리비전에 대한 런타임 음성 대조군이 포함되지 않았습니다. 두 가지 소스 수준 대조를 통해 설명의 범위를 좁힐 수 있습니다: SQLite 3.52.0은 32비트 API로 크기를 읽고, 공식 3.53.0 소스는 sqlite3_malloc64()로 할당합니다. 이러한 검사는 확인된 도입 및 수정을 뒷받침하지만, 실행된 수정 대상 테스트로 제시되지는 않습니다. 이 옵션 확장을 로드하는 애플리케이션의 보급률은 알려져 있지 않습니다.

개념 증명

저장소에는 다음이 포함됩니다:

  • poc/verify_sqlar_poc.c — 4096바이트 페이로드를 생성하고, 압축하고, sqlar.so를 로드하며, SZ = 4294967328을 바인딩합니다;
  • poc/reproduce.sh — 고정된 SQLite 및 zlib 리비전을 클론하고, AddressSanitizer로 빌드하고, 확장 및 하네스를 컴파일한 후 트리거를 실행합니다; 그리고
  • evidence/asan-summary.txt — 관찰된 승인 실행의 경로 정규화된 요약입니다.

리프로듀서는 일회용 Linux 또는 WSL 환경에서만 실행하십시오. 의도적으로 메모리 손상과 AddressSanitizer 중단을 유발합니다. 스크립트에는 git, make, C 컴파일러, 표준 빌드 도구 및 네트워크 액세스가 필요합니다:

root@kitploit:~
chmod +x poc/reproduce.sh
./poc/reproduce.sh

리프로듀서는 2026-08-21에 WSL2의 Ubuntu 24.04에서 다시 실행되었으며 동일한 AddressSanitizer 결과를 생성했습니다. 관련 출력은 다음과 같습니다:

root@kitploit:~
env: sizeof(int)=4 sizeof(sqlite3_int64)=8 sizeof(uLongf)=8
payload: plain=4096 compressed=42 evil_sz=4294967328 low32=32

ERROR: AddressSanitizer: heap-buffer-overflow
WRITE of size 1
    #0 inflate_fast zlib/inffast.c:252
    #4 uncompress zlib/uncompr.c:100
    #5 sqlarUncompressFunc sqlite/ext/misc/sqlar.c:97

The write occurred immediately after a 40-byte heap region.
SUMMARY: AddressSanitizer: heap-buffer-overflow in inflate_fast
ABORTING
PoC exit status: 1

이 출력은 호환되지 않는 유형 폭과 조작된 크기, zlib 쓰기, sqlarUncompressFunc()에서의 호출, 그리고 할당 경계 위반을 보여줍니다. 재현 스크립트는 KEEP_BUILD=1이 설정되지 않은 한 종료 시 임시 빌드 디렉터리를 삭제합니다.

수정 조치

업스트림은 커밋 34e139d에서 취약한 할당을 수정했습니다:

root@kitploit:~
-    Bytef *pOut = sqlite3_malloc(sz);
+    Bytef *pOut = sqlite3_malloc64(sz);

이로써 할당 폭이 uLongf szf에 유지되어 zlib에 전달되는 양수 64비트 sz 값과 일치하게 됩니다. 수정된 코드는 공식 SQLite 3.53.0에 포함되어 있습니다. 취약한 구간을 포함하는 소스 스냅샷 또는 커스텀 빌드를 사용하는 경우 34e139d 이상으로 업데이트해야 합니다. SQLAR가 필요하지 않은 애플리케이션은 확장 로드를 피해야 하며, 이를 사용하는 애플리케이션은 신뢰할 수 없는 호출자가 sqlar_uncompress()에 임의의 인수를 제공하지 못하도록 해야 합니다.

집중된 회귀 테스트는 유효한 압축 blob과 INT_MAX를 초과하면서 하위 32비트가 작은 SZ 값으로 SQL 함수를 실행해야 합니다. 수정된 빌드가 잘린 할당을 수행하지 않는지 검증해야 하며, 일반적인 성공적인 압축 해제와 잘못된 입력 오류 사례를 대조군으로 유지해야 합니다.

요약

CVE-2026-39113은 LP64 빌드에서 옵션 SQLAR 확장이 로드되고 공격자가 제어하는 호출이 sqlar_uncompress()에 도달할 때, 169f68e부터 34e139d의 부모까지의 SQLite 소스 스냅샷 및 커스텀 빌드에만 영향을 미칩니다. zlib가 전체 값을 유지하는 동안 64비트 크기가 sqlite3_malloc(int)에 의해 축소되어 AddressSanitizer로 확인된 힙 버퍼 오버플로와 프로세스 중단이 발생했습니다. 공식 SQLite 릴리스 중 취약한 것으로 확인된 것은 없으며, 코드 실행도 입증되지 않았습니다. sqlite3_malloc64(sz)로의 업스트림 변경은 공식 SQLite 3.53.0에 포함되어 있으며 할당 폭 불일치를 제거합니다.

도구 다운로드