
SQLite 3.53.4 — высокий — локальный — остаточная привилегия — INSERT SELECT xfer пропускает чтение источника
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · sqlite-xfer-auth
Разбор: https://abraxaslabs.tech/research/sqlite-xfer-auth
Класс: Остаточные привилегии Охват: Локальный
SQLite 3.53.4 (b09c88c, SOURCE_ID 2026-07-24 19:02:57 bf7c7f30031888f4e796e429ab3978879485813aaca6f641c7b33e4e09459bcc) по-прежнему использует быстрый путь xferOptimization для INSERT INTO dest SELECT * FROM src. sqlite3AuthCheck вызывается только для SQLITE_INSERT на dest. Копирование никогда не вызывает sqlite3Select или построчный sqlite3AuthRead на src. SELECT * FROM src запрещён. INSERT SELECT копирует свидетельство. Журнал авторизатора — INSERT:dest.
Авторизатор отключён, если его не установит встраивающее приложение. Это не RCE. DRH расценил Fossil d1cdb817 как функцию 3.54, а не как исправление ошибки в 3.53. 3.54.0 всё ещё в статусе черновика.
| ID | CVE пока нет |
| Класс | Остаточные привилегии (копирование таблицы с запретом READ) |
| Охват | Локальный (встраивающее приложение sqlite3_set_authorizer) |
| CWE | CWE-863 |
| CVSS | Высокий: 7.5 CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N |
| Продукт | SQLite (Hwaci) |
| Затронуто | 3.53.4 (b09c88c14082339b66c7b7158d609a771e64ca69) |
| Auth | локальный SQL против установленного авторизатора, который запрещает READ/SELECT на src и разрешает INSERT на dest |
| Лицензия | GNU Affero GPL v3.0 |
| Лаборатория | только 127.0.0.1:18850 |
Подготовить INSERT INTO dest SELECT * FROM src, когда dest совместим по схеме и INSERT разрешён. Необработанные записи B-tree покидают таблицу-источник с запретом READ и попадают в dest. Простой SELECT * FROM src даёт SQLITE_AUTH. Путь xfer не компилирует SELECT, поэтому SQLITE_SELECT для источника, табличный SQLITE_READ и построчный sqlite3AuthRead никогда не срабатывают.
Требуется встраивающее приложение, которое установило sqlite3_set_authorizer в качестве шлюза ACL для недоверенного SQL / столбцов. В библиотеке по умолчанию этот колбэк равен NULL. Это не RCE.
Та же охота на Crit/High в 3.53.4, что и для других остаточных проблем в этом GA. Авторизатор документирован в sqlite3_set_authorizer. Авторизация INSERT выполняется только для таблицы dest (insert.c:969). xfer выбирается до sqlite3Select() (insert.c:1020-1038). xferOptimization копирует записи. Grep по insert.c на этой фиксации: один sqlite3AuthCheck, ни одного sqlite3AuthRead. SQLITE_OMIT_XFER_OPT не является флагом сборки по умолчанию.
Форум 2026-05-21T03:31:22Z. Trunk d1cdb817cafd03a4 — только для 3.54. DRH: новая функция, в branch-3.53 не пойдёт.
cd lab
./run.sh
Собирает amalgamation 3.53.4 плюс lab/xfer_auth.c. Компонует sqlite-xfer-auth. Привязывает 127.0.0.1:18850. Оракул — это JSON от внутрипроцессного авторизатора: SELECT * FROM src запрещён; INSERT INTO dest SELECT * FROM src разрешён; в dest есть SQLITE-XFER-AUTH-WITNESS; действия вставки — только INSERT:dest.
SUCCESS sqlite-xfer-auth how=xfer-opt-skip-src-read select-src=denied insert-select=ok dest-has-witness=yes SQLITE-XFER-AUTH-WITNESS
Авторизуйте источник так, как это делает 3.54 d1cdb817: если зарегистрирован авторизатор, xferOptimization должен выполнить sqlite3AuthCheck SELECT/READ для src (или отказаться от быстрого пути и перейти к sqlite3Select). До тех пор встраивающие приложения, которые запрещают READ на таблице, всё ещё должны запрещать INSERT в любой совместимый dest, либо компилироваться с -DSQLITE_OMIT_XFER_OPT.
b09c88c14082339b66c7b7158d609a771e64ca69)src/insert.c sqlite3AuthCheck INSERT dest, xferOptimization перед sqlite3Select