abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · sqlite-cli-go
解説記事: https://abraxaslabs.tech/research/sqlite-cli-go
分類: コマンドインジェクション 到達範囲: ローカル
SQLite 3.53.4 (b09c88c) のデフォルト sqlite3 CLI は、依然として SQL Server の go と Oracle の / を文の終端として扱います。line_is_command_terminator はその行を ; に書き換えます。SQL バッファが空の状態で続く行は do_meta_command となるため、.shell / .output / .read がオペレータの UID で実行されます。
--safe は依然として .shell をブロックします。この制御は有効です。デフォルトの sqlite3 は --safe を有効にしません。libsqlite3 ではありません。Oracle は証拠文字列の echo です。
| ID | CVE 未割当 |
| 分類 | コマンドインジェクション (CLI の go / / 終端に続く後続のドットコマンド) |
| 到達範囲 | ローカル (被害者が --safe なしでデフォルト sqlite3 に攻撃者の SQL/スクリプトを実行させる; UI:R) |
| CWE | CWE-78 |
| CVSS | High: 7.8 CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H |
| 製品 | SQLite (sqlite3 CLI) |
| 影響を受けるバージョン | 3.53.4 (b09c88c14082339b66c7b7158d609a771e64ca69) SOURCE_ID 2026-07-24 19:02:57 bf7c7f30031888f4e796e429ab3978879485813aaca6f641c7b33e4e09459bcc |
| 認証 | 被害者がデフォルト sqlite3 にスクリプトを渡す; --safe なし |
| ライセンス | GNU Affero GPL v3.0 |
| ラボ | 127.0.0.1:18920 のみ。証拠文字列 SQLITE-CLI-GO-WITNESS。 |
オペレータが --safe なしで sqlite3 に渡すスクリプト内で SQL が終端されていない場合、go または / の行に続いて .shell / .output / .read がオペレータの UID で実行されます。
セミコロンはすでに文を終端します。残るのは ; を持たない終端されていない SQL であり、文がまだ開いていると判断したラッパーが次のドットコマンドを実行してしまいます。.shell は system() です。ラボのオラクルは証拠文字列の echo です。リバースシェルではありません。
OpenLiteSpeed に続く 3.53.4 のソース探索は 20 回目です。最新の GA であり、3.54.0 のドラフトではありません。CLI の追加機能はデフォルトライブラリではありません。--safe は信頼できないスクリプトに対する文書化されたシンクです (CVE-2022-46908)。これは依然として .shell をブロックします。デフォルトの sqlite3 はこれを有効にしません。
src/shell.c.in には依然として SQL Server / Oracle 互換パスが存在します。トランクの ac6ac0c22d (2026-10-08) は SQLITE_SHELL_LEGACY_COMMAND_TERMINATOR がない限りこれを無効化します。このチェックインは本 GA より後です。
すでに記録済みの誤った道: セミコロンを同じ残り物として扱うこと、CVE-2022-46908 を再申請すること、--safe がデフォルトであると期待すること、これを libsqlite3 の RCE と呼ぶこと、リバースシェルをオラクルとして使うこと、3.54.0 (ドラフト) に固定すること。
cd lab
./run.sh
公式の sqlite-src-3530400 をデフォルトの Unix sqlite3 にビルドします(--disable-readline)。sqlite-cli-go を Compose します。127.0.0.1:18920 でダミー TCP を待ち受けます。デフォルト CLI は go と / を終端として扱い、その後 .shell echo SQLITE-CLI-GO-WITNESS を実行しました。--safe は cannot run .shell in safe mode を出力しました。ループバックにバインドします。
SUCCESS sqlite-cli-go how=go-then-dot-shell slash=yes safe=blocked SQLITE-CLI-GO-WITNESS
go と / を終端文字として扱うのをやめてください。これは trunk ac6ac0c22d が -DSQLITE_SHELL_LEGACY_COMMAND_TERMINATOR を指定しない限り行う動作です。それまでは、信頼できないスクリプトを --safe 付きで実行してください。--safe は依然として有効な制御手段です。
b09c88c14082339b66c7b7158d609a771e64ca69)src/shell.c.in の line_is_command_terminator、process_input の書き換え、do_meta_command、failIfSafeMode 後の .shell の system()--safe--safe