
SQLite 3.53.4 - 高 - ローカル - クラッシュ - FTS5 secure-delete PutVarint フッターオーバーラン
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 より後である。これは not CVE-2026-11824 である: このピンでは fts5LeafRead がすでに szLeaf<4 を拒否する。
| ID | CVE 未割当 |
| 分類 | クラッシュ (ASan サイズ 1 の WRITE、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 ペイロードなし。 |
すでに secure-delete を使用した細工された FTS5 データベースを開き、DELETE (または secure-delete をフラッシュする任意の書き込み) を行うと、fts5DoSecureDelete が Fts5Data を超えてフッター varint を書き込む。クラッシュ / ASan サイズ 1 のヒープ書き込み。RCE は実証されず。CVE-2026-11824 ではない。
MATCH のみではこのシンクには到達しない。トリガーは DELETE/flush である。細工されたファイルに SQLITE_DBCONFIG_DEFENSIVE をオフにする必要はない。
他のデータベースや HTTP サーバーのピンの後、SQLite 3.53.4 を 20 回ソースハンティングした。CVE-2026-11822 / CVE-2026-11824 はこのツリーではクローズ済みである (fts5LeafRead の szLeaf<4)。YEONBA の後続 trunk のバウンドはそうではない。3.53.4 の fts5corruptB.test ファイルは依然としてテスト 3.2 で終わっている; trunk のテスト 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 をこのバグとみなすこと; DELETE ではなく MATCH を使うこと; szLeaf を範囲内に保ちオーバーフローしなかったライブ CREATE/INSERT プラント; ペイロードなしで Winter の WAL と FTS5 の連鎖 RCE を主張すること。
cd lab
./run.sh
公式 sqlite-src-3530400 zip からの ASan アマルガメーション、-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 である。これを 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 の親であり、この残骸ではない