
SQLite 3.53.4 - Alta - Local - Crash - las CTE anidadas omiten el límite de profundidad de vista nNestSel
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · sqlite-cte-nest
Análisis: https://abraxaslabs.tech/research/sqlite-cte-nest
Clase: Crash Alcance: Local
SQLite 3.53.4 (b09c88c14082339b66c7b7158d609a771e64ca69, SOURCE_ID 2026-07-24 19:02:57 bf7c7f30031888f4e796e429ab3978879485813aaca6f641c7b33e4e09459bcc) - Hwaci
sqlite3ResultSetOfSelect incrementa nNestSel y emite el error VIEWs and/or subqueries nested too deep cuando la cadena alcanza SQLITE_LIMIT_EXPR_DEPTH. Las VIEWs anidadas en esta versión ya alcanzan ese límite. La vinculación de CTE en select.c:5754 (sqlite3SrcItemAttachSubquery) no incrementa nNestSel. selectExpander / sqlite3WalkSelect entonces recurren la cadena de CTE hasta que la pila C muere.
Una cadena de CTE pequeña devuelve una fila. El FROM anidado en N=25000 produce un Recursion limit del parser y no provoca un crash. Las VIEWs anidadas con .limit expr_depth 20 también emiten el error de demasiado profundo. CTE N=25000 es un desbordamiento de pila bajo ASan. No es RCE.
| ID | aún sin CVE |
| Clase | Crash (desbordamiento de pila bajo ASan en selectExpander; RCE no demostrado) |
| Alcance | Local (SQL no confiable o esquema con CTE anidadas) |
| 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 (espejo en GitHub sqlite/sqlite) |
| Afectado | 3.53.4 (b09c88c); remanente del nNestSel de CTE del trunk posterior |
| Autenticación | SQL no confiable o una cadena WITH plantada |
| Licencia | GNU Affero GPL v3.0 |
| Laboratorio | solo 127.0.0.1:18810. Amalgamación ASan. Testigo de crash. |
Introducir una cadena de CTE larga, ya sea como SQL o como cuerpo de una VIEW en un .db no confiable:
WITH c0 AS (SELECT 1),
c1 AS (SELECT * FROM c0),
...
cN AS (SELECT * FROM cN-1)
SELECT * FROM cN;
selectExpander recorre cada CTE como una subconsulta FROM anidada. nNestSel nunca se mueve. El proceso anfitrión muere en la pila C. Las VIEW anidadas ya están limitadas. El FROM anidado alcanza el límite de recursión del analizador. Este remanente es la ruta de adjunción de CTE. SQLite no evalúa los nombres de CTE en un shell. Es un crash, no RCE.
Veinte búsquedas en el código fuente de https://github.com/sqlite/sqlite etiqueta https://github.com/sqlite/sqlite/releases/tag/version-3.53.4. Las VIEW anidadas estaban limitadas en este pin (3f3fb9b638 / branch-3.53 38430aa5ed, 2026-06-16). La adjunción de CTE no lo estaba. El trunk f547308713 (2026-10-05) es posterior a este GA.
Falsos caminos ya registrados: tratar las VIEW anidadas como el crash (dan error de demasiado profundo); tratar el FROM anidado N=25000 como el crash (analizador Recursion limit); tomar una cadena de 5 CTE como prueba de que el límite aplica.
cd lab
./run.sh
Zip oficial sqlite-src-3530400, amalgamación ASan, componer sqlite-cte-nest, publicado en 127.0.0.1:18810. Vincúlalo a loopback. No apuntes esto a la SQLite de nadie más.
SUCCESS sqlite-cte-nest how=asan-stack-overflow crash-n=25000 small-cte=ok nested-views=too-deep nested-from=rejected SQLITE-CTE-NEST-WITNESS
Incrementar nNestSel al adjuntar la CTE de la misma forma en que sqlite3ResultSetOfSelect ya lo hace para las VIEW, y generar un error en SQLITE_LIMIT_EXPR_DEPTH. El trunk f547308713 (2026-10-05, "Limit the depth of recursion for CTEs using SQLITE_LIMIT_EXPR_DEPTH") es ese tipo de parche. No está en 3.53.4.
b09c88c14082339b66c7b7158d609a771e64ca69)2026-07-24 19:02:57 bf7c7f30031888f4e796e429ab3978879485813aaca6f641c7b33e4e09459bccsrc/select.c sqlite3ResultSetOfSelect (nNestSel++), adjunción de CTE :5754src/walker.c recorrido de subconsultas sqlite3WalkSelectFromselectExpander / sqlite3SelectExpand2026-10-04T04:58:58Z; trunk f547308713