
SQLite 3.53.4 – Hoch – Lokal – Absturz – verschachtelte CTEs umgehen die nNestSel-View-Tiefenbegrenzung
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · sqlite-cte-nest
Write-up: https://abraxaslabs.tech/research/sqlite-cte-nest
Klasse: Crash Reichweite: Lokal
SQLite 3.53.4 (b09c88c14082339b66c7b7158d609a771e64ca69, SOURCE_ID 2026-07-24 19:02:57 bf7c7f30031888f4e796e429ab3978879485813aaca6f641c7b33e4e09459bcc) - Hwaci
sqlite3ResultSetOfSelect erhöht nNestSel und meldet VIEWs and/or subqueries nested too deep, wenn die Kette SQLITE_LIMIT_EXPR_DEPTH erreicht. Verschachtelte VIEWs stoßen bei diesem Stand bereits an diese Grenze. Das Anhängen von CTEs in select.c:5754 (sqlite3SrcItemAttachSubquery) erhöht nNestSel nicht. selectExpander / sqlite3WalkSelect rekursieren dann durch die CTE-Kette, bis der C-Stack zusammenbricht.
Eine kleine CTE-Kette liefert eine Zeile. Verschachteltes FROM bei N=25000 führt zu einem Parser-Recursion limit und stürzt nicht ab. Verschachtelte VIEWs bei .limit expr_depth 20 melden too-deep. CTE N=25000 ist ein ASan-Stack-Overflow. Kein RCE.
| ID | noch keine CVE |
| Klasse | Crash (ASan-Stack-Overflow in selectExpander; kein nachgewiesener RCE) |
| Reichweite | Lokal (nicht vertrauenswürdiges SQL oder verschachteltes CTE-Schema) |
| CWE | CWE-674 |
| CVSS | Hoch: 7.5 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H |
| Produkt | SQLite (GitHub-Mirror sqlite/sqlite) |
| Betroffen | 3.53.4 (b09c88c); Überbleibsel des späteren Trunk-CTE nNestSel |
| Auth | nicht vertrauenswürdiges SQL oder eine eingeschleuste WITH-Kette |
| Lizenz | GNU Affero GPL v3.0 |
| Lab | nur 127.0.0.1:18810. ASan-Amalgamation. Crash-Nachweis. |
Eine lange CTE-Kette einspeisen, als SQL oder als VIEW-Body in einer nicht vertrauenswürdigen .db:
WITH c0 AS (SELECT 1),
c1 AS (SELECT * FROM c0),
...
cN AS (SELECT * FROM cN-1)
SELECT * FROM cN;
selectExpander durchläuft jeden CTE als verschachtelte FROM-Unterabfrage. nNestSel bewegt sich nie. Der Hostprozess stirbt auf dem C-Stack. Verschachtelte VIEWs sind bereits begrenzt. Verschachteltes FROM erreicht das Rekursionslimit des Parsers. Dieser Rest ist der CTE-Attach-Pfad. SQLite wertet die CTE-Namen nicht in einer Shell aus. Absturz, kein RCE.
Zwanzig Quellcode-Durchsuchungen von https://github.com/sqlite/sqlite Tag https://github.com/sqlite/sqlite/releases/tag/version-3.53.4. Verschachtelte VIEWs waren auf diesem Pin begrenzt (3f3fb9b638 / branch-3.53 38430aa5ed, 2026-06-16). CTE-Attach war es nicht. Trunk f547308713 (2026-10-05) liegt nach diesem GA.
Bereits dokumentierte Irrwege: verschachtelte VIEWs als den Absturz zu behandeln (sie melden too-deep); verschachteltes FROM N=25000 als den Absturz zu behandeln (Parser Recursion limit); eine 5-CTE-Kette als Beweis dafür zu nehmen, dass die Begrenzung greift.
cd lab
./run.sh
Offizielles sqlite-src-3530400-Zip, ASan-Amalgamation, Compose sqlite-cte-nest, veröffentlicht 127.0.0.1:18810. Binde es an Loopback. Richte dies nicht auf das SQLite von jemand anderem.
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
nNestSel beim CTE-Attach inkrementieren, so wie es sqlite3ResultSetOfSelect bereits für VIEWs tut, und bei SQLITE_LIMIT_EXPR_DEPTH einen Fehler ausgeben. Trunk f547308713 (2026-10-05, „Limit the depth of recursion for CTEs using SQLITE_LIMIT_EXPR_DEPTH") ist diese Art von Patch. Er ist nicht in 3.53.4 enthalten.
b09c88c14082339b66c7b7158d609a771e64ca69)2026-07-24 19:02:57 bf7c7f30031888f4e796e429ab3978879485813aaca6f641c7b33e4e09459bccsrc/select.c sqlite3ResultSetOfSelect (nNestSel++), CTE-Attach :5754src/walker.c sqlite3WalkSelectFrom Subquery-WalkselectExpander / sqlite3SelectExpand2026-10-04T04:58:58Z; Trunk f547308713