
SQLite 3.53.4 CLI - 高 - ローカル - コマンドインジェクション - 復元ダンプが敵対的スキーマをドットコマンドとして出力
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · sqlite-cli-recover
分類: コマンドインジェクション 到達範囲: ローカル
SQLite 3.53.4 (b09c88c) CLI の .recover は、敵対的な sqlite_schema.sql を後続のドットコマンドとして出力する。recoverOneStmt は最初のステートメントのみを prepare する。仕込まれた CREATE TABLE と改行後の .shell は依然として書き出される。ドキュメント化されたリストアパイプは、それをオペレータの UID で実行する。
.dump の printSchemaLine も同じ出力クラスである。libsqlite3 ではない。--safe でもない。オラクルは witness 文字列の echo である。
| ID | CVE 未採番 |
| 分類 | コマンドインジェクション (CLI .recover / .dump スキーマ出力) |
| 到達範囲 | ローカル (被害者がドキュメント化された recover パイプを実行する。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 hostile.db .recover | sqlite3 restored.db を実行する |
| ライセンス | GNU Affero GPL v3.0 |
| ラボ | 127.0.0.1:18930 のみ。Witness SQLITE-CLI-RECOVER-WITNESS。 |
有効な最初の CREATE と、後続の .shell を sqlite_schema.sql に仕込む。その db を 2 つ目の sqlite3 に復元した被害者は、自身の UID でそのドットコマンドを実行してしまう。
仕込みは .db ファイルである。被害者の操作はドキュメント化された recover パイプであり、貼り付けた go 行でも、誤って --safe を外したのでもない。.shell は system() である。ラボのオラクルは witness の echo である。リバースシェルではない。
3.53.4 のソースを 20 回調査した。Recover 自身の調査では recoverOneStmt を最初のステートメントのみの prepare と呼び、そこで終わっていた。残るのは出力パスである。recoverSqlCb は依然として余分なテキストを出力する。そのスクリプトをパイプするのが、sqlite.org が復元方法として示している手順である。
すでに記録済みの誤った道: 最初のステートメントの prepare を除去とみなすこと、3.54.0 (ドラフト) に固定すること、CVE-2022-46908 --safe を再申請すること、これを libsqlite3 の RCE と呼ぶこと、オラクルとしてリバースシェルを使うこと。
cd lab
./run.sh
sqlite-src-3530400 を、デフォルトの Unix CLI recover (OPT_SHELL / SQLITE_ENABLE_DBPAGE_VTAB) 付きで sqlite3 にビルドする。.dbconfig defensive off の後の writable_schema。仕込まれた CREATE TABLE t(x); と改行後の .shell echo SQLITE-CLI-RECOVER-WITNESS。.recover が .shell を出力した。2 つ目の sqlite3 にパイプすると、それが実行された。ループバックにバインド。
SUCCESS sqlite-cli-recover how=recover-pipe-dot-shell recover-has-shell=yes restore-echo=yes SQLITE-CLI-RECOVER-WITNESS
単一ステートメントでないスキーマ SQL を出力しないこと。最初の prepare で分割し、そのステートメントのみを出力するか、その行を拒否すること。通常の CREATE は、仮想テーブルの dump がすでに使用している %q の方法でクォートすること。後続の . 行は敵対的とみなして破棄すること。復元用 sqlite3 の --safe は .shell をブロックするが、ドキュメント化されたパイプでは有効になっていない。
b09c88c14082339b66c7b7158d609a771e64ca69).recover と復元ext/recover/sqlite3recover.c recoverOneStmt / recoverWriteSchema1src/shell.c.in recoverSqlCb, .dump printSchemaLine