abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · sqlite-fj-using-auth
クラス: 権限の取りこぼし 到達範囲: ローカル
SQLite 3.53.4 (b09c88c / SOURCE_ID 2026-07-24 19:02:57 bf7c7f30031888f4e796e429ab3978879485813aaca6f641c7b33e4e09459bcc) - Hwaci
lookupName() は FULL JOIN USING の列を coalesce(...) (TK_FUNCTION) に書き換える。sqlite3AuthRead は TK_COLUMN / TK_TRIGGER に対してのみ実行されるため、USING 列には SQLITE_READ コールバックが決して発火しない。sqlite3_set_authorizer を導入し t2.x への READ を DENY/IGNORE している埋め込み先でも、SELECT x FROM t1 FULL JOIN t2 USING(x) を通じてその列が返される。
Authorizer はデフォルトのオープンでは無効。この C API の取りこぼし。RCE ではない。FULL JOIN ON と LEFT JOIN USING は拒否されたまま / リークなし。明示的な coalesce(t2.x) は依然として認可される。
| ID | CVE 未採番 |
| クラス | 権限の取りこぼし (列レベルの authorizer スキップ) |
| 到達範囲 | ローカル (埋め込み先の sqlite3_set_authorizer、攻撃者の SQL) |
| CWE | CWE-863, CWE-284 |
| CVSS | High: 7.5 CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N |
| 製品 | SQLite (GitHub ミラー sqlite/sqlite) |
| 影響を受けるバージョン | 3.53.4 (b09c88c14082339b66c7b7158d609a771e64ca69)。3.54 限定の authorizer FULL JOIN USING 修正 (2cb2287768) はこの GA には含まれていない。 |
| 認証 | 埋め込み先が sqlite3_set_authorizer を導入済み。デフォルトのコールバックは NULL |
| ライセンス | GNU Affero GPL v3.0 |
| ラボ | 127.0.0.1:18840 のみ。witness 文字列。RCE ではない。 |
列 ACL として sqlite3_set_authorizer を導入している埋め込み先に対して、SELECT x FROM t1 FULL JOIN t2 USING(x) (または NATURAL FULL JOIN) を準備する。素の SELECT x FROM t2 は拒否される (SQLITE_AUTH 23)。FULL JOIN USING の形式は READ 拒否された列を返す。READ t2.x コールバックは一切発火しない。
Authorizer は埋め込み先が導入しない限り無効。デフォルトの sqlite3_open はこの取りこぼしには該当しない。RCE ではない。
PHP に続く 3.53.4 の 20 回目のソース探索。スキップリストには既に 3.54 の FULL JOIN USING authorizer チェックインが挙げられていた。それは最新 GA でも依然として欠落している。lookupname_end では pExpr->op が TK_FUNCTION であるため、AuthRead ゲートは決して実行されない。WRC_Prune もまた、walker が coalesce 引数へ降りるのを止める。
lookupname_end:
if( cnt==1 ){
#ifndef SQLITE_OMIT_AUTHORIZATION
if( pParse->db->xAuth
&& (pExpr->op==TK_COLUMN || pExpr->op==TK_TRIGGER)
){
sqlite3AuthRead(pParse, pExpr, pSchema, pNC->pSrcList);
}
#endif
既に記録済みの誤った道筋: authorizer をデフォルト有効とみなすこと、LEFT JOIN USING や FULL JOIN ON がリークすると期待すること、明示的な coalesce(t2.x) が AuthRead をスキップすると期待すること、まだドラフトだった 3.54.0 に固定すること。
cd lab
./run.sh
公式の sqlite-src-3530400 amalgamation をビルドする。ハーネスは lab/auth.c。ループバック 127.0.0.1:18840。Authorizer は t2.x への READ を DENY。SELECT x FROM t2 は拒否される。SELECT x FROM t1 FULL JOIN t2 USING(x) は witness を返し、READ t2.x は 0 回。FULL JOIN ON は拒否される。LEFT JOIN USING はリークなし。IGNORE ベースラインは NULL。IGNORE FULL JOIN USING は依然としてリークする。
SUCCESS sqlite-fj-using-auth how=full-join-using-skip-authread baseline=denied fj-using=witness fj-on=denied left-using=no-leak SQLITE-FJ-USING-AUTH-WITNESS
coalesce 書き換え後に、trunk 2cb2287768 / Git 5694c3bb が 3.54 向けに行っているように、すべての pFJMatch の子に対して sqlite3AuthRead をループさせる。a[0] のみを認可する (bbd69ce274) のでは不十分。LEFT JOIN USING と FULL JOIN ON は既に認可されており、この取りこぼしには該当しない。
b09c88c14082339b66c7b7158d609a771e64ca69)src/resolve.c の lookupName coalesce 書き換えと AuthRead ゲートsrc/auth.c の sqlite3AuthRead / sqlite3AuthReadCol