
SQLite 3.53.4 — высокий — локальный — запись за границы кучи — рост nCol в changeset сессии с одинаковыми именами
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · sqlite-session-ncol
Класс: запись за границами кучи (heap OOB write) Достижимость: локальная
SQLite 3.53.4 (b09c88c14082339b66c7b7158d609a771e64ca69, SOURCE_ID 2026-07-24 19:02:57 bf7c7f30031888f4e796e429ab3978879485813aaca6f641c7b33e4e09459bcc) с -DSQLITE_ENABLE_SESSION. Changeset из двух блоков, который повторно использует имя таблицы t с nCol=2, а затем nCol=64, пропускает сброс sessionTableInfo (sqlite3session.c:5619) и выполняет memset за пределами aUpdateMask первого блока. ASan WRITE размера 12 в sessionUpdateFind. Контрольный одиночный 2-столбцовый UPDATE apply-rc=0.
Не является amalgamation по умолчанию, если SESSION не включён. CVE-2026-50812 NPD закрыт в 3.53.2+. Это не вооружённый RCE-пейлоад. Оракулом является ASan WRITE.
| ID | CVE пока нет |
| Класс | запись за границами кучи (ASan WRITE размера 12; RCE не продемонстрирован) |
| Достижимость | локальная (недоверенный changeset через sqlite3changeset_apply*) |
| CWE | CWE-787 |
| CVSS | High: 8.1 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| Продукт | SQLite Session extra (Hwaci) |
| Затронуто | 3.53.4 (b09c88c), скомпилированный с -DSQLITE_ENABLE_SESSION |
| Аутентификация | хост применяет недоверенный changeset |
| Лицензия | GNU Affero GPL v3.0 |
| Лаборатория | только 127.0.0.1:18900. Свидетельство ASan WRITE-of-size-12. |
Применить недоверенный changeset, второй блок таблицы которого повторно использует имя таблицы с большим nCol. Запись за границами кучи. Дополнительный compile. Не является amalgamation по умолчанию, если SESSION не включён.
Первый блок выделяет aUpdateMask из pIter->nCol. Последующий блок с тем же именем пропускает сброс sessionTableInfo и выполняет memset большего размера поверх старого выделения. Лаборатория: nCol=2, затем nCol=64 UPDATE. ASan WRITE размера 12 в sessionUpdateFind. Контрольный одиночный 2-столбцовый UPDATE apply-rc=0.
Не рассматривайте этот пакет как гаджет write-what-where. Оракулом является ASan WRITE-of-size-12.
Двадцать поисков по исходникам SQLite 3.53.4 после волны FTS5 / session-NPD в 3.53.2. CVE-2026-50812 закрыт (sessionBindRow трактует отсутствующее значение как SQLITE_CORRUPT). Session по-прежнему ключует SessionApplyCtx только по имени таблицы. Второй блок с тем же именем и большим объявленным числом столбцов повторно использует aUpdateMask.
Уже зафиксированные ошибочные пути: считать amalgamation по умолчанию входящим в область (SESSION выключен); повторно подавать CVE-2026-50812; отправлять один блок таблицы с nCol=64 против 2-столбцовой схемы (schemaMismatch, без записи); заявлять RCE из 12-байтового memset.
cd lab
./run.sh
ASan amalgamation из официального zip sqlite-src-3530400. Дополнительный compile -DSQLITE_ENABLE_SESSION -DSQLITE_ENABLE_PREUPDATE_HOOK. Health на 127.0.0.1:18900. Привяжите его к loopback.
SUCCESS sqlite-session-ncol how=asan-heap-write-sessionUpdateFind write-size=12 control-apply-rc=0 SQLITE-SESSION-NCOL-WITNESS
Когда последующий блок таблицы changeset повторно использует имя, пересоберите SessionApplyCtx так, как это уже делается для нового имени: освободите aUpdateMask, повторно выполните sessionTableInfo, откажите при nCol больше, чем в живой схеме. Trunk 3f57024aec / branch-3.53 a1dd7123d8 (2026-08-17) идёт после этого GA.
b09c88c14082339b66c7b7158d609a771e64ca69)sessionChangesetApply :5619, sessionUpdateFind :4381-4412