
SQLite 3.53.4 — высокий — локальный — сбой — цепочка COLLATE обходит SQLITE_LIMIT_EXPR_DEPTH
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · sqlite-collate-depth
Класс: Crash Доступ: Local
SQLite 3.53.4 (b09c88c14082339b66c7b7158d609a771e64ca69, SOURCE_ID 2026-07-24 19:02:57 bf7c7f30031888f4e796e429ab3978879485813aaca6f641c7b33e4e09459bcc) - Hwaci
Грамматическое действие COLLATE никогда не вызывает sqlite3ExprCheckHeight. sqlite3ExprAddCollateToken выделяет узел TK_COLLATE с nHeight, всё ещё равным 1, а затем подвешивает предыдущее выражение к pLeft. Обычные операторы проходят через sqlite3PExpr и получают задокументированный SQLITE_LIMIT_EXPR_DEPTH (по умолчанию 1000). Этот оператор — нет.
Обходчик по-прежнему рекурсивно обрабатывает каждый pLeft. EP_Skip предназначен для affinity, а не для sqlite3WalkExprNN. Цепочка из 50 узлов возвращает 1. То же самое для 8k и 40k — за пределами лимита глубины. 120k приводит к переполнению стека ASan в sqlite3WalkExprNN (rc=134). Не RCE.
Каноническое дерево — https://sqlite.org/src. GitHub sqlite/sqlite — это зеркало Fossil. Официальный zip sqlite-src-3530400. Библиотека в общественном достоянии. Этот пакет — AGPLv3.
| ID | CVE пока нет |
| Класс | Crash (переполнение стека ASan в sqlite3WalkExprNN; RCE не продемонстрирован) |
| Доступ | Local (недоверенный SQL или внедрённое VIEW) |
| CWE | CWE-674, CWE-770 |
| CVSS | High: 7.5 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H |
| Продукт | SQLite 3.53.4 |
| Затронуто | 3.53.4 (b09c88c); остаток от более поздней проверки высоты COLLATE в trunk |
| Аутентификация | недоверенный SQL или VIEW; load_extension по умолчанию остаётся выключенным |
| Лицензия | GNU Affero GPL v3.0 |
| Лаборатория | только 127.0.0.1:18800. ASan-амальгама. Свидетельство краха. |
Подать длинную постфиксную цепочку COLLATE BINARY в виде SQL или внедрить её в VIEW внутри недоверенного .db. Процесс-хост обходит цепочку и умирает на стеке C. Задокументированный лимит глубины выражений никогда не срабатывает для этого оператора.
SELECT 1 COLLATE BINARY COLLATE BINARY ... достаточно. Та же форма в CREATE VIEW v AS SELECT 1 COLLATE BINARY ..., затем SELECT * FROM v на новом соединении. Значение по умолчанию SQLITE_LIMIT_SQL_LENGTH (1e9) удерживает цепочку ~1.8 МБ, которая переполнила 8 МБ стек в этой лаборатории.
Это крах процесса-встраивателя. Это не контроль над указателем инструкций. load_extension остаётся выключенным.
Двадцать поисков по исходникам тега SQLite version-3.53.4 после OpenLiteSpeed. Последний GA, а не черновик 3.54.0. sqlite.org/security.html рассматривает недоверенный SQL и недоверенный .db как первостепенные. load_extension по умолчанию выключен.
parse.y для COLLATE — три строки:
expr(A) ::= expr(A) COLLATE ids(C). {
A = sqlite3ExprAddCollateToken(pParse, A, &C, 1);
}
sqlite3ExprAddCollateToken устанавливает pNew->pLeft = pExpr и EP_Collate|EP_Skip. sqlite3ExprAlloc оставил nHeight = 1. Никакого sqlite3ExprCheckHeight. sqlite3PExpr делает и то, и другое для любого другого бинарного оператора.
Ошибочные пути: считать 8k COLLATE крахом (он вернул 1); считать 40k крахом (он тоже вернул 1, далеко за SQLITE_LIMIT_EXPR_DEPTH 1000); потребовалось 120k, прежде чем ASan умер в sqlite3WalkExprNN.
Это G1 из четырнадцати остатков на пине. Родственные — в других постах.
cd lab
./run.sh
ASan-амальгама из официального sqlite-src-3530400 (резервный клон тега version-3.53.4). Compose sqlite-collate-depth. Фиктивный HTTP на 127.0.0.1:18800. Привяжите его к loopback.
SUCCESS sqlite-collate-depth how=asan-stack-overflow control=50 crash-n=120000 SQLITE-COLLATE-DEPTH-WITNESS
50 COLLATE возвращает 1. 8k и 40k тоже возвращают 1. 120k умирает rc=134, переполнение стека ASan в sqlite3WalkExprNN. Проверка пина — SELECT sqlite_version() / SELECT sqlite_source_id().
Вызвать sqlite3ExprCheckHeight для узла COLLATE после присоединения pLeft, как это уже делает sqlite3PExpr. Пересчитать nHeight от дочернего элемента. Постфиксный оператор — это всё ещё дерево выражений.
Trunk 252c0b7bf5 (2026-10-04) идёт после этого GA.
b09c88c14082339b66c7b7158d609a771e64ca69)src/parse.y действие COLLATEsrc/expr.c sqlite3ExprAddCollateToken, sqlite3ExprAlloc (nHeight = 1), sqlite3PExpr / sqlite3ExprCheckHeightsrc/walker.c sqlite3WalkExprNNsrc/sqliteLimit.h SQLITE_MAX_EXPR_DEPTH по умолчанию 1000