
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
Análisis: https://abraxaslabs.tech/research/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.
| ID | aún sin CVE |
| Clase | Crash (desbordamiento de pila en 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. |
| Autenticación | SQL del atacante, o un esquema plantado que toma la ruta alternativa UNION ALL |
| Licencia | GNU Affero GPL v3.0 |
| Laboratorio | solo 127.0.0.1:18820. Amalgama con ASan. Testigo del crash. |
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.
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.
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
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.
b09c88c14082339b66c7b7158d609a771e64ca69)2026-07-24 19:02:57 bf7c7f30031888f4e796e429ab3978879485813aaca6f641c7b33e4e09459bccsrc/parse.y:562-567 omisión de compound-SELECT cuando SF_Values está establecidosrc/insert.c:681-704 fallback UNION ALL de sqlite3MultiValuessrc/expr.c:1406-1430 sqlite3ExprDeleteNN recursivo