
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · sqlite-collate-depth
解説記事: https://abraxaslabs.tech/research/sqlite-collate-depth
分類: クラッシュ 到達範囲: ローカル
SQLite 3.53.4 (b09c88c14082339b66c7b7158d609a771e64ca69、SOURCE_ID 2026-07-24 19:02:57 bf7c7f30031888f4e796e429ab3978879485813aaca6f641c7b33e4e09459bcc) - Hwaci
COLLATE の文法アクションは sqlite3ExprCheckHeight を一切呼び出さない。sqlite3ExprAddCollateToken は nHeight が 1 のままの TK_COLLATE ノードを確保し、その pLeft に直前の式をぶら下げる。通常の演算子は sqlite3PExpr を経由するため、ドキュメント化された SQLITE_LIMIT_EXPR_DEPTH(デフォルト 1000)が適用される。この演算子には適用されない。
それでもウォーカーはすべての pLeft に対して再帰する。EP_Skip はアフィニティ用であり、sqlite3WalkExprNN 用ではない。50 ノードのチェーンは 1 を返す。8k や 40k でも同様で、深さ制限を超えてしまう。120k では sqlite3WalkExprNN 内で ASan スタックオーバーフローが発生する(rc=134)。RCE ではない。
正規のツリーは https://sqlite.org/src にある。GitHub の sqlite/sqlite は Fossil のミラーである。公式 zip は sqlite-src-3530400。パブリックドメインのライブラリ。本パックは AGPLv3。
| ID | CVE 未割当 |
| 分類 | クラッシュ(sqlite3WalkExprNN 内の ASan スタックオーバーフロー。RCE は実証されていない) |
| 到達範囲 | ローカル(信頼できない SQL、または仕込まれた VIEW) |
| CWE | CWE-674、CWE-770 |
| CVSS | High: 7.5 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H |
| 製品 | SQLite 3.53.4 |
| 影響を受けるバージョン | 3.53.4(b09c88c)。後期トランクの COLLATE 高さチェックの取り残し |
| 認証 | 信頼できない SQL または VIEW。デフォルトの load_extension は無効のまま |
| ライセンス | GNU Affero GPL v3.0 |
| ラボ | 127.0.0.1:18800 のみ。ASan アマルガメーション。クラッシュ実証。 |
長い後置 COLLATE BINARY チェーンを SQL として与えるか、信頼できない .db 内の VIEW に仕込む。ホストプロセスはチェーンを辿り、C スタック上で死ぬ。ドキュメント化された式の深さ制限は、この演算子では決して実行されない。
SELECT 1 COLLATE BINARY COLLATE BINARY ... で十分である。CREATE VIEW v AS SELECT 1 COLLATE BINARY ... に続けて、新しい接続で SELECT * FROM v を実行しても同じ形になる。デフォルトの SQLITE_LIMIT_SQL_LENGTH(1e9)は、本ラボで 8 MB のスタックをオーバーフローさせた約 1.8 MB のチェーンを許容する。
これはエンベッダプロセスのクラッシュである。命令ポインタの制御ではない。load_extension は無効のままである。
OpenLiteSpeed の後、SQLite タグ version-3.53.4 を対象に 20 回のソース探索を行った。最新の GA であり、3.54.0 のドラフトではない。sqlite.org/security.html は信頼できない SQL と信頼できない .db を第一級の脅威として扱っている。デフォルトの load_extension は無効である。
COLLATE に対する parse.y は 3 行である:
expr(A) ::= expr(A) COLLATE ids(C). {
A = sqlite3ExprAddCollateToken(pParse, A, &C, 1);
}
sqlite3ExprAddCollateToken は pNew->pLeft = pExpr と EP_Collate|EP_Skip を設定します。sqlite3ExprAlloc は nHeight = 1 のままにしました。sqlite3ExprCheckHeight はありません。sqlite3PExpr は他のすべての二項演算子に対してこの両方を行います。
誤った方向性: 8k の COLLATE をクラッシュとみなすこと(1 を返しました); 40k をクラッシュとみなすこと(これも 1 を返し、SQLITE_LIMIT_EXPR_DEPTH の 1000 をはるかに超えていました); sqlite3WalkExprNN で ASan が落ちるまでに 120k を要すること。
これはピン上の 14 個の残りのうち G1 です。兄弟は他の投稿です。
cd lab
./run.sh
公式の sqlite-src-3530400 からの ASan アマルガメーション(タグ version-3.53.4 のフォールバッククローン)。sqlite-collate-depth を構成する。127.0.0.1:18800 上のダミー HTTP。ループバックにバインドする。
SUCCESS sqlite-collate-depth how=asan-stack-overflow control=50 crash-n=120000 SQLITE-COLLATE-DEPTH-WITNESS
50 COLLATE は 1 を返します。8k と 40k も 1 を返します。120k は rc=134 で失敗し、sqlite3WalkExprNN 内で ASan のスタックオーバーフローが発生します。ピンチェックは SELECT sqlite_version() / SELECT sqlite_source_id() です。
sqlite3PExpr が既に行っているのと同じように、pLeft をアタッチした後に COLLATE ノードに対して sqlite3ExprCheckHeight を呼び出します。子から nHeight を再計算します。後置演算子も依然として式ツリーです。
トランク 252c0b7bf5 (2026-10-04) はこの GA より後です。
b09c88c14082339b66c7b7158d609a771e64ca69)src/parse.y の COLLATE アクションsrc/expr.c の sqlite3ExprAddCollateToken、sqlite3ExprAlloc (nHeight = 1)、sqlite3PExpr / sqlite3ExprCheckHeightsrc/walker.c の sqlite3WalkExprNNsrc/sqliteLimit.h の SQLITE_MAX_EXPR_DEPTH デフォルト 1000