
SQLite 3.53.4 CLI — High — Локальная — Инъекция команд — recover dump выводит враждебную схему как dot-команду
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · sqlite-cli-recover
Класс: Внедрение команд Достижимость: Локальная
CLI SQLite 3.53.4 (b09c88c) .recover выводит враждебный sqlite_schema.sql как последующую dot-команду. recoverOneStmt подготавливает только первый оператор. Подсаженный 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 (CLI sqlite3) |
| Затронуто | 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. Жертва, восстанавливающая эту БД во второй sqlite3, выполняет dot-команду от своего UID.
Подсадка — это файл .db. Действие жертвы — документированный конвейер восстановления, а не вставленная строка go и не случайно отключённый --safe. .shell — это system(). Оракул лаборатории — echo свидетеля. Не reverse shell.
Двадцать поисков по исходникам 3.53.4. Собственный поиск в recover назвал recoverOneStmt подготовкой только первого оператора и на этом остановился. Остаток — это путь вывода: recoverSqlCb всё равно выводит лишний текст. Передача этого скрипта по конвейеру — это то, как sqlite.org советует восстанавливать.
Уже зафиксированные ошибочные пути: трактовка подготовки первого оператора как удаления; привязка к 3.54.0 (черновик); повторная подача CVE-2022-46908 --safe; называние этого RCE в libsqlite3; использование reverse shell в качестве оракула.
cd lab
./run.sh
Собирает sqlite-src-3530400 в sqlite3 со стандартным Unix CLI recover (OPT_SHELL / SQLITE_ENABLE_DBPAGE_VTAB). writable_schema после .dbconfig defensive off. Подсаженный CREATE TABLE t(x); плюс перевод строки .shell echo SQLITE-CLI-RECOVER-WITNESS. .recover вывел .shell. Переданный по конвейеру во второй sqlite3, он выполнился. Привязка к loopback.
SUCCESS sqlite-cli-recover how=recover-pipe-dot-shell recover-has-shell=yes restore-echo=yes SQLITE-CLI-RECOVER-WITNESS
Не выводить SQL схемы, который не является одним оператором. Разделять по первой подготовке, выводить только этот оператор или отклонять строку. Экранировать обычный CREATE так, как это уже делает дамп виртуальных таблиц через %q. Считать последующую строку . враждебной и отбрасывать её. --safe на восстанавливающем sqlite3 блокирует .shell; он не включён в документированном конвейере.
b09c88c14082339b66c7b7158d609a771e64ca69).recover и последующее восстановлениеext/recover/sqlite3recover.c recoverOneStmt / recoverWriteSchema1src/shell.c.in recoverSqlCb, .dump printSchemaLine