
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
Clase: Crash Alcance: Local
SQLite 3.53.4 (b09c88c14082339b66c7b7158d609a771e64ca69, SOURCE_ID 2026-07-24 19:02:57 bf7c7f30031888f4e796e429ab3978879485813aaca6f641c7b33e4e09459bcc) - Hwaci
sqlite3ResultSetOfSelect incrementa nNestSel y da error VIEWs and/or subqueries nested too deep cuando la cadena alcanza SQLITE_LIMIT_EXPR_DEPTH. Las VIEWs anidadas en este pin ya alcanzan ese límite. El attach de CTE en select.c:5754 (sqlite3SrcItemAttachSubquery) no incrementa nNestSel. selectExpander / sqlite3WalkSelect entonces recursan la cadena de CTE hasta que la pila de C muere.
Una cadena de CTE pequeña devuelve una fila. El FROM anidado en N=25000 es un Recursion limit del parser y no provoca crash. Las VIEWs anidadas con .limit expr_depth 20 dan error too-deep. CTE N=25000 es ASan stack-overflow. No es RCE.
| ID | sin CVE todavía |
| Clase | Crash (ASan stack-overflow en selectExpander; RCE no demostrado) |
| Alcance | Local (SQL no confiable o esquema de CTE anidado) |
| 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 |
| Auth | SQL no confiable o una cadena WITH plantada |
| Licencia | GNU Affero GPL v3.0 |
| Lab | solo 127.0.0.1:18810. Amalgama ASan. Testigo de crash. |
Alimentar una cadena larga de CTE, 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 de C. Las VIEWs anidadas ya están limitadas. El FROM anidado alcanza el límite de recursión del parser. Este remanente es la ruta de attach de CTE. SQLite no evalúa los nombres de CTE en un shell. Crash, no RCE.
Veinte búsquedas en el código fuente de https://github.com/sqlite/sqlite tag https://github.com/sqlite/sqlite/releases/tag/version-3.53.4. Las VIEWs anidadas estaban limitadas en este pin (3f3fb9b638 / branch-3.53 38430aa5ed, 2026-06-16). El attach de CTE no lo estaba. El trunk f547308713 (2026-10-05) es posterior a este GA.
Caminos equivocados ya registrados: tratar las VIEWs anidadas como el crash (dan error too-deep); tratar el FROM anidado N=25000 como el crash (Recursion limit del parser); tomar una cadena de 5 CTE como prueba de que el límite aplica.
cd lab
./run.sh
Zip oficial sqlite-src-3530400, amalgama ASan, compose sqlite-cte-nest, publicado en 127.0.0.1:18810. Enlázalo a loopback. No apuntes esto al SQLite de otra persona.
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 en el attach de CTE tal como sqlite3ResultSetOfSelect ya lo hace para las VIEWs, y dar 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++), attach de CTE :5754src/walker.c sqlite3WalkSelectFrom recorrido de subconsultaselectExpander / sqlite3SelectExpand2026-10-04T04:58:58Z; trunk f547308713