
SQLite 3.53.4 CLI - 高 - ローカル - コマンドインジェクション - 復元ダンプが敵対的スキーマをドットコマンドとして出力
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · sqlite-cli-recover
解説記事: https://abraxaslabs.tech/research/sqlite-cli-recover
分類: コマンドインジェクション 到達範囲: ローカル
SQLite 3.53.4 (b09c88c) CLI の .recover は、敵対的な sqlite_schema.sql を後続のドットコマンドとして出力する。recoverOneStmt は最初のステートメントのみを prepare する。仕込まれた CREATE TABLE と改行を挟んだ .shell は依然として書き出される。ドキュメントに記載されたリストア用パイプが、これをオペレータの UID で実行する。
.dump の printSchemaLine も同じ出力クラスである。libsqlite3 ではない。--safe でもない。オラクルは目印文字列の echo である。
| ID | CVE 未割当 |
| 分類 | コマンドインジェクション (CLI .recover / .dump のスキーマ出力) |
| 到達範囲 | ローカル (被害者がドキュメント記載のリカバリ用パイプを実行する。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 のみ。目印 SQLITE-CLI-RECOVER-WITNESS。 |
有効な最初の CREATE と、後続の .shell を sqlite_schema.sql に仕込む。その db を 2 つ目の sqlite3 にリカバリした被害者は、ドットコマンドを自身の UID で実行してしまう。
仕込みは .db ファイルである。被害者の操作はドキュメント記載のリカバリ用パイプであり、貼り付けた go 行でも、誤って --safe を外したのでもない。.shell は system() である。ラボのオラクルは目印の 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 を sqlite3 にビルドし、デフォルトの Unix CLI recover(OPT_SHELL / SQLITE_ENABLE_DBPAGE_VTAB)を有効化。.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 は、仮想テーブルのダンプがすでに使用している %q と同様にクォートすること。後続の . 行は敵対的なものとして扱い、破棄すること。リストア用 sqlite3 の --safe は .shell をブロックするが、ドキュメントに記載されたパイプでは有効になっていない。
b09c88c14082339b66c7b7158d609a771e64ca69).recover とその後のリストアext/recover/sqlite3recover.c recoverOneStmt / recoverWriteSchema1src/shell.c.in recoverSqlCb、.dump の printSchemaLine