Skip to content
KitploitKITPLOIT
HerramientasExploitsBlog
Log in
Enviar
HerramientasExploitsBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

FeedsContactoPrivacidad© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
sqlite-values-union — SQLite 3.53.4 - Alta - Local - Crash - VALUES UNION ALL fallback cleanup stack overflow | Kitploit
Herramientas/GitHubGitHub/abraxas/sqlite-values-union
Análisis de VulnerabilidadesExplotaciónFuzzingAnálisis de BinariosPapers e InvestigaciónSeguridad de Bases de DatosLabs y Práctica
GitHubabraxas/sqlite-values-union

sqlite-values-union

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

Ver Repositorio
hace 5 díasAún no revisado

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir

Abraxas Labs - sqlite-values-union

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

sqlite-values-union

Clase: Crash Alcance: Local

SQLite 3.53.4 (b09c88c) - Hwaci

El VALUES por defecto usa una co-rutina. WITH (o la recarga del esquema, o una fila no constante) fuerza a sqlite3MultiValues a usar UNION ALL. La longitud del SELECT compuesto se omite cuando SF_Values está establecido (parse.y:562-567). Una lista de filas lo suficientemente grande es entonces rechazada por SQLITE_LIMIT_EXPR_DEPTH, y el sqlite3ExprDeleteNN recursivo revienta la pila de C en la ruta de limpieza de errores.

Un VALUES simple de 5000 filas está bien. WITH más 1000 filas da error limpiamente (Expression tree is too large). WITH más 300000 filas es un desbordamiento de pila de ASan en sqlite3ExprDeleteNN (rc=134). No es RCE.

IDaún sin CVE
ClaseCrash (desbordamiento de pila de ASan en ExprDelete; no se ha demostrado RCE)
AlcanceLocal (SQL no confiable, o 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
ProductoSQLite
Afectado3.53.4 (b09c88c14082339b66c7b7158d609a771e64ca69, SOURCE_ID 2026-07-24 19:02:57 bf7c7f30031888f4e796e429ab3978879485813aaca6f641c7b33e4e09459bcc). Residuo del límite posterior de VALUES compuestos en el trunk.
AuthSQL del atacante, o un esquema plantado que toma el fallback a UNION ALL
LicenciaGNU Affero GPL v3.0
LabSolo 127.0.0.1:18820. Amalgama con ASan. Testigo del crash.

Qué puede hacer un atacante

Introducir SQL no confiable que un host vaya a preparar. Prefijar una lista enorme de VALUES con WITH para que la ruta de la co-rutina quede desactivada. Se supone que el parseo debe fallar con un error de profundidad de expresión. La limpieza de ese árbol recurre en sqlite3ExprDeleteNN hasta que el proceso muere.

El mismo fallback se dispara cuando VALUES vive en una VIEW o TRIGGER (db->init.busy). El host es el embedder: un CLI, una app que prepara SQL del atacante, un servicio que abre un .db hostil. SQLite no evalúa los bytes de VALUES como código. El crash es el hallazgo.

Cómo lo encontré

Veinte búsquedas en el código fuente de github.com/sqlite/sqlite etiqueta version-3.53.4. La lista de descartes ya había cerrado CVE-2026-11824, session NPD, concat_ws, LOOKASIDE, JSON UAF, WAL-reset. El load_extension por defecto está desactivado. El residuo del parser/VDBE era esta omisión de VALUES UNION ALL más un destructor 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() recorre pPrior de forma iterativa. sqlite3ExprDeleteNN() sigue recurriendo sobre pRight y sobre pLeft cuando EP_Static está establecido.

Caminos equivocados: 1000 filas con WITH dan error limpiamente en el límite de profundidad documentado y no provocan crash; se necesitaban 300000 filas para que la profundidad del destructor reventara la pila de C de 8 MiB. El VALUES simple se mantiene en la co-rutina y es el control negativo.

Lab

cd lab
./run.sh

Zip canónico del código fuente 3.53.4, sqlite3 con ASan. Compose sqlite-values-union. Publicado en 127.0.0.1:18820. Enlázalo a 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

La solución

Aplicar SQLITE_LIMIT_COMPOUND_SELECT a VALUES de la misma forma en que se limitan otros compuestos. Recorrer la cadena UNION ALL de forma iterativa al eliminar, o limitar EXPR_DEPTH antes de que se construya el árbol para que la limpieza no pueda recurrir fuera de la pila de C. El trunk posterior (Bug 2026-10-04T05:34:47Z) es posterior a esta GA.

Referencias

  • sqlite.org/src etiqueta version-3.53.4 (b09c88c14082339b66c7b7158d609a771e64ca69)
  • SOURCE_ID 2026-07-24 19:02:57 bf7c7f30031888f4e796e429ab3978879485813aaca6f641c7b33e4e09459bcc
  • src/parse.y:562-567 omisión del SELECT compuesto cuando SF_Values está establecido
  • src/insert.c:681-704 fallback a UNION ALL de sqlite3MultiValues
  • src/expr.c:1406-1430 sqlite3ExprDeleteNN recursivo
  • sqlite.org/cves.html · sqlite.org/security.html
Descargar herramienta