
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · sqlite-collate-depth
Class: Crash Reach: Local
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 で ASan が sqlite3WalkExprNN 内でスタックオーバーフローする (rc=134)。RCE ではない。
正規のツリーは https://sqlite.org/src にある。GitHub の sqlite/sqlite は Fossil ミラーである。公式 zip は sqlite-src-3530400。パブリックドメインのライブラリ。このパックは AGPLv3。
| ID | CVE 未割当 |
| Class | Crash (sqlite3WalkExprNN 内の ASan スタックオーバーフロー、RCE は実証されていない) |
| Reach | Local (信頼できない 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 |
| Product | SQLite 3.53.4 |
| Affected | 3.53.4 (b09c88c); 後の trunk の COLLATE 高さチェックの残骸 |
| Auth | 信頼できない SQL または VIEW; デフォルトの load_extension はオフのまま |
| License | GNU Affero GPL v3.0 |
| Lab | 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 をはるかに超えていた); ASan が sqlite3WalkExprNN で死ぬには 120k が必要だった。
これはピン上の 14 の残骸のうち G1 である。兄弟は他の投稿である。
cd lab
./run.sh
公式 sqlite-src-3530400 からの ASan アマルガメーション (タグ version-3.53.4 のフォールバッククローン)。Compose 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()。
pLeft をアタッチした後に COLLATE ノードに対して sqlite3ExprCheckHeight を呼び出す。sqlite3PExpr がすでに行っているように。子から nHeight を再計算する。後置演算子も依然として式ツリーである。
Trunk 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