
SQLite 3.53.4 - Alta - Local - Crash - VALUES UNION ALL fallback cleanup stack overflow
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · sqlite-values-union
Write-up: https://abraxaslabs.tech/research/sqlite-values-union
Classe: Crash Alcance: Local
SQLite 3.53.4 (b09c88c) - Hwaci
O VALUES padrão usa uma co-rotina. WITH (ou recarga de schema, ou uma linha não constante) força sqlite3MultiValues para UNION ALL. O comprimento do SELECT composto é ignorado quando SF_Values está definido (parse.y:562-567). Uma lista de linhas suficientemente grande é então rejeitada por SQLITE_LIMIT_EXPR_DEPTH, e o sqlite3ExprDeleteNN recursivo estoura a pilha C no caminho de limpeza de erro.
VALUES simples de 5000 linhas funciona bem. WITH mais 1000 linhas gera erro limpo (Expression tree is too large). WITH mais 300000 linhas resulta em stack-overflow do ASan em sqlite3ExprDeleteNN (rc=134). Não é RCE.
| ID | ainda sem CVE |
| Classe | Crash (stack-overflow do ASan em ExprDelete; RCE não demonstrado) |
| Alcance | Local (SQL não confiável, ou VALUES dentro de VIEW/TRIGGER) |
| CWE | CWE-674 |
| 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 |
| Afetado | 3.53.4 (b09c88c14082339b66c7b7158d609a771e64ca69, SOURCE_ID 2026-07-24 19:02:57 bf7c7f30031888f4e796e429ab3978879485813aaca6f641c7b33e4e09459bcc). Resquício do limite posterior de VALUES compostos no trunk. |
| Autenticação | SQL do atacante, ou um schema plantado que aciona o fallback UNION ALL |
| Licença | GNU Affero GPL v3.0 |
| Lab | apenas 127.0.0.1:18820. Amalgamação ASan. Testemunha de crash. |
Fornecer SQL não confiável que um host irá preparar. Prefixar uma lista VALUES enorme com WITH para desativar o caminho da co-rotina. Espera-se que o parse falhe com um erro de profundidade de expressão. A limpeza dessa árvore recorre em sqlite3ExprDeleteNN até o processo morrer.
O mesmo fallback é acionado quando VALUES está em uma VIEW ou TRIGGER (db->init.busy). O host é o embedder: uma CLI, um app que prepara SQL do atacante, um serviço que abre um .db hostil. O SQLite não avalia os bytes de VALUES como código. O crash é o achado.
Vinte buscas no código-fonte de github.com/sqlite/sqlite na tag version-3.53.4. A lista de exclusão já havia fechado CVE-2026-11824, NPD de sessão, concat_ws, LOOKASIDE, UAF de JSON, WAL-reset. O load_extension padrão está desativado. O resquício do parser/VDBE era este skip de VALUES UNION ALL mais um destrutor recursivo.
if( (p->selFlags & (SF_MultiValue|SF_Values))==0
&& (mxSelect = pParse->db->aLimit[SQLITE_LIMIT_COMPOUND_SELECT])>0
&& cnt>mxSelect
){
sqlite3ErrorMsg(pParse, "too many terms in compound SELECT");
}
if( pParse->bHasWith
|| pParse->db->init.busy
|| exprListIsConstant(pParse,pRow)==0
...
){
/* The co-routine method cannot be used. Fall back to UNION ALL. */
...
pSelect->op = TK_ALL;
pSelect->pPrior = pLeft;
}
clearSelect() percorre pPrior iterativamente. sqlite3ExprDeleteNN() ainda recorre em pRight e em pLeft quando EP_Static está definido.
Caminhos errados: 1000 linhas com WITH falham de forma limpa no limite de profundidade documentado e não causam crash; foram necessárias 300000 linhas para que a profundidade do destrutor estoure a pilha C de 8 MiB. VALUES simples permanece na co-rotina e é o controle negativo.
cd lab
./run.sh
Zip de origem canônico 3.53.4, sqlite3 com ASan. Compose sqlite-values-union. Publicado em 127.0.0.1:18820. Vincule-o ao loopback.
SUCCESS sqlite-values-union how=with-values-union-all-fallback-exprdelete rows=300000 crash=asan-stack-overflow plain=5000 depth-error=1000 SQLITE-VALUES-UNION-WITNESS
Aplicar SQLITE_LIMIT_COMPOUND_SELECT a VALUES da mesma forma que outros compostos são limitados. Percorrer a cadeia UNION ALL iterativamente na exclusão, ou limitar EXPR_DEPTH antes da árvore ser construída para que a limpeza não possa recorrer fora da pilha C. O trunk posterior (Bug 2026-10-04T05:34:47Z) é posterior a esta GA.
b09c88c14082339b66c7b7158d609a771e64ca69)2026-07-24 19:02:57 bf7c7f30031888f4e796e429ab3978879485813aaca6f641c7b33e4e09459bccsrc/parse.y:562-567 salto de compound-SELECT quando SF_Values está definidosrc/insert.c:681-704 fallback UNION ALL de sqlite3MultiValuessrc/expr.c:1406-1430 sqlite3ExprDeleteNN recursivo