
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
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 auf diesem Pin 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 stirbt.
Eine kleine CTE-Kette liefert eine Zeile. Verschachteltes FROM bei N=25000 ist ein 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 nachgewiesenes 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-Spiegel 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-Witness. |
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 jede CTE als verschachtelte FROM-Subquery. nNestSel bewegt sich nie. Der Host-Prozess stirbt am C-Stack. Verschachtelte VIEWs sind bereits begrenzt. Verschachteltes FROM stößt an das Parser-Rekursionslimit. Dieses Überbleibsel ist der CTE-Anhang-Pfad. SQLite evaluiert die CTE-Namen nicht in eine Shell. Crash, kein RCE.
Zwanzig Quelltext-Jagden auf 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). Der CTE-Anhang war es nicht. Trunk f547308713 (2026-10-05) liegt nach diesem GA.
Bereits dokumentierte Irrwege: verschachtelte VIEWs als den Crash zu behandeln (sie melden too-deep); verschachteltes FROM N=25000 als den Crash zu behandeln (Parser-Recursion limit); eine 5-CTE-Kette als Beweis zu nehmen, dass die Begrenzung greift.
cd lab
./run.sh
Offizielles sqlite-src-3530400-Zip, ASan-Amalgamation, Compose sqlite-cte-nest, veröffentlicht auf 127.0.0.1:18810. Binde es an Loopback. Richte dies nicht auf die SQLite-Instanz anderer Leute.
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-Anhang so erhöhen, wie es sqlite3ResultSetOfSelect bereits für VIEWs tut, und bei SQLITE_LIMIT_EXPR_DEPTH einen Fehler melden. 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.
b09c88c14082339b66c7b7158d609a771e64ca69)2026-07-24 19:02:57 bf7c7f30031888f4e796e429ab3978879485813aaca6f641c7b33e4e09459bccsrc/select.c sqlite3ResultSetOfSelect (nNestSel++), CTE-Anhang :5754src/walker.c sqlite3WalkSelectFrom Subquery-WalkselectExpander / sqlite3SelectExpand2026-10-04T04:58:58Z; Trunk f547308713