
SQLite 3.53.4 - 高 - ローカル - 情報漏洩 - WAL/DB ページサイズ不一致による未初期化ページ末尾
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · sqlite-wal-pagesize
解説記事: https://abraxaslabs.tech/research/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
SQLite 3.53.4 を正規のソース zip からビルドします。sqlite-wal-pagesize を Compose します。127.0.0.1:18830 を公開します。48x4000 バイトのウィットネス行で pcache をプライミングし、その後ショートリードリーフに対して SELECT b FROM t を実行します。
SUCCESS sqlite-wal-pagesize how=wal-shortread-pcache-tail len=2000 rootpage=2 SQLITE-WAL-PAGESIZE-WITNESS
リカバリ中にWALヘッダーのページサイズとデータベースのページサイズを比較します。両者が一致しない場合、WALを拒否するか、ページャーページを完全に初期化します:
if( nOut>sz ){
memset(pOut+sz, 0, nOut-sz);
nOut = sz;
}
このハンクはこの GA の後にトランクに入ったものである。3.53.4 には含まれていない。
b09c88c14082339b66c7b7158d609a771e64ca69)src/wal.c sqlite3WalReadFrame、walIndexRecoversrc/pager.c readDbPage