
SQLite 3.53.4 CLI - Alta - Locale - Command injection - recover dump emette uno schema ostile come comando dot
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · sqlite-cli-recover
Classe: Command injection Portata: Locale
La CLI di SQLite 3.53.4 (b09c88c) .recover stampa un sqlite_schema.sql ostile come successivo dot-command. recoverOneStmt prepara solo la prima istruzione. Un CREATE TABLE impiantato più un .shell su nuova riga viene comunque scritto. La pipe di ripristino documentata lo esegue con l'UID dell'operatore.
.dump printSchemaLine è la stessa classe di emissione. Non libsqlite3. Non --safe. L'oracolo è echo di una stringa testimone.
| ID | nessuna CVE al momento |
| Classe | Command injection (CLI .recover / .dump schema emit) |
| Portata | Locale (la vittima esegue la pipe di recover documentata; 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 |
| Prodotto | SQLite (CLI sqlite3) |
| Affetto | 3.53.4 (b09c88c14082339b66c7b7158d609a771e64ca69) SOURCE_ID 2026-07-24 19:02:57 bf7c7f30031888f4e796e429ab3978879485813aaca6f641c7b33e4e09459bcc |
| Auth | la vittima esegue sqlite3 hostile.db .recover | sqlite3 restored.db |
| Licenza | GNU Affero GPL v3.0 |
| Lab | solo 127.0.0.1:18930. Testimone SQLITE-CLI-RECOVER-WITNESS. |
Impianta un primo CREATE valido più un successivo .shell in sqlite_schema.sql. Una vittima che recupera quel db in un secondo sqlite3 esegue il dot-command con il proprio UID.
L'impianto è un file .db. L'azione della vittima è la pipe di recover documentata, non una riga go incollata e non --safe disattivato per errore. .shell è system(). L'oracolo del lab è echo di un testimone. Non una reverse shell.
Venti ricerche nel sorgente della 3.53.4. La ricerca di recover stessa ha definito recoverOneStmt un prepare solo-prima-istruzione e si è fermata lì. Il residuo è il percorso di stampa: recoverSqlCb emette comunque il testo extra. Fare il pipe di quello script è il modo in cui sqlite.org ti dice di ripristinare.
Vicoli ciechi già registrati: trattare il prepare della prima istruzione come una rimozione; fissare la 3.54.0 (bozza); riproporre CVE-2022-46908 --safe; chiamare questa RCE di libsqlite3; usare una reverse shell come oracolo.
cd lab
./run.sh
Compila sqlite-src-3530400 in sqlite3 con il recover CLI Unix predefinito (OPT_SHELL / SQLITE_ENABLE_DBPAGE_VTAB). writable_schema dopo .dbconfig defensive off. Impiantato CREATE TABLE t(x); più .shell echo SQLITE-CLI-RECOVER-WITNESS su nuova riga. .recover ha stampato .shell. In pipe verso un secondo sqlite3, è stato eseguito. Bind su loopback.
SUCCESS sqlite-cli-recover how=recover-pipe-dot-shell recover-has-shell=yes restore-echo=yes SQLITE-CLI-RECOVER-WITNESS
Non stampare SQL di schema che non sia una singola istruzione. Dividi al primo prepare, emetti solo quell'istruzione, oppure rifiuta la riga. Quota il CREATE ordinario nel modo in cui il dump delle virtual-table usa già %q. Tratta una successiva riga . come ostile e scartala. --safe sul sqlite3 di ripristino blocca .shell; non è attivo nella pipe documentata.
b09c88c14082339b66c7b7158d609a771e64ca69).recover documentato poi ripristinoext/recover/sqlite3recover.c recoverOneStmt / recoverWriteSchema1src/shell.c.in recoverSqlCb, .dump printSchemaLine