
SQLite 3.53.4 - Alto - Locale - Crash - FTS5 secure-delete PutVarint footer overrun
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · sqlite-fts5-securedel
Classe: Crash Reach: Locale
SQLite 3.53.4 (b09c88c14082339b66c7b7158d609a771e64ca69) - Hwaci
fts5DoSecureDelete ricostruisce un footer di foglia FTS5 con sqlite3Fts5PutVarint dopo nPg = iPgIdx. Gli offset delle chiavi decodificati dal footer non vengono limitati rispetto al blob originale, quindi il cursore di PutVarint esce da nn + FTS5_DATA_PADDING (20). Tipico extra SQLITE_ENABLE_FTS5. Il database dell'attacco usava già secure-delete.
Questo è un residuo del successivo trunk Fossil 9cd4f9e920 / Git d9de6eedbe91 / branch-3.53 34171bee08 (2026-08-11, YEONBA). Quel check-in è successivo a questa GA. Non è CVE-2026-11824: fts5LeafRead rifiuta già szLeaf<4 su questo pin.
| ID | nessuna CVE al momento |
| Classe | Crash (ASan WRITE di dimensione 1; RCE non dimostrata) |
| Reach | Locale (aprire un database FTS5 craftato, poi 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 |
| Prodotto | SQLite (mirror GitHub sqlite/sqlite) |
| Affected | 3.53.4 SOURCE_ID 2026-07-24 19:02:57 bf7c7f30031888f4e796e429ab3978879485813aaca6f641c7b33e4e09459bcc |
| Auth | nessuna (file indice non attendibile) |
| Licenza | GNU Affero GPL v3.0 |
| Lab | solo 127.0.0.1:18860. Scrittura heap ASan. Nessun payload RCE. |
Aprire un database FTS5 craftato che usava già secure-delete, poi DELETE (o qualsiasi scrittura che effettui il flush di un secure-delete) in modo che fts5DoSecureDelete scriva varint del footer oltre Fts5Data. Crash / scrittura heap ASan di dimensione 1. RCE non dimostrata. Non è CVE-2026-11824.
Il solo MATCH non è questo sink. Il trigger è DELETE/flush. Il file craftato non richiede SQLITE_DBCONFIG_DEFENSIVE disattivato.
Venti ricerche nel sorgente di SQLite 3.53.4 dopo altri pin di database e server HTTP. CVE-2026-11822 / CVE-2026-11824 è chiusa su questo albero (fts5LeafRead szLeaf<4). Il bound del trunk successivo di YEONBA non lo è. Il file fts5corruptB.test di 3.53.4 termina ancora al test 3.2; il test 4.0 del trunk è l'hexdb più 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 è un int a 32 bit. Il trunk successivo mantiene nPg originale, usa i64 iKeyIn e rifiuta iKeyIn>nPg prima di PutVarint.
Vicoli ciechi: trattare CVE-2026-11824 come questo bug; MATCH invece di DELETE; un plant live CREATE/INSERT che manteneva szLeaf nel range e non andava in overflow; definire RCE la catena WAL-più-FTS5 di Winter senza un payload.
cd lab
./run.sh
Amalgamation ASan dallo zip ufficiale sqlite-src-3530400, -DSQLITE_ENABLE_FTS5. È richiesto l'hexdb lab/yeonba-fts5corruptB-4.hexdb (trunk fts5corruptB.test 4.0). Bind loopback 127.0.0.1:18860. Progetto 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
Frame ASan: fts5PutVarint64 -> sqlite3Fts5PutVarint -> fts5DoSecureDelete / fts5FlushSecureDelete.
Mantenere nPg originale. Ampliare iKeyIn a i64. Rifiutare iKeyIn>nPg prima di sqlite3Fts5PutVarint. Questo è Fossil 9cd4f9e920 / branch-3.53 34171bee08. Applicarlo con cherry-pick su 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, non questo residuo