
CVE-2022-35737에 대한 개념 증명 익스플로잇 코드 및 기술 분석으로, SQLite3의 sqlite3_str_vappendf 함수에서 발생하는 정수 오버플로우로 인해 스택 버퍼 오버플로우와 잠재적인 임의 코드 실행이 가능해집니다.
SQLite3 sqlite3_str_vappendf 함수의 정수 오버플로우.
CVSS 6.7 AV:L/AC:H/PR:N/UI:N/S:U/C:N/I:H/A:H
CVE-2022-35737은 SQLite 버전 1.0.12에서 도입되었으며, 2022년 7월 21일에 제공된 릴리스 3.39.2에서 수정되었습니다. 64비트 시스템에서 악용 가능하며, 악용 가능성은 프로그램이 컴파일되는 방식에 따라 달라집니다: 스택 카나리 없이 컴파일된 라이브러리에서는 임의 코드 실행이 확인되었지만, 스택 카나리가 있는 경우에는 확인되지 않았습니다. 모든 경우에 서비스 거부는 확인되었습니다.
sqlite3_str_vappendf 함수에 큰 문자열을 입력하면 형식 지정자가 %q, %Q 또는 %w일 때 부호 있는 정수 오버플로우가 발생할 수 있습니다. 이로 인해 스택에 할당된 버퍼의 경계를 넘어 사용자 제어 데이터가 기록되어 프로그램 충돌, 무한 루프 또는 가능한 임의 코드 실행이 발생할 수 있습니다.
이 저장소에는 취약점 악용을 입증하는 개념 증명 코드가 포함되어 있습니다.
snprintf-good-example.csqlite3_snprintf가 기존의 모든 작은따옴표 문자를 올바르게 이스케이프하고 짧은 문자열에 앞뒤로 작은따옴표를 추가하는 것을 보여줍니다.
예상 결과:
$ ./snprintf-good-example
src: hello, 'world'!
dst: 'hello, ''world''!'
snprintf-crash.csqlite_snprintf에 충분히 큰 문자열을 전달하면 충돌이 발생하는 것을 보여줍니다.
예상 결과: SIGSEGV
$ ./snprintf-crash
Segmentation fault (core dumped)
snprintf-control-pc.c버퍼 오버플로우의 길이를 제어하여 스택 카나리 및 저장된 반환 주소와 같은 스택의 대상 데이터를 덮어쓸 수 있음을 보여줍니다.
예상 결과: SIGABRT
$ ./snprintf-control-pc
*** stack smashing detected ***: terminated
Aborted (core dumped)
snprintf-livelock.c취약한 프로그램이 거의 무한히 (2^64 반복) 루프하도록 만들 수 있음을 보여줍니다.
예상 결과: 무한 루프 (합리적인 시간 범위 내에서)
$ ./snprintf-livelock
<no output>
^C
pdo-sqlite3-quote-poc.php비기본 메모리 제한으로 실행될 때 PHP 인터프리터에서 CVE-2022-35737에 도달할 수 있음을 보여줍니다.
예상 결과: SIGSEGV
$ php pdo-sqlite3-quote-poc.php
Segmentation fault (core dumped)
원하는 경우, 개념 증명은 취약한 버전의 SQLite 라이브러리에 종속성이 고정된 Docker 컨테이너에서 실행할 수 있습니다.
$ docker build -t cve-2022-35737 .
$ docker run -it --rm cve-2022-35737 /bin/bash
root@289cef859649:/poc# ./snprintf-crash
Segmentation fault (core dumped)