Skip to content
KitploitKITPLOIT
工具漏洞利用博客
Log in
提交
工具漏洞利用博客
提交

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

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

订阅源联系隐私© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
sqlite-collate-depth — SQLite 3.53.4 - 高危 - 本地 - 崩溃 - COLLATE 链跳过 SQLITE_LIMIT_EXPR_DEPTH | Kitploit
工具/GitHubGitHub/abraxas/sqlite-collate-depth
静态分析漏洞分析漏洞利用模糊测试数据库安全
GitHubabraxas/sqlite-collate-depth

sqlite-collate-depth

SQLite 3.53.4 - 高危 - 本地 - 崩溃 - COLLATE 链跳过 SQLITE_LIMIT_EXPR_DEPTH

查看仓库
16天前尚未审核

最受欢迎

查看全部 →

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

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

Abraxas Labs - sqlite-collate-depth

abraxaslabs.tech  ·  github.com/abraxas  ·  @abraxas_null  ·  [email protected]  ·  sqlite-collate-depth

sqlite-collate-depth

类别: 崩溃 可达性: 本地

SQLite 3.53.4 (b09c88c14082339b66c7b7158d609a771e64ca69,SOURCE_ID 2026-07-24 19:02:57 bf7c7f30031888f4e796e429ab3978879485813aaca6f641c7b33e4e09459bcc) - Hwaci

COLLATE 语法动作从不调用 sqlite3ExprCheckHeight。sqlite3ExprAddCollateToken 分配一个 TK_COLLATE 节点,其 nHeight 仍为 1,然后将先前的表达式挂到 pLeft 上。普通运算符会经过 sqlite3PExpr,并受到文档所述的 SQLITE_LIMIT_EXPR_DEPTH(默认 1000)限制。此运算符则不会。

遍历器仍会对每个 pLeft 递归。EP_Skip 用于亲和性,而非用于 sqlite3WalkExprNN。一个 50 节点的链返回 1。8k 和 40k 也是如此,超过了深度限制。120k 会在 sqlite3WalkExprNN 中触发 ASan 栈溢出(rc=134)。不是 RCE。

规范树位于 https://sqlite.org/src。GitHub 上的 sqlite/sqlite 是 Fossil 镜像。官方 zip 为 sqlite-src-3530400。公共领域库。本包采用 AGPLv3。

ID暂无 CVE
类别崩溃(sqlite3WalkExprNN 中的 ASan 栈溢出;未演示 RCE)
可达性本地(不可信 SQL 或植入的 VIEW)
CWECWE-674、CWE-770
CVSS高:7.5 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H
产品SQLite 3.53.4
受影响版本3.53.4(b09c88c);后续 trunk COLLATE 高度检查的遗留问题
认证不可信 SQL 或 VIEW;默认 load_extension 保持关闭
许可证GNU Affero GPL v3.0
实验环境仅 127.0.0.1:18800。ASan 合并版。崩溃见证。

攻击者能做什么

将一长串后缀 COLLATE BINARY 链作为 SQL 输入,或将其植入不可信 .db 中的 VIEW。宿主进程遍历该链并在 C 栈上死亡。文档所述的表达式深度限制从未在此运算符上运行。

SELECT 1 COLLATE BINARY COLLATE BINARY ... 就足够了。在 CREATE VIEW v AS SELECT 1 COLLATE BINARY ... 中形状相同,然后在新连接上执行 SELECT * FROM v。默认 SQLITE_LIMIT_SQL_LENGTH(1e9)可容纳约 1.8 MB 的链,该链在本实验环境中溢出了 8 MB 栈。

这是嵌入进程的崩溃。不是指令指针控制。load_extension 保持关闭。

我是如何发现的

在 OpenLiteSpeed 之后,对 SQLite 标签 version-3.53.4 进行了二十次源码搜寻。最新 GA,而非 3.54.0 草案。sqlite.org/security.html 将不可信 SQL 和不可信 .db 视为一等公民。默认 load_extension 关闭。

parse.y 中 COLLATE 的代码只有三行:

expr(A) ::= expr(A) COLLATE ids(C). {
  A = sqlite3ExprAddCollateToken(pParse, A, &C, 1);
}

sqlite3ExprAddCollateToken 设置 pNew->pLeft = pExpr 和 EP_Collate|EP_Skip。sqlite3ExprAlloc 将 nHeight 留为 1。没有 sqlite3ExprCheckHeight。sqlite3PExpr 对所有其他二元运算符都会执行这两件事。

错误方向:将 8k COLLATE 视为崩溃(它返回 1);将 40k 视为崩溃(它也返回 1,远超 SQLITE_LIMIT_EXPR_DEPTH 1000);需要 120k 才让 ASan 在 sqlite3WalkExprNN 中死亡。

这是该固定版本上十四个遗留问题中的 G1。同类问题是其他帖子。

实验环境

cd lab
./run.sh

来自官方 sqlite-src-3530400 的 ASan 合并版(标签 version-3.53.4 的回退克隆)。Compose sqlite-collate-depth。在 127.0.0.1:18800 上的虚拟 HTTP。将其绑定到回环。

SUCCESS sqlite-collate-depth how=asan-stack-overflow control=50 crash-n=120000 SQLITE-COLLATE-DEPTH-WITNESS

50 个 COLLATE 返回 1。8k 和 40k 也返回 1。120k 死亡 rc=134,sqlite3WalkExprNN 中的 ASan 栈溢出。固定版本检查是 SELECT sqlite_version() / SELECT sqlite_source_id()。

修复

在附加 pLeft 后对 COLLATE 节点调用 sqlite3ExprCheckHeight,就像 sqlite3PExpr 已经做的那样。从子节点重新计算 nHeight。后缀运算符仍然是表达式树。

Trunk 252c0b7bf5(2026-10-04)在此 GA 之后。

参考资料

  • https://sqlite.org/src 标签 version-3.53.4(b09c88c14082339b66c7b7158d609a771e64ca69)
  • https://github.com/sqlite/sqlite(Fossil 镜像)树 https://github.com/sqlite/sqlite/tree/version-3.53.4
  • 官方 zip https://www.sqlite.org/2026/sqlite-src-3530400.zip
  • https://sqlite.org/security.html
  • src/parse.y COLLATE 动作
  • src/expr.c sqlite3ExprAddCollateToken、sqlite3ExprAlloc(nHeight = 1)、sqlite3PExpr / sqlite3ExprCheckHeight
  • src/walker.c sqlite3WalkExprNN
  • src/sqliteLimit.h SQLITE_MAX_EXPR_DEPTH 默认 1000
  • CWE-674 不受控递归
  • CWE-770 无限制或节流的资源分配
下载工具