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 位系统上被利用,其可利用性取决于程序的编译方式:当库在未启用栈金丝雀的情况下编译时,已确认可执行任意代码;但在启用栈金丝雀时尚未确认;在所有情况下,均已确认可造成拒绝服务。
当格式说明符为 %q、%Q 或 %w 时,向 sqlite3_str_vappendf 函数输入大型字符串可能导致有符号整数溢出。这会导致用户可控数据被写入到栈上分配的缓冲区边界之外,从而造成程序崩溃、无限循环,或可能执行任意代码。
本仓库包含演示该漏洞利用的概念验证代码。
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)
如果需要,可以在 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)