abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · sqlite-values-union
Class: Crash Reach: Local
SQLite 3.53.4 (b09c88c) - Hwaci
デフォルトの VALUES はコルーチンを使用する。WITH(またはスキーマのリロード、あるいは非定数行)は sqlite3MultiValues を UNION ALL に強制的にフォールバックさせる。SF_Values が設定されている場合、複合 SELECT の長さチェックはスキップされる(parse.y:562-567)。十分に大きな行リストは SQLITE_LIMIT_EXPR_DEPTH によって拒否され、再帰的な sqlite3ExprDeleteNN がエラークリーンアップ経路で C スタックを破壊する。
5000 行の単純な VALUES は問題ない。WITH と 1000 行の組み合わせはクリーンにエラーになる(Expression tree is too large)。WITH と 300000 行の組み合わせは sqlite3ExprDeleteNN で ASan スタックオーバーフローを引き起こす(rc=134)。RCE ではない。
| ID | CVE 未割当 |
| Class | Crash(ExprDelete での ASan スタックオーバーフロー。RCE は実証されていない) |
| Reach | Local(信頼できない SQL、または VIEW/TRIGGER 内の VALUES) |
| 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 |
| Product | SQLite |
| Affected | 3.53.4(b09c88c14082339b66c7b7158d609a771e64ca69、SOURCE_ID 2026-07-24 19:02:57 bf7c7f30031888f4e796e429ab3978879485813aaca6f641c7b33e4e09459bcc)。後の trunk における VALUES 複合上限の残骸。 |
| Auth | 攻撃者の SQL、または UNION ALL フォールバックを引き起こす仕込まれたスキーマ |
| License | GNU Affero GPL v3.0 |
| Lab | 127.0.0.1:18820 のみ。ASan アマルガメーション。クラッシュの証拠。 |
ホストが prepare する信頼できない SQL を投入する。巨大な VALUES リストの先頭に WITH を付けてコルーチン経路を無効化する。パースは式の深さエラーで失敗するはずである。そのツリーのクリーンアップが sqlite3ExprDeleteNN で再帰し、プロセスが死ぬ。
同じフォールバックは VALUES が VIEW または TRIGGER 内にある場合(db->init.busy)にも発生する。ホストはエンベッダである。CLI、攻撃者の SQL を prepare するアプリ、敵対的な .db を開くサービスなど。SQLite は VALUES のバイト列をコードとして評価しない。クラッシュそのものが発見事項である。
github.com/sqlite/sqlite のタグ version-3.53.4 を対象に 20 回のソース探索を行った。スキップリストはすでに CVE-2026-11824、session NPD、concat_ws、LOOKASIDE、JSON UAF、WAL-reset を除外していた。デフォルトの load_extension は無効である。パーサ/VDBE の残骸が、この VALUES UNION ALL スキップと再帰的デストラクタであった。
if( (p->selFlags & (SF_MultiValue|SF_Values))==0
&& (mxSelect = pParse->db->aLimit[SQLITE_LIMIT_COMPOUND_SELECT])>0
&& cnt>mxSelect
){
sqlite3ErrorMsg(pParse, "too many terms in compound SELECT");
}
if( pParse->bHasWith
|| pParse->db->init.busy
|| exprListIsConstant(pParse,pRow)==0
...
){
/* The co-routine method cannot be used. Fall back to UNION ALL. */
...
pSelect->op = TK_ALL;
pSelect->pPrior = pLeft;
}
clearSelect() は pPrior を反復的にたどる。sqlite3ExprDeleteNN() は依然として pRight 上で、また EP_Static が設定されている場合は pLeft 上でも再帰する。
誤った方向性: WITH を伴う 1000 行は文書化された深さ上限でクリーンにエラーとなりクラッシュしない。デストラクタの深さが 8 MiB の C スタックを破壊するには 300000 行が必要であった。単純な VALUES はコルーチン上に留まり、ネガティブコントロールとなる。
cd lab
./run.sh
正規の 3.53.4 ソース zip、ASan sqlite3。Compose sqlite-values-union。公開 127.0.0.1:18820。ループバックにバインドすること。
SUCCESS sqlite-values-union how=with-values-union-all-fallback-exprdelete rows=300000 crash=asan-stack-overflow plain=5000 depth-error=1000 SQLITE-VALUES-UNION-WITNESS
他の複合と同様に SQLITE_LIMIT_COMPOUND_SELECT を VALUES に適用する。削除時に UNION ALL チェーンを反復的にたどるか、ツリーが構築される前に EXPR_DEPTH を制限してクリーンアップが C スタックを再帰的にあふれさせないようにする。後の trunk(Bug 2026-10-04T05:34:47Z)はこの GA より後である。
b09c88c14082339b66c7b7158d609a771e64ca69)2026-07-24 19:02:57 bf7c7f30031888f4e796e429ab3978879485813aaca6f641c7b33e4e09459bccsrc/parse.y:562-567 SF_Values が設定されている場合の複合 SELECT スキップsrc/insert.c:681-704 sqlite3MultiValues の UNION ALL フォールバックsrc/expr.c:1406-1430 再帰的な sqlite3ExprDeleteNN