
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
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.
| ID | aún sin CVE |
| Clase | Crash (desbordamiento de pila de ASan en ExprDelete; no se ha demostrado RCE) |
| Alcance | Local (SQL no confiable, o 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 |
| Producto | SQLite |
| Afectado | 3.53.4 (b09c88c14082339b66c7b7158d609a771e64ca69, SOURCE_ID 2026-07-24 19:02:57 bf7c7f30031888f4e796e429ab3978879485813aaca6f641c7b33e4e09459bcc). Residuo del límite posterior de VALUES compuestos en el trunk. |
| Auth | SQL del atacante, o un esquema plantado que toma el fallback a UNION ALL |
| Licencia | GNU Affero GPL v3.0 |
| Lab | Solo 127.0.0.1:18820. Amalgama con ASan. Testigo del crash. |
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.
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.
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
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.
b09c88c14082339b66c7b7158d609a771e64ca69)2026-07-24 19:02:57 bf7c7f30031888f4e796e429ab3978879485813aaca6f641c7b33e4e09459bccsrc/parse.y:562-567 omisión del SELECT compuesto cuando SF_Values está establecidosrc/insert.c:681-704 fallback a UNION ALL de sqlite3MultiValuessrc/expr.c:1406-1430 sqlite3ExprDeleteNN recursivo