
SQLite 3.53.4 - Alta - Local - Crash - COLLATE chain skips SQLITE_LIMIT_EXPR_DEPTH
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · sqlite-collate-depth
Classe: Crash Alcance: Local
SQLite 3.53.4 (b09c88c14082339b66c7b7158d609a771e64ca69, SOURCE_ID 2026-07-24 19:02:57 bf7c7f30031888f4e796e429ab3978879485813aaca6f641c7b33e4e09459bcc) - Hwaci
A ação gramatical COLLATE nunca chama sqlite3ExprCheckHeight. sqlite3ExprAddCollateToken aloca um nó TK_COLLATE com nHeight ainda em 1, e então pendura a expressão anterior em pLeft. Operadores comuns passam por sqlite3PExpr e recebem o SQLITE_LIMIT_EXPR_DEPTH documentado (padrão 1000). Este operador não.
O walker ainda recursa em cada pLeft. EP_Skip é para afinidade, não para sqlite3WalkExprNN. Uma cadeia de 50 nós retorna 1. Assim como 8k e 40k, além do limite de profundidade. 120k causa stack-overflow no ASan em sqlite3WalkExprNN (rc=134). Não é RCE.
A árvore canônica é https://sqlite.org/src. O GitHub sqlite/sqlite é um espelho Fossil. Zip oficial sqlite-src-3530400. Biblioteca de domínio público. Este pacote é AGPLv3.
| ID | sem CVE ainda |
| Classe | Crash (stack-overflow no ASan em sqlite3WalkExprNN; RCE não demonstrado) |
| Alcance | Local (SQL não confiável ou uma VIEW plantada) |
| CWE | CWE-674, CWE-770 |
| CVSS | Alto: 7.5 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H |
| Produto | SQLite 3.53.4 |
| Afetado | 3.53.4 (b09c88c); resquício da verificação de altura de COLLATE do trunk posterior |
| Auth | SQL não confiável ou VIEW; load_extension padrão permanece desativado |
| Licença | GNU Affero GPL v3.0 |
| Lab | Apenas 127.0.0.1:18800. Amalgamação ASan. Testemunha de crash. |
Alimente uma longa cadeia pós-fixa COLLATE BINARY como SQL, ou plante-a em uma VIEW dentro de um .db não confiável. O processo hospedeiro percorre a cadeia e morre na pilha C. O limite documentado de profundidade de expressão nunca é executado neste operador.
SELECT 1 COLLATE BINARY COLLATE BINARY ... é suficiente. Mesma forma em CREATE VIEW v AS SELECT 1 COLLATE BINARY ... e então SELECT * FROM v em uma nova conexão. O SQLITE_LIMIT_SQL_LENGTH padrão (1e9) comporta a cadeia de ~1,8 MB que estourou uma pilha de 8 MB neste lab.
Isto é um crash do processo embutidor. Não é controle de ponteiro de instrução. load_extension permanece desativado.
Vinte caçadas ao código-fonte da tag version-3.53.4 do SQLite após o OpenLiteSpeed. Última GA, não o rascunho 3.54.0. sqlite.org/security.html trata SQL não confiável e .db não confiável como cidadãos de primeira classe. load_extension padrão está desativado.
parse.y para COLLATE tem três linhas:
expr(A) ::= expr(A) COLLATE ids(C). {
A = sqlite3ExprAddCollateToken(pParse, A, &C, 1);
}
sqlite3ExprAddCollateToken define pNew->pLeft = pExpr e EP_Collate|EP_Skip. sqlite3ExprAlloc deixou nHeight = 1. Sem sqlite3ExprCheckHeight. sqlite3PExpr faz ambas as coisas para todos os outros operadores binários.
Caminhos errados: tratar 8k COLLATE como o crash (retornou 1); tratar 40k como o crash (também retornou 1, bem além do SQLITE_LIMIT_EXPR_DEPTH 1000); precisar de 120k antes do ASan morrer em sqlite3WalkExprNN.
Este é o G1 de quatorze resquícios no pin. Os irmãos são outros posts.
cd lab
./run.sh
Amalgamação ASan do sqlite-src-3530400 oficial (clone de fallback da tag version-3.53.4). Compose sqlite-collate-depth. HTTP dummy em 127.0.0.1:18800. Vincule ao loopback.
SUCCESS sqlite-collate-depth how=asan-stack-overflow control=50 crash-n=120000 SQLITE-COLLATE-DEPTH-WITNESS
50 COLLATE retorna 1. 8k e 40k também retornam 1. 120k morre rc=134, stack-overflow no ASan em sqlite3WalkExprNN. A verificação de pin é SELECT sqlite_version() / SELECT sqlite_source_id().
Chame sqlite3ExprCheckHeight no nó COLLATE após anexar pLeft, da forma como sqlite3PExpr já faz. Recalcule nHeight a partir do filho. Um operador pós-fixo ainda é uma árvore de expressão.
O trunk 252c0b7bf5 (2026-10-04) é posterior a esta GA.
b09c88c14082339b66c7b7158d609a771e64ca69)src/parse.y ação COLLATEsrc/expr.c sqlite3ExprAddCollateToken, sqlite3ExprAlloc (nHeight = 1), sqlite3PExpr / sqlite3ExprCheckHeightsrc/walker.c sqlite3WalkExprNNsrc/sqliteLimit.h SQLITE_MAX_EXPR_DEPTH padrão 1000