
SQLite 3.53.4 — высокий — локальный — остаточная привилегия — INSERT SELECT xfer пропускает чтение источника
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · 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 | High: 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 против установленного авторизатора, который DENY 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
Собирает амальгамацию 3.53.4 плюс lab/xfer_auth.c. Compose sqlite-xfer-auth. Bind 127.0.0.1:18850. Оракул — JSON от внутрипроцессного авторизатора: SELECT * FROM src запрещён; INSERT INTO dest SELECT * FROM src ok; в 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
Авторизовать источник так, как это делает d1cdb817 в 3.54: если авторизатор зарегистрирован, xferOptimization должен выполнять sqlite3AuthCheck для SELECT/READ на src (или отказаться от быстрого пути и перейти к sqlite3Select). До тех пор встраивающие приложения, которые DENY READ на таблице, всё ещё должны DENY INSERT в любой совместимый dest или компилироваться с -DSQLITE_OMIT_XFER_OPT.
b09c88c14082339b66c7b7158d609a771e64ca69)src/insert.c sqlite3AuthCheck INSERT dest, xferOptimization до sqlite3Select