
SQLite 3.53.4 — высокий — локальный — сбой — переполнение PutVarint в footer при secure-delete в FTS5
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · sqlite-fts5-securedel
Класс: Crash Доступ: Local
SQLite 3.53.4 (b09c88c14082339b66c7b7158d609a771e64ca69) - Hwaci
fts5DoSecureDelete перестраивает leaf-футер FTS5 с помощью sqlite3Fts5PutVarint после nPg = iPgIdx. Смещения ключей, декодированные из футера, не ограничиваются размером исходного блоба, поэтому курсор PutVarint выходит за пределы nn + FTS5_DATA_PADDING (20). Обычно дополнительно требуется SQLITE_ENABLE_FTS5. В атакующей базе данных уже использовался secure-delete.
Это остаток от более позднего trunk Fossil 9cd4f9e920 / Git d9de6eedbe91 / branch-3.53 34171bee08 (2026-08-11, YEONBA). Этот check-in идёт после данного GA. Это не CVE-2026-11824: fts5LeafRead уже отклоняет szLeaf<4 на этом пине.
| ID | пока нет CVE |
| Класс | Crash (ASan WRITE размера 1; RCE не продемонстрирован) |
| Доступ | Local (открыть специально сформированную базу 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-пейлоада. |
Открыть специально сформированную базу FTS5, в которой уже использовался secure-delete, затем выполнить DELETE (или любую запись, вызывающую сброс secure-delete), чтобы fts5DoSecureDelete записал varint'ы футера за пределы Fts5Data. Crash / запись в кучу под ASan размера 1. RCE не продемонстрирован. Не CVE-2026-11824.
Только MATCH — это не данный сток. Триггер — DELETE/flush. Специально сформированному файлу не требуется отключённый SQLITE_DBCONFIG_DEFENSIVE.
Двадцать поисков по исходникам SQLite 3.53.4 после других пинов баз данных и HTTP-серверов. CVE-2026-11822 / CVE-2026-11824 закрыты на этом дереве (fts5LeafRead szLeaf<4). Более поздняя граница trunk от YEONBA — нет. Файл fts5corruptB.test из 3.53.4 всё ещё заканчивается на тесте 3.2; тест 4.0 в trunk — это 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 и отклоняет iKeyIn>nPg перед PutVarint.
Неверные пути: трактовка CVE-2026-11824 как этой ошибки; MATCH вместо DELETE; живой сценарий CREATE/INSERT, который удерживал szLeaf в допустимых пределах и не приводил к переполнению; называние цепочки Winter WAL-плюс-FTS5 RCE без пейлоада.
cd lab
./run.sh
ASan-амальгама из официального zip sqlite-src-3530400, -DSQLITE_ENABLE_FTS5. Требуется hexdb lab/yeonba-fts5corruptB-4.hexdb (trunk fts5corruptB.test 4.0). Привязка к loopback 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. Отклонять iKeyIn>nPg перед sqlite3Fts5PutVarint. Это 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, а не данный остаток