abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · sqlite-xfer-auth
技术分析文章:https://abraxaslabs.tech/research/sqlite-xfer-auth
类别: 权限残留 影响范围: 本地
SQLite 3.53.4(b09c88c,SOURCE_ID 2026-07-24 19:02:57 bf7c7f30031888f4e796e429ab3978879485813aaca6f641c7b33e4e09459bcc)对 INSERT INTO dest SELECT * FROM src 仍然走 xferOptimization 快速路径。sqlite3AuthCheck 仅对 dest 执行 SQLITE_INSERT 检查。该复制过程从不对 src 调用 sqlite3Select,也不执行逐列的 sqlite3AuthRead。SELECT * FROM src 会被拒绝。而 INSERT SELECT 却复制了见证数据。授权器日志为 INSERT:dest。
除非嵌入方安装授权器,否则授权器处于关闭状态。这不是 RCE。DRH 将 Fossil d1cdb817 视为 3.54 的新特性,而非 3.53 的缺陷修复。3.54.0 仍为草案。
| ID | 暂无 CVE |
| 类别 | 权限残留(READ 被拒绝的表复制) |
| 影响范围 | 本地(嵌入方 sqlite3_set_authorizer) |
| CWE | CWE-863 |
| CVSS | 高危:7.5 CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N |
| 产品 | SQLite(Hwaci) |
| 受影响版本 | 3.53.4(b09c88c14082339b66c7b7158d609a771e64ca69) |
| 认证 | 针对已安装的授权器执行本地 SQL,该授权器对 src 拒绝 READ/SELECT,并允许对 dest 执行 INSERT |
| 许可证 | GNU Affero GPL v3.0 |
| 实验环境 | 仅 127.0.0.1:18850 |
当 dest 与 src 模式兼容且允许 INSERT 时,构造 INSERT INTO dest SELECT * FROM src。原始 B-tree 记录从 READ 被拒绝的源表离开,落入 dest。裸 SELECT * FROM src 会返回 SQLITE_AUTH。xfer 路径不编译 SELECT,因此源端的 SQLITE_SELECT、表级 SQLITE_READ 以及逐列的 sqlite3AuthRead 都不会触发。
前提是嵌入方已将 sqlite3_set_authorizer 安装为不可信 SQL / 列 ACL 的关卡。默认库中该回调为 NULL。这不是 RCE。
与本次 GA 版本上其他权限残留问题一样,源于对 3.53.4 的严重/高危漏洞排查。授权器在 sqlite3_set_authorizer 中有文档说明。INSERT 授权仅针对 dest 表(insert.c:969)。xfer 在 sqlite3Select() 之前被采用(insert.c:1020-1038)。xferOptimization 复制记录。在此版本上对 insert.c 执行 grep:仅有一处 sqlite3AuthCheck,没有 sqlite3AuthRead。SQLITE_OMIT_XFER_OPT 并非默认构建标志。
论坛 2026-05-21T03:31:22Z。主干 d1cdb817cafd03a4 仅适用于 3.54。DRH 表示:这是新特性,不会进入 branch-3.53。
cd lab
./run.sh
构建 amalgamation 3.53.4 以及 lab/xfer_auth.c。组合 sqlite-xfer-auth。绑定 127.0.0.1:18850。Oracle 是来自进程内授权器的 JSON:SELECT * FROM src 被拒绝;INSERT INTO dest SELECT * FROM src 通过;dest 包含 SQLITE-XFER-AUTH-WITNESS;插入操作仅为 INSERT:dest。
SUCCESS sqlite-xfer-auth how=xfer-opt-skip-src-read select-src=denied insert-select=ok dest-has-witness=yes SQLITE-XFER-AUTH-WITNESS
按照 3.54 d1cdb817 的方式对源进行授权:如果注册了授权器,xferOptimization 必须对 src 执行 sqlite3AuthCheck 的 SELECT/READ 检查(或拒绝快速路径并回退到 sqlite3Select)。在此之前,对某张表 DENY READ 的嵌入方仍必须对任何兼容的 dest 拒绝 INSERT,或者使用 -DSQLITE_OMIT_XFER_OPT 编译。
b09c88c14082339b66c7b7158d609a771e64ca69)src/insert.c 中的 sqlite3AuthCheck INSERT dest,xferOptimization 位于 sqlite3Select 之前