abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · sqlite-session-ncol
技术分析文章:https://abraxaslabs.tech/research/sqlite-session-ncol
类别: 堆越界写(heap OOB write) 可达性: 本地
SQLite 3.53.4(b09c88c14082339b66c7b7158d609a771e64ca69,SOURCE_ID 2026-07-24 19:02:57 bf7c7f30031888f4e796e429ab3978879485813aaca6f641c7b33e4e09459bcc),启用 -DSQLITE_ENABLE_SESSION。一个双块 changeset 先以 nCol=2 复用表名 t,再以 nCol=64 复用同一表名,从而跳过 sessionTableInfo 重置(sqlite3session.c:5619),并对第一块的 aUpdateMask 之外执行 memset。ASan 在 sessionUpdateFind 中报告大小为 12 的 WRITE。对照组为单条 2 列 UPDATE,apply-rc=0。
除非开启 SESSION,否则默认 amalgamation 不受影响。CVE-2026-50812 NPD 已在 3.53.2+ 上修复。这不是武器化的 RCE 载荷。判定依据(oracle)是 ASan WRITE。
| ID | 暂无 CVE |
| 类别 | 堆越界写(ASan WRITE of size 12;未演示 RCE) |
| 可达性 | 本地(通过 sqlite3changeset_apply* 应用不可信 changeset) |
| CWE | CWE-787 |
| CVSS | 高危:8.1 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| 产品 | SQLite Session 扩展(Hwaci) |
| 受影响版本 | 3.53.4(b09c88c)以 -DSQLITE_ENABLE_SESSION 编译 |
| 认证 | 主机应用不可信 changeset |
| 许可证 | GNU Affero GPL v3.0 |
| 实验环境 | 仅 127.0.0.1:18900。ASan WRITE-of-size-12 见证。 |
应用一个不可信 changeset,其第二个表块以更大的 nCol 复用同一表名。造成堆越界写。需要编译扩展。除非开启 SESSION,否则默认 amalgamation 不受影响。
第一个块根据 pIter->nCol 分配 aUpdateMask。后续同名块跳过 sessionTableInfo 重置,并用更大的掩码对旧分配执行 memset。实验:nCol=2 后接 nCol=64 的 UPDATE。ASan 在 sessionUpdateFind 中报告大小为 12 的 WRITE。对照组为单条 2 列 UPDATE,apply-rc=0。
不要将此包视为 write-what-where 利用原语。ASan WRITE-of-size-12 才是判定依据。
在 3.53.2 FTS5 / session-NPD 浪潮之后,对 SQLite 3.53.4 进行了二十次源码排查。CVE-2026-50812 已修复(sessionBindRow 将缺失值视为 SQLITE_CORRUPT)。Session 仍然仅以表名作为 SessionApplyCtx 的键。第二个块使用相同表名和更大的声明列数,从而复用 aUpdateMask。
已记录的弯路:将默认 amalgamation 视为影响范围(SESSION 未开启);重复提交 CVE-2026-50812;针对 2 列 schema 发送单个 nCol=64 的表块(schemaMismatch,无写入);声称 12 字节的 memset 可导致 RCE。
cd lab
./run.sh
来自官方 sqlite-src-3530400 zip 的 ASan 合并版本。额外编译 -DSQLITE_ENABLE_SESSION -DSQLITE_ENABLE_PREUPDATE_HOOK。健康检查位于 127.0.0.1:18900。将其绑定到回环地址。
SUCCESS sqlite-session-ncol how=asan-heap-write-sessionUpdateFind write-size=12 control-apply-rc=0 SQLITE-SESSION-NCOL-WITNESS
当后续的 changeset 表块复用某个名称时,按照处理新名称的方式重建 SessionApplyCtx:释放 aUpdateMask,重新执行 sessionTableInfo,拒绝比实际 schema 更大的 nCol。Trunk 3f57024aec / branch-3.53 a1dd7123d8(2026-08-17)在此 GA 之后。
b09c88c14082339b66c7b7158d609a771e64ca69)sessionChangesetApply :5619、sessionUpdateFind :4381-4412