abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · sqlite-xfer-auth
解説記事: https://abraxaslabs.tech/research/sqlite-xfer-auth
クラス: 権限の取り残し 到達範囲: ローカル
SQLite 3.53.4 (b09c88c、SOURCE_ID 2026-07-24 19:02:57 bf7c7f30031888f4e796e429ab3978879485813aaca6f641c7b33e4e09459bcc) は、INSERT INTO dest SELECT * FROM src に対して依然として xferOptimization の高速パスを採用します。sqlite3AuthCheck は dest に対する SQLITE_INSERT のみです。このコピーは src に対して sqlite3Select もカラム単位の sqlite3AuthRead も呼び出しません。SELECT * FROM src は拒否されます。INSERT SELECT はその証拠をコピーします。オーソライザのログは INSERT:dest です。
オーソライザは、エンベッダがインストールしない限り無効です。RCE ではありません。DRH は Fossil d1cdb817 を 3.53 のバグ修正ではなく 3.54 の機能として扱いました。3.54.0 はまだドラフトです。
| ID | CVE 未割り当て |
| クラス | 権限の取り残し (READ 拒否テーブルのコピー) |
| 到達範囲 | ローカル (エンベッダの sqlite3_set_authorizer) |
| CWE | CWE-863 |
| CVSS | High: 7.5 CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N |
| 製品 | SQLite (Hwaci) |
| 影響を受けるバージョン | 3.53.4 (b09c88c14082339b66c7b7158d609a771e64ca69) |
| 認証 | src に対する READ/SELECT を拒否し dest への INSERT を許可するオーソライザがインストールされた状態でのローカル SQL |
| ライセンス | GNU Affero GPL v3.0 |
| ラボ | 127.0.0.1:18850 のみ |
dest がスキーマ互換で INSERT が許可されている場合に、INSERT INTO dest SELECT * FROM src を準備します。生の B-tree レコードが READ 拒否されたソーステーブルから抜け出し、dest に格納されます。単独の SELECT * FROM src は SQLITE_AUTH になります。xfer パスは SELECT をコンパイルしないため、ソースの SQLITE_SELECT、テーブルレベルの SQLITE_READ、カラム単位の sqlite3AuthRead は一切発火しません。
信頼できない SQL / カラム ACL のゲートとして sqlite3_set_authorizer をインストールしたエンベッダが必要です。デフォルトのライブラリではこのコールバックは NULL です。RCE ではありません。
この GA における他の取り残しと同様、3.53.4 の Crit/High 探索の一環です。オーソライザは sqlite3_set_authorizer に文書化されています。INSERT の認証は dest テーブルのみです (insert.c:969)。xfer は sqlite3Select() より前に採用されます (insert.c:1020-1038)。xferOptimization はレコードをコピーします。このピンにおける insert.c の grep 結果: sqlite3AuthCheck が 1 箇所、sqlite3AuthRead はなし。SQLITE_OMIT_XFER_OPT はデフォルトのビルドフラグではありません。
フォーラム 2026-05-21T03:31:22Z。トランク d1cdb817cafd03a4 は 3.54 専用です。DRH の見解: 新機能であり、branch-3.53 には載せない。
cd lab
./run.sh
アマルガメーション 3.53.4 と lab/xfer_auth.c をビルドする。sqlite-xfer-auth を構成する。127.0.0.1:18850 にバインドする。オラクルはインプロセスオーソライザーからの JSON である: SELECT * FROM src は拒否され、INSERT INTO dest SELECT * FROM src は成功し、dest は SQLITE-XFER-AUTH-WITNESS を持ち、挿入アクションは INSERT:dest のみである。
SUCCESS sqlite-xfer-auth how=xfer-opt-skip-src-read select-src=denied insert-select=ok dest-has-witness=yes SQLITE-XFER-AUTH-WITNESS
3.54 の d1cdb817 と同じ方法でソースを認可します。オーソライザーが登録されている場合、xferOptimization は src に対して SELECT/READ の sqlite3AuthCheck を実行する必要があります(または高速パスを拒否して sqlite3Select にフォールスルーする)。それまでの間、テーブルに対する READ を DENY する埋め込み側は、互換性のあるすべての dest への INSERT も DENY するか、-DSQLITE_OMIT_XFER_OPT を付けてコンパイルする必要があります。
b09c88c14082339b66c7b7158d609a771e64ca69)src/insert.c の sqlite3AuthCheck による INSERT dest、sqlite3Select より前の xferOptimization