Skip to content
KitploitKITPLOIT
FerramentasExploitsBlog
Log in
Enviar
FerramentasExploitsBlog
Enviar

Ferramentas de Hacking, PenTest e Cibersegurança para o seu Arsenal de Segurança!

Kitploit é um diretório de ferramentas de hacking, cibersegurança e pentesting. Descubra as últimas atualizações de projetos para encontrar vulnerabilidades, analisar sistemas, automatizar testes e fortalecer sua segurança.

FeedsContatoPrivacidade© 2026 Kitploit

Diretório de Ferramentas

Categorias

Ver todas as categorias
Loading categories
sqlite-values-union — SQLite 3.53.4 - Alta - Local - Crash - VALUES UNION ALL fallback cleanup stack overflow | Kitploit
Ferramentas/GitHubGitHub/abraxas/sqlite-values-union
Análise de VulnerabilidadesExploraçãoFuzzingAnálise de BináriosPapers e PesquisaSegurança de Banco de DadosLabs e Prática
GitHubabraxas/sqlite-values-union

sqlite-values-union

SQLite 3.53.4 - Alta - Local - Crash - VALUES UNION ALL fallback cleanup stack overflow

Ver Repositório
17há 6 diasAinda não revisado

Mais Populares

Ver todos →

Descubra as ferramentas mais usadas pela nossa comunidade.

Explore todas as ferramentas

Navegue pela nossa coleção de ferramentas

Ver todas as ferramentas →
Compartilhar

Abraxas Labs - sqlite-values-union

abraxaslabs.tech  ·  github.com/abraxas  ·  @abraxas_null  ·  [email protected]  ·  sqlite-values-union

Write-up: https://abraxaslabs.tech/research/sqlite-values-union

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.

IDainda sem CVE
ClasseCrash (stack-overflow do ASan em ExprDelete; RCE não demonstrado)
AlcanceLocal (SQL não confiável, ou VALUES dentro de VIEW/TRIGGER)
CWECWE-674
CVSSAlto: 7.5 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H
ProdutoSQLite
Afetado3.53.4 (b09c88c14082339b66c7b7158d609a771e64ca69, SOURCE_ID 2026-07-24 19:02:57 bf7c7f30031888f4e796e429ab3978879485813aaca6f641c7b33e4e09459bcc). Resquício do limite posterior de VALUES compostos no trunk.
AutenticaçãoSQL do atacante, ou um schema plantado que aciona o fallback UNION ALL
LicençaGNU Affero GPL v3.0
Labapenas 127.0.0.1:18820. Amalgamação ASan. Testemunha de crash.

O que um atacante pode fazer

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.

Como eu encontrei

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.

Lab

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

A correção

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.

Referências

  • sqlite.org/src tag version-3.53.4 (b09c88c14082339b66c7b7158d609a771e64ca69)
  • SOURCE_ID 2026-07-24 19:02:57 bf7c7f30031888f4e796e429ab3978879485813aaca6f641c7b33e4e09459bcc
  • src/parse.y:562-567 salto de compound-SELECT quando SF_Values está definido
  • src/insert.c:681-704 fallback UNION ALL de sqlite3MultiValues
  • src/expr.c:1406-1430 sqlite3ExprDeleteNN recursivo
  • sqlite.org/cves.html · sqlite.org/security.html
Baixar ferramenta