WAL 文件时间旅行攻击
摘要 SQLite 的 WAL 模式通过将写操作先追加到 Write-Ahead Log,再通过 Checkpoint 批量合并至主数据库,实现了读写并发的性能飞跃。然而,这一架构也引入了时间维度上的信息残余:已删除的记录在 WAL 文件中保留至下一次 Checkpoint 执行,且应用程序通常依赖 SQLite 的自动 Checkpoint 策略(1000 页阈值或连接关闭时触发),这为攻击者提供了充裕的窗口。攻击者可通过延迟 Checkpoint、强制持有读锁阻止 WAL 清理,使 WAL 文件中的“已删除”数据保留数小时甚至数天;随后仅需解析 WAL 的帧格式,即可从 $WAL 文件中提取已被主数据库删除的敏感记录,实现对“历史状态”的时间旅行攻击。 WAL 模式的并发模型与锁定机制 WAL模式设计初衷 在传统的 SQLite Rollback Journal 模式下,写操作需要持有独占的数据库级锁,导致读写无法并发。WAL 模式通过将新的写入追加到独立的 WAL 文件末尾,使读操作可以直接访问主数据库文件中的未修改页面,同时在 WAL 文件中查找更新后的版本。 ┌─────────────────────────────────────────────────────────────┐ │ 系统内存 (共享内存) │ │ │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ 共享内存索引文件 (-shm) │…