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
17hace 6 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

Análisis: https://abraxaslabs.tech/research/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 una recarga de esquema, o una fila no constante) fuerza a sqlite3MultiValues a usar UNION ALL. La longitud del SELECT compuesto se omite cuando SF_Values está activado (parse.y:562-567). Una lista de filas suficientemente grande es entonces rechazada por SQLITE_LIMIT_EXPR_DEPTH, y el sqlite3ExprDeleteNN recursivo desborda la pila de C en la ruta de limpieza de errores.

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

IDaún sin CVE
ClaseCrash (desbordamiento de pila en 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.
AutenticaciónSQL del atacante, o un esquema plantado que toma la ruta alternativa UNION ALL
LicenciaGNU Affero GPL v3.0
Laboratoriosolo 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. Anteponer WITH a una lista VALUES enorme para desactivar la ruta de la co-rutina. Se supone que el análisis sintáctico falla con un error de profundidad de expresión. La limpieza de ese árbol recurre en sqlite3ExprDeleteNN hasta que el proceso muere.

La misma ruta alternativa se activa cuando VALUES reside en una VIEW o TRIGGER (db->init.busy). El host es el embedder: una CLI, una aplicación 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 en la etiqueta version-3.53.4. La lista de omisión ya había cerrado CVE-2026-11824, NPD de sesión, concat_ws, LOOKASIDE, UAF de JSON, restablecimiento de WAL. 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 erróneos: 1000 filas con WITH fallan limpiamente en el límite de profundidad documentado y no provocan un crash; se necesitaron 300000 filas para que la profundidad del destructor desborde la pila C de 8 MiB. Un VALUES simple permanece en la co-rutina y es el control negativo.

Laboratorio

cd lab
./run.sh

Zip de origen canónico 3.53.4, sqlite3 con ASan. Compón sqlite-values-union. Publicado en 127.0.0.1:18820. Vincúlalo 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 manera 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 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 de compound-SELECT cuando SF_Values está establecido
  • 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
Descargar herramienta