
SQLite 3.53.4 - Alta - Local - Crash - CTEs aninhadas ignoram o limite de profundidade de visualização nNestSel
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · sqlite-cte-nest
Classe: Crash Alcance: Local
SQLite 3.53.4 (b09c88c14082339b66c7b7158d609a771e64ca69, SOURCE_ID 2026-07-24 19:02:57 bf7c7f30031888f4e796e429ab3978879485813aaca6f641c7b33e4e09459bcc) - Hwaci
sqlite3ResultSetOfSelect incrementa nNestSel e emite o erro VIEWs and/or subqueries nested too deep quando a cadeia atinge SQLITE_LIMIT_EXPR_DEPTH. VIEWs aninhadas nesta versão já atingem esse limite. A anexação de CTE em select.c:5754 (sqlite3SrcItemAttachSubquery) não incrementa nNestSel. selectExpander / sqlite3WalkSelect então recursam a cadeia de CTEs até a pilha C morrer.
Uma cadeia pequena de CTEs retorna uma linha. FROM aninhado em N=25000 é um Recursion limit do parser e não causa crash. VIEWs aninhadas em .limit expr_depth 20 emitem erro too-deep. CTE N=25000 é stack-overflow no ASan. Não é RCE.
| ID | sem CVE ainda |
| Classe | Crash (stack-overflow no ASan em selectExpander; RCE não demonstrado) |
| Alcance | Local (SQL não confiável ou schema com CTE aninhada) |
| 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 |
| Produto | SQLite (espelho no GitHub sqlite/sqlite) |
| Afetado | 3.53.4 (b09c88c); resquício do nNestSel de CTE do trunk posterior |
| Auth | SQL não confiável ou uma cadeia WITH plantada |
| Licença | GNU Affero GPL v3.0 |
| Lab | Apenas 127.0.0.1:18810. Amalgamação ASan. Testemunha de crash. |
Fornecer uma cadeia longa de CTEs, como SQL ou como corpo de VIEW em um .db não confiável:
WITH c0 AS (SELECT 1),
c1 AS (SELECT * FROM c0),
...
cN AS (SELECT * FROM cN-1)
SELECT * FROM cN;
selectExpander percorre cada CTE como uma subquery FROM aninhada. nNestSel nunca se move. O processo hospedeiro morre na pilha C. VIEWs aninhadas já estão limitadas. FROM aninhado atinge o limite de recursão do parser. Este resquício é o caminho de anexação de CTE. O SQLite não avalia os nomes das CTEs em um shell. Crash, não RCE.
Vinte buscas no código-fonte de https://github.com/sqlite/sqlite tag https://github.com/sqlite/sqlite/releases/tag/version-3.53.4. VIEWs aninhadas estavam limitadas nesta versão (3f3fb9b638 / branch-3.53 38430aa5ed, 2026-06-16). A anexação de CTE não estava. O trunk f547308713 (2026-10-05) é posterior a este GA.
Caminhos errados já registrados: tratar VIEWs aninhadas como o crash (elas emitem erro too-deep); tratar FROM aninhado N=25000 como o crash (Recursion limit do parser); tomar uma cadeia de 5 CTEs como prova de que o limite se aplica.
cd lab
./run.sh
Zip oficial sqlite-src-3530400, amalgamação ASan, compose sqlite-cte-nest, publicado em 127.0.0.1:18810. Vincule-o ao loopback. Não aponte isto para o SQLite de outra pessoa.
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 na anexação de CTE da mesma forma que sqlite3ResultSetOfSelect já faz para VIEWs, e emitir erro em SQLITE_LIMIT_EXPR_DEPTH. O trunk f547308713 (2026-10-05, "Limit the depth of recursion for CTEs using SQLITE_LIMIT_EXPR_DEPTH") é esse tipo de patch. Ele não está na 3.53.4.
b09c88c14082339b66c7b7158d609a771e64ca69)2026-07-24 19:02:57 bf7c7f30031888f4e796e429ab3978879485813aaca6f641c7b33e4e09459bccsrc/select.c sqlite3ResultSetOfSelect (nNestSel++), anexação de CTE :5754src/walker.c sqlite3WalkSelectFrom percurso de subqueryselectExpander / sqlite3SelectExpand2026-10-04T04:58:58Z; trunk f547308713