
SQLite 3.53.4 — высокий — локальный — сбой — цепочка COLLATE обходит SQLITE_LIMIT_EXPR_DEPTH
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · sqlite-collate-depth
Разбор: https://abraxaslabs.tech/research/sqlite-collate-depth
Класс: Crash Доступ: Локальный
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 не продемонстрирован) |
| Доступ | Локальный (недоверенный 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). Скомпонуйте 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