
Доказательный код эксплойта и технический анализ для CVE-2022-35737 — целочисленного переполнения в функции sqlite3_str_vappendf в SQLite3, приводящего к переполнению буфера стека и потенциальному произвольному выполнению кода.
Целочисленное переполнение в функции 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 и исправлена в релизе 3.39.2, доступном с 21 июля 2022 года. Она эксплуатируется на 64-битных системах, и возможность эксплуатации зависит от того, как скомпилирована программа: подтверждено выполнение произвольного кода, когда библиотека скомпилирована без стековых канареек, но не подтверждено при наличии стековых канареек; отказ в обслуживании подтверждён во всех случаях.
Большие строковые входные данные для функции sqlite3_str_vappendf могут вызвать
знаковое целочисленное переполнение, когда спецификатор формата — %q, %Q или
%w. Это может привести к записи контролируемых пользователем данных за границы
буфера, выделенного в стеке, что приводит к сбою программы, бесконечному циклу
или возможному выполнению произвольного кода.
Этот репозиторий содержит proof-of-concept код, демонстрирующий эксплуатацию уязвимости.
snprintf-good-example.cДемонстрирует, что sqlite3_snprintf корректно экранирует все существующие
символы одинарной кавычки и добавляет начальную и конечную одинарную кавычку к
короткой строке.
Ожидаемый результат:
$ ./snprintf-good-example
src: hello, 'world'!
dst: 'hello, ''world''!'
snprintf-crash.cДемонстрирует, что sqlite_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Демонстрирует, что CVE-2022-35737 достижима из интерпретатора PHP при работе с нестандартными лимитами памяти.
Ожидаемый результат: SIGSEGV
$ php pdo-sqlite3-quote-poc.php
Segmentation fault (core dumped)
При желании proof-of-concept можно выполнить в Docker-контейнере, где зависимости привязаны к уязвимой версии библиотеки SQLite.
$ docker build -t cve-2022-35737 .
$ docker run -it --rm cve-2022-35737 /bin/bash
root@289cef859649:/poc# ./snprintf-crash
Segmentation fault (core dumped)