
SQLite 3.53.4 - Alta - Local - Crash - FTS5 secure-delete PutVarint estouro de rodapé
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · sqlite-fts5-securedel
Classe: Crash Alcance: Local
SQLite 3.53.4 (b09c88c14082339b66c7b7158d609a771e64ca69) - Hwaci
fts5DoSecureDelete reconstrói um rodapé de folha FTS5 com sqlite3Fts5PutVarint após nPg = iPgIdx. Os deslocamentos de chave decodificados do rodapé não são limitados em relação ao blob original, então o cursor do PutVarint ultrapassa nn + FTS5_DATA_PADDING (20). Extra típico SQLITE_ENABLE_FTS5. O banco de dados do ataque já usava secure-delete.
Este é um resquício do trunk posterior do Fossil 9cd4f9e920 / Git d9de6eedbe91 / branch-3.53 34171bee08 (2026-08-11, YEONBA). Esse check-in é posterior a este GA. Não é CVE-2026-11824: fts5LeafRead já rejeita szLeaf<4 neste pin.
| ID | sem CVE ainda |
| Classe | Crash (ASan WRITE de tamanho 1; RCE não demonstrado) |
| Alcance | Local (abrir um banco de dados FTS5 criado maliciosamente, depois DELETE/flush) |
| CWE | CWE-787 |
| CVSS | Alto: 7.5 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H |
| Produto | SQLite (espelho no GitHub sqlite/sqlite) |
| Afetado | 3.53.4 SOURCE_ID 2026-07-24 19:02:57 bf7c7f30031888f4e796e429ab3978879485813aaca6f641c7b33e4e09459bcc |
| Autenticação | nenhuma (arquivo de índice não confiável) |
| Licença | GNU Affero GPL v3.0 |
| Lab | 127.0.0.1:18860 apenas. Escrita no heap do ASan. Sem payload de RCE. |
Abrir um banco de dados FTS5 criado maliciosamente que já usava secure-delete, depois DELETE (ou qualquer escrita que faça flush de um secure-delete) para que fts5DoSecureDelete escreva varints de rodapé além de Fts5Data. Crash / escrita no heap do ASan de tamanho 1. RCE não demonstrado. Não é CVE-2026-11824.
Apenas MATCH não é este sink. O gatilho é DELETE/flush. O arquivo criado maliciosamente não precisa de SQLITE_DBCONFIG_DEFENSIVE desativado.
Vinte buscas no código-fonte do SQLite 3.53.4 após outros pins de banco de dados e servidor HTTP. CVE-2026-11822 / CVE-2026-11824 está fechado nesta árvore (fts5LeafRead szLeaf<4). O limite posterior do trunk do YEONBA não está. O arquivo fts5corruptB.test do 3.53.4 ainda termina no teste 3.2; o teste 4.0 do trunk é o hexdb mais 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 é um int de 32 bits. O trunk posterior mantém o nPg original, usa i64 iKeyIn e rejeita iKeyIn>nPg antes do PutVarint.
Caminhos errados: tratar CVE-2026-11824 como este bug; MATCH em vez de DELETE; um plant de CREATE/INSERT ao vivo que mantinha szLeaf dentro do intervalo e não estourava; chamar a cadeia WAL-plus-FTS5 de Winter de RCE sem um payload.
cd lab
./run.sh
Amalgamação ASan do zip oficial sqlite-src-3530400, -DSQLITE_ENABLE_FTS5. Hexdb lab/yeonba-fts5corruptB-4.hexdb (trunk fts5corruptB.test 4.0) é necessário. Bind loopback 127.0.0.1:18860. Projeto 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
Frames do ASan: fts5PutVarint64 -> sqlite3Fts5PutVarint -> fts5DoSecureDelete / fts5FlushSecureDelete.
Manter o nPg original. Ampliar iKeyIn para i64. Rejeitar iKeyIn>nPg antes de sqlite3Fts5PutVarint. Esse é o Fossil 9cd4f9e920 / branch-3.53 34171bee08. Faça cherry-pick dele sobre o 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, não este resquício