
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · sqlite-cte-nest
分類: クラッシュ 到達範囲: ローカル
SQLite 3.53.4 (b09c88c14082339b66c7b7158d609a771e64ca69, SOURCE_ID 2026-07-24 19:02:57 bf7c7f30031888f4e796e429ab3978879485813aaca6f641c7b33e4e09459bcc) - Hwaci
sqlite3ResultSetOfSelect は nNestSel をインクリメントし、チェーンが SQLITE_LIMIT_EXPR_DEPTH に達すると VIEWs and/or subqueries nested too deep エラーを返す。このピンではネストされた VIEW はすでにその上限に達している。select.c:5754 (sqlite3SrcItemAttachSubquery) での CTE アタッチは nNestSel をインクリメントしない。その後 selectExpander / sqlite3WalkSelect が CTE チェーンを再帰し、C スタックが破壊される。
小さな CTE チェーンは行を返す。N=25000 のネストされた FROM はパーサーの Recursion limit となりクラッシュしない。.limit expr_depth 20 でのネストされた VIEW は too-deep エラーとなる。CTE N=25000 は ASan スタックオーバーフローとなる。RCE ではない。
| ID | CVE 未割当 |
| 分類 | クラッシュ (selectExpander における ASan スタックオーバーフロー。RCE は実証されていない) |
| 到達範囲 | ローカル (信頼できない SQL またはネストされた CTE スキーマ) |
| CWE | CWE-674 |
| CVSS | High: 7.5 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H |
| 製品 | SQLite (GitHub ミラー sqlite/sqlite) |
| 影響バージョン | 3.53.4 (b09c88c); 後のトランク CTE nNestSel の残存 |
| 認証 | 信頼できない SQL または仕込まれた WITH チェーン |
| ライセンス | GNU Affero GPL v3.0 |
| ラボ | 127.0.0.1:18810 のみ。ASan アマルガメーション。クラッシュ実証。 |
信頼できない .db 上で、SQL として、または VIEW 本体として長い CTE チェーンを投入する:
WITH c0 AS (SELECT 1),
c1 AS (SELECT * FROM c0),
...
cN AS (SELECT * FROM cN-1)
SELECT * FROM cN;
selectExpander は各 CTE をネストされた FROM サブクエリとして走査する。nNestSel は決して動かない。ホストプロセスは C スタック上で死ぬ。ネストされた VIEW はすでに上限が設けられている。ネストされた FROM はパーサーの再帰制限に達する。この残存が CTE アタッチ経路である。SQLite は CTE 名をシェルに評価しない。クラッシュであり、RCE ではない。
https://github.com/sqlite/sqlite タグ https://github.com/sqlite/sqlite/releases/tag/version-3.53.4 の 20 回のソース探索。このピン (3f3fb9b638 / branch-3.53 38430aa5ed, 2026-06-16) ではネストされた VIEW には上限が設けられていた。CTE アタッチには設けられていなかった。トランク f547308713 (2026-10-05) はこの GA より後である。
すでに記録済みの誤った道: ネストされた VIEW をクラッシュとみなすこと (それらは too-deep エラーとなる); ネストされた FROM N=25000 をクラッシュとみなすこと (パーサーの Recursion limit); 5-CTE チェーンを上限が適用される証拠とすること。
cd lab
./run.sh
公式 sqlite-src-3530400 zip、ASan アマルガメーション、compose sqlite-cte-nest、公開 127.0.0.1:18810。ループバックにバインドすること。他人の SQLite にこれを向けないこと。
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
sqlite3ResultSetOfSelect が VIEW に対してすでに行っているように、CTE アタッチ時に nNestSel をインクリメントし、SQLITE_LIMIT_EXPR_DEPTH でエラーを返す。トランク f547308713 (2026-10-05, "Limit the depth of recursion for CTEs using SQLITE_LIMIT_EXPR_DEPTH") がその種のパッチである。これは 3.53.4 には含まれていない。
b09c88c14082339b66c7b7158d609a771e64ca69)2026-07-24 19:02:57 bf7c7f30031888f4e796e429ab3978879485813aaca6f641c7b33e4e09459bccsrc/select.c sqlite3ResultSetOfSelect (nNestSel++), CTE アタッチ :5754src/walker.c sqlite3WalkSelectFrom サブクエリ走査selectExpander / sqlite3SelectExpand2026-10-04T04:58:58Z; トランク f547308713