abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · 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) |
| CWE | CWE-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 之后。
b09c88c14082339b66c7b7158d609a771e64ca69)src/parse.y COLLATE 动作src/expr.c sqlite3ExprAddCollateToken、sqlite3ExprAlloc(nHeight = 1)、sqlite3PExpr / sqlite3ExprCheckHeightsrc/walker.c sqlite3WalkExprNNsrc/sqliteLimit.h SQLITE_MAX_EXPR_DEPTH 默认 1000