abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · sqlite-cte-nest
类别: 崩溃 可达性: 本地
SQLite 3.53.4 (b09c88c14082339b66c7b7158d609a771e64ca69, SOURCE_ID 2026-07-24 19:02:57 bf7c7f30031888f4e796e429ab3978879485813aaca6f641c7b33e4e09459bcc) - Hwaci
sqlite3ResultSetOfSelect 会递增 nNestSel,并在链达到 SQLITE_LIMIT_EXPR_DEPTH 时报错 VIEWs and/or subqueries nested too deep。在此版本上,嵌套 VIEW 已经会触及该上限。位于 select.c:5754 的 CTE 附加(sqlite3SrcItemAttachSubquery)不会递增 nNestSel。随后 selectExpander / sqlite3WalkSelect 会递归遍历 CTE 链,直到 C 栈耗尽。
一个小的 CTE 链可以返回一行。N=25000 的嵌套 FROM 会触发解析器的 Recursion limit,不会崩溃。在 .limit expr_depth 20 下,嵌套 VIEW 会报 too-deep 错误。N=25000 的 CTE 会导致 ASan 栈溢出。不是 RCE。
| ID | 暂无 CVE |
| 类别 | 崩溃(selectExpander 中的 ASan 栈溢出;未证明 RCE) |
| 可达性 | 本地(不可信 SQL 或嵌套 CTE schema) |
| CWE | CWE-674 |
| CVSS | 高危:7.5 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H |
| 产品 | SQLite(GitHub 镜像 sqlite/sqlite) |
| 受影响版本 | 3.53.4 (b09c88c);后续 trunk 中 CTE nNestSel 的遗留问题 |
| 认证 | 不可信 SQL 或植入的 WITH 链 |
| 许可证 | GNU Affero GPL v3.0 |
| 实验环境 | 仅 127.0.0.1:18810。ASan amalgamation。崩溃见证。 |
提供一个很长的 CTE 链,作为 SQL 或作为不可信 .db 上的 VIEW 主体:
WITH c0 AS (SELECT 1),
c1 AS (SELECT * FROM c0),
...
cN AS (SELECT * FROM cN-1)
SELECT * FROM cN;
selectExpander 会将每个 CTE 作为嵌套 FROM 子查询遍历。nNestSel 始终不变。宿主进程会因 C 栈耗尽而死亡。嵌套 VIEW 已经受到上限限制。嵌套 FROM 会触及解析器递归限制。这个遗留问题就是 CTE 附加路径。SQLite 不会将 CTE 名称求值为 shell。是崩溃,不是 RCE。
对 https://github.com/sqlite/sqlite 标签 https://github.com/sqlite/sqlite/releases/tag/version-3.53.4 进行了二十次源码搜寻。在此版本上,嵌套 VIEW 已受到上限限制(3f3fb9b638 / branch-3.53 38430aa5ed,2026-06-16)。CTE 附加则没有。Trunk f547308713(2026-10-05)在此 GA 之后。
已记录的弯路:将嵌套 VIEW 当作崩溃(它们会报 too-deep 错误);将 N=25000 的嵌套 FROM 当作崩溃(解析器 Recursion limit);将 5 个 CTE 的链当作上限适用的证明。
cd lab
./run.sh
官方 sqlite-src-3530400 zip、ASan amalgamation、compose sqlite-cte-nest、发布到 127.0.0.1:18810。将其绑定到 loopback。不要将此指向他人的 SQLite。
SUCCESS sqlite-cte-nest how=asan-stack-overflow crash-n=25000 small-cte=ok nested-views=too-deep nested-from=rejected SQLITE-CTE-NEST-WITNESS
在 CTE 附加时像 sqlite3ResultSetOfSelect 对 VIEW 所做的那样递增 nNestSel,并在达到 SQLITE_LIMIT_EXPR_DEPTH 时报错。Trunk f547308713(2026-10-05,"Limit the depth of recursion for CTEs using SQLITE_LIMIT_EXPR_DEPTH")就是这类补丁。它不在 3.53.4 中。
b09c88c14082339b66c7b7158d609a771e64ca69)2026-07-24 19:02:57 bf7c7f30031888f4e796e429ab3978879485813aaca6f641c7b33e4e09459bccsrc/select.c sqlite3ResultSetOfSelect (nNestSel++)、CTE 附加 :5754src/walker.c sqlite3WalkSelectFrom 子查询遍历selectExpander / sqlite3SelectExpand2026-10-04T04:58:58Z;trunk f547308713