abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · sqlite-fts5-securedel
类别: 崩溃 可达性: 本地
SQLite 3.53.4 (b09c88c14082339b66c7b7158d609a771e64ca69) - Hwaci
fts5DoSecureDelete 在 nPg = iPgIdx 之后使用 sqlite3Fts5PutVarint 重建 FTS5 叶子页脚。页脚解码出的键偏移量未针对原始 blob 做上限检查,因此 PutVarint 游标会越过 nn + FTS5_DATA_PADDING (20)。典型额外 SQLITE_ENABLE_FTS5。攻击数据库已使用 secure-delete。
这是后续 trunk Fossil 9cd4f9e920 / Git d9de6eedbe91 / branch-3.53 34171bee08 (2026-08-11, YEONBA) 的遗留问题。该提交在此 GA 之后。它不是 CVE-2026-11824:在此 pin 上 fts5LeafRead 已拒绝 szLeaf<4。
| ID | 暂无 CVE |
| 类别 | 崩溃(ASan WRITE of size 1;未演示 RCE) |
| 可达性 | 本地(打开特制 FTS5 数据库,然后 DELETE/flush) |
| CWE | CWE-787 |
| CVSS | High: 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 SOURCE_ID 2026-07-24 19:02:57 bf7c7f30031888f4e796e429ab3978879485813aaca6f641c7b33e4e09459bcc |
| 认证 | 无(不可信索引文件) |
| 许可证 | GNU Affero GPL v3.0 |
| 实验环境 | 仅 127.0.0.1:18860。ASan 堆写入。无 RCE payload。 |
打开一个已使用 secure-delete 的特制 FTS5 数据库,然后 DELETE(或任何会 flush secure-delete 的写入),使 fts5DoSecureDelete 将页脚 varint 写到 Fts5Data 之外。崩溃 / ASan 堆写入 of size 1。未演示 RCE。不是 CVE-2026-11824。
仅 MATCH 不会触发此 sink。触发点是 DELETE/flush。特制文件不需要关闭 SQLITE_DBCONFIG_DEFENSIVE。
在其他数据库和 HTTP 服务器 pin 之后,对 SQLite 3.53.4 进行了二十次源码搜寻。CVE-2026-11822 / CVE-2026-11824 在此代码树上已关闭(fts5LeafRead szLeaf<4)。YEONBA 后续 trunk 的边界检查则没有。3.53.4 的 fts5corruptB.test 文件仍止于 test 3.2;trunk test 4.0 是 hexdb 加上 DELETE FROM t WHERE rowid = 1。
iPgIdx -= nShift;
nPg = iPgIdx;
fts5PutU16(&aPg[2], iPgIdx);
for(iIdx=0; iIdx<nIdx; /* no-op */){
u32 iVal = 0;
iIdx += fts5GetVarint32(&aIdx[iIdx], iVal);
iKeyIn += iVal;
if( iKeyIn!=iDelKeyOff ){
int iKeyOut = (iKeyIn - (iKeyIn>iOff ? nShift : 0));
nPg += sqlite3Fts5PutVarint(&aPg[nPg], iKeyOut - iPrevKeyOut);
iPrevKeyOut = iKeyOut;
}
}
ext/fts5/fts5_index.c:5514-5544。iKeyIn 是 32 位 int。后续 trunk 保留原始 nPg,使用 i64 iKeyIn,并在 PutVarint 之前拒绝 iKeyIn>nPg。
错误方向:将 CVE-2026-11824 当作此 bug;使用 MATCH 而非 DELETE;一个实时 CREATE/INSERT 植入使 szLeaf 保持在范围内且未溢出;在没有 payload 的情况下称 Winter 的 WAL-plus-FTS5 链为 RCE。
cd lab
./run.sh
来自官方 sqlite-src-3530400 zip 的 ASan amalgamation,-DSQLITE_ENABLE_FTS5。需要 Hexdb lab/yeonba-fts5corruptB-4.hexdb(trunk fts5corruptB.test 4.0)。绑定回环 127.0.0.1:18860。Compose 项目 sqlite-fts5-securedel。
SUCCESS sqlite-fts5-securedel how=asan-heap-buffer-overflow-write-1-fts5DoSecureDelete db=yeonba-hexdb bytes=5120 SQLITE-FTS5-SECUREDEL-WITNESS
ASan 栈帧:fts5PutVarint64 -> sqlite3Fts5PutVarint -> fts5DoSecureDelete / fts5FlushSecureDelete。
保留原始 nPg。将 iKeyIn 扩展为 i64。在 sqlite3Fts5PutVarint 之前拒绝 iKeyIn>nPg。即 Fossil 9cd4f9e920 / branch-3.53 34171bee08。将其 cherry-pick 到 3.53。
b09c88c14082339b66c7b7158d609a771e64ca69ext/fts5/fts5_index.c fts5DoSecureDelete、fts5FlushSecureDelete、fts5LeafReadext/fts5/fts5_varint.c sqlite3Fts5PutVarintd9de6eedbe91 / branch-3.53 34171bee08 (2026-08-11, YEONBA)szLeaf<4 父问题,不是此遗留问题