
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · sqlite-cte-nest
解説記事: https://abraxaslabs.tech/research/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 アマルガメーション、sqlite-cte-nest を compose、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
CTE のアタッチ時に sqlite3ResultSetOfSelect が VIEW に対して既に行っているのと同じ方法で 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