Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
CVE-2026-39113 — 针对 SQLite SQLAR 堆缓冲区溢出的安全通告与 AddressSanitizer 复现器,该漏洞由精心构造的 SZ 值触发,导致分配被截断并引发 zlib 越界写入。 | Kitploit
工具/GitHubGitHub/20000419/cve-2026-39113
漏洞分析代码分析漏洞利用数据库安全二进制利用
GitHub20000419/cve-2026-39113

CVE-2026-39113

针对 SQLite SQLAR 堆缓冲区溢出的安全通告与 AddressSanitizer 复现器,该漏洞由精心构造的 SZ 值触发,导致分配被截断并引发 zlib 越界写入。

查看仓库
1天前尚未审核

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

CVE-2026-39113:SQLite 可选 SQLAR 扩展中的堆缓冲区溢出

执行摘要

CVE-2026-39113 是 SQLite 可选 SQLAR 扩展中的一个堆缓冲区溢出漏洞。在已加载该扩展的应用程序中,能够使用受控的压缩 blob 和大小调用 sqlar_uncompress() 的攻击者,可以在 LP64 系统上导致 zlib 在堆分配之外写入。这是宿主进程内部的内存安全边界故障;它不是 SQLite 数据库文件解析问题、认证绕过,也不是每个默认 SQLite 部署中均可触及的缺陷。

该漏洞行为于 2026-03-11 由 Git 提交 169f68e(Fossil check-in 8bdc0d485e3ad0c7...)引入,并于 2026-04-01 由 Git 提交 34e139d(Fossil check-in 6194f3b5314ef98b...)修复。受影响范围是从 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 观察到 heap-buffer-overflow,随后进程终止,证实了原生堆破坏和拒绝服务。未演示代码执行。

背景

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 被允许写入量相同的内存。然而,易受攻击的源代码将 64 位大小转换为 sqlite3_malloc() 的 32 位参数类型,同时为 uncompress() 保留完整值。

易受攻击的源代码快照在配置期间打印了 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 被告知输出缓冲区可容纳超过 4 GiB。解压代表 4096 字节数据的 42 字节 blob 随后越过了分配边界。

2026-03-11 的更改将 sqlite3_value_int() 替换为 sqlite3_value_int64(),但未更改分配 API,由此该不匹配进入项目。对 SQLite 3.52.0 的源代码审查显示其使用较早的 32 位读取,因此那里不存在全宽度/短分配的不匹配。2026-04-01 的修复将分配更改为 sqlite3_malloc64(sz)。对官方 3.53.0 标签的源代码审查确认了该已修复的调用。

可利用性分析

已演示的原语是在承载 SQLite 的进程中的堆越界写入。保留的运行结果显示 AddressSanitizer 在通过 sqlite3_malloc() 分配的 40 字节堆区域之后立即检测到第一次无效的单字节写入,随后发生中止。这直接支持进程崩溃和拒绝服务。

利用需要同时满足以下所有条件:

  • 已加载可选的 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 仅影响从 169f68e 到 34e139d 的父提交之间的 SQLite 源代码快照和自定义构建,前提是在 LP64 构建上加载了可选的 SQLAR 扩展,且攻击者控制的调用到达 sqlar_uncompress()。64 位大小被 sqlite3_malloc(int) 收窄,而 zlib 保留了完整值,从而产生经 AddressSanitizer 确认的堆缓冲区溢出和进程中止。未经验证任何官方 SQLite 版本存在漏洞,也未演示代码执行。上游更改为 sqlite3_malloc64(sz) 的代码存在于官方 SQLite 3.53.0 中,消除了分配宽度不匹配。

下载工具