
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
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 recursivo sqlite3ExprDeleteNN estoura a pilha C no caminho de limpeza de erro.
VALUES simples de 5000 linhas está ok. WITH mais 1000 linhas dá erro limpo (Expression tree is too large). WITH mais 300000 linhas é 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 composto no trunk. |
| Auth | SQL do atacante, ou um schema plantado que usa 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 que o caminho da co-rotina seja desativado. O parse deveria falhar com um erro de profundidade de expressão. A limpeza dessa árvore recursa em sqlite3ExprDeleteNN até o processo morrer.
O mesmo fallback dispara 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 tag version-3.53.4. A lista de exclusão já fechou CVE-2026-11824, session NPD, concat_ws, LOOKASIDE, JSON UAF, WAL-reset. O load_extension padrão está desligado. O resquício do parser/VDBE era esse 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 recursa em pRight e em pLeft quando EP_Static está definido.
Caminhos errados: 1000 linhas com WITH dão erro limpo no limite de profundidade documentado e não causam crash; foram necessárias 300000 linhas para que a profundidade do destrutor estourasse a pilha C de 8 MiB. VALUES simples permanece na co-rotina e é o controle negativo.
cd lab
./run.sh
Zip canônico do código-fonte 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
Aplique SQLITE_LIMIT_COMPOUND_SELECT a VALUES da mesma forma que outros compostos são limitados. Percorra a cadeia UNION ALL iterativamente na exclusão, ou limite EXPR_DEPTH antes que a árvore seja construída para que a limpeza não possa recursar além da pilha C. O trunk posterior (Bug 2026-10-04T05:34:47Z) é posterior a este GA.
b09c88c14082339b66c7b7158d609a771e64ca69)2026-07-24 19:02:57 bf7c7f30031888f4e796e429ab3978879485813aaca6f641c7b33e4e09459bccsrc/parse.y:562-567 skip de SELECT composto quando SF_Values está definidosrc/insert.c:681-704 fallback UNION ALL de sqlite3MultiValuessrc/expr.c:1406-1430 sqlite3ExprDeleteNN recursivo