
SQLite 3.53.4 - 高 - ローカル - 情報漏洩 - WAL/DB ページサイズ不一致による未初期化ページ末尾
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · sqlite-wal-pagesize
分類: 情報漏洩 到達範囲: ローカル
SQLite 3.53.4 (b09c88c) は、WAL フレームを末尾の memset なしで完全な pager ページにショートリードする。walIndexRecover は [512, SQLITE_MAX_PAGE_SIZE] 内の任意の 2 の冪の WAL ページサイズを受け入れ、データベースのページサイズと比較しない。リサイクルされた pcache スロットは、通常の SQL を通じて以前のヒープ/ページバイトを返す。
ラボ: 4096 ページの WAL モード .db、兄弟 -wal のヘッダーページサイズ 512、SELECT b FROM t が 2000 バイトを返した。512 バイトフレームを超えた末尾は SQLITE-WAL-PAGESIZE-WITNESS だった。RCE ではない。
| ID | CVE 未割当 |
| 分類 | 情報漏洩 (SQL 経由の未初期化 pager 末尾) |
| 到達範囲 | ローカル (信頼できない .db と兄弟 -wal) |
| CWE | CWE-908, CWE-200 |
| CVSS | High: 7.5 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N |
| 製品 | SQLite (Hwaci) |
| 影響バージョン | 3.53.4 (b09c88c14082339b66c7b7158d609a771e64ca69); SOURCE_ID 2026-07-24 19:02:57 bf7c7f30031888f4e796e429ab3978879485813aaca6f641c7b33e4e09459bcc |
| 認証 | なし (被害者が攻撃者のファイルを開く) |
| ライセンス | GNU Affero GPL v3.0 |
| ラボ | 127.0.0.1:18830 のみ |
WAL モードの .db と、ヘッダーページサイズがデータベースより小さい有効な 2 の冪である兄弟 -wal を配布する。リカバリはそれを受け入れる。sqlite3WalReadFrame は WAL フレームサイズのみを、.db からサイズ決定された pager バッファにコピーする。そのフレームより大きいペイロードを主張するテーブルリーフセルは、リサイクルされた pcache 末尾から満たされる。その blob に対する SELECT / substr() / hex() は、同一プロセス内の以前のページからの残留 pager/ヒープバイトを返す。
逆の不一致 (WAL が pager より大きい) はチェックポイント時に SQLITE_CORRUPT となる。この残留は小さい WAL の読み取りパスに限られる。RCE ではない。
後期トランクの残留マトリックスの後、3.53.4 を 20 回ソース探索した。Winter がフォーラムで 2026-08-17T15:54:41Z として報告した。トランク f9b4ee3695 / branch-3.53 4fde87b2a0 (2026-08-16) はこの GA (2026-07-24) より後である。このピンでの sqlite3WalReadFrame は依然として (nOut>sz ? sz : nOut) であり、末尾の memset はない。
回り道: 初期のリーフセルが不正で、SELECT が SQLITE_CORRUPT rc=11 を返した。機能するセルは、4096 バイトの pager ページ上の 512 バイトフレームにまたがる 2000 バイトのローカルペイロードを主張する。
cd lab
./run.sh
正規のソース zip から SQLite 3.53.4 をビルドする。Compose sqlite-wal-pagesize。公開 127.0.0.1:18830。48x4000 バイトの witness 行で pcache をプライムし、ショートリードリーフに対して SELECT b FROM t を実行する。
SUCCESS sqlite-wal-pagesize how=wal-shortread-pcache-tail len=2000 rootpage=2 SQLITE-WAL-PAGESIZE-WITNESS
リカバリ中に WAL ヘッダーのページサイズとデータベースのページサイズを比較する。一致しない場合、WAL を拒否するか、pager ページを完全に初期化する:
if( nOut>sz ){
memset(pOut+sz, 0, nOut-sz);
nOut = sz;
}
このハンクはこの GA より後のトランクにある。3.53.4 には含まれていない。
b09c88c14082339b66c7b7158d609a771e64ca69)src/wal.c sqlite3WalReadFrame, walIndexRecoversrc/pager.c readDbPage