
SQLite 3.53.4 CLI - Alta - Locale - Command injection - go e terminatori slash poi dot-command
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · sqlite-cli-go
Write-up: https://abraxaslabs.tech/research/sqlite-cli-go
Classe: Command injection Portata: Locale
La CLI predefinita sqlite3 di SQLite 3.53.4 (b09c88c) tratta ancora go di SQL Server e / di Oracle come terminatori di istruzione. line_is_command_terminator riscrive quella riga in ;. La riga successiva con un buffer SQL vuoto è do_meta_command, quindi .shell / .output / .read vengono eseguiti con l'UID dell'operatore.
--safe blocca ancora .shell. Quel controllo regge. Il sqlite3 predefinito non attiva --safe. Non è libsqlite3. L'oracolo è un echo di una stringa witness.
| ID | nessuna CVE al momento |
| Classe | Command injection (terminatore CLI go / / seguito da un successivo dot-command) |
| Portata | Locale (la vittima esegue il sqlite3 predefinito su SQL/script dell'attaccante senza --safe; UI:R) |
| CWE | CWE-78 |
| CVSS | Alto: 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 fornisce uno script al sqlite3 predefinito; nessun --safe |
| Licenza | GNU Affero GPL v3.0 |
| Lab | solo 127.0.0.1:18920. Witness SQLITE-CLI-GO-WITNESS. |
Dopo SQL non terminato in uno script che l'operatore fornisce a sqlite3 senza --safe, una riga go o / seguita da .shell / .output / .read viene eseguita con l'UID dell'operatore.
Un punto e virgola termina già un'istruzione. Ciò che resta è SQL terminante privo di ;, quindi un wrapper che riteneva l'istruzione ancora aperta esegue comunque il dot-command successivo. .shell è system(). L'oracolo del lab è un echo di una witness. Non una reverse shell.
Venti ricerche nel sorgente di 3.53.4 dopo OpenLiteSpeed. Ultima GA, non la bozza 3.54.0. Le estensioni della CLI non sono la libreria predefinita. --safe è il sink documentato per gli script non attendibili (CVE-2022-46908). Blocca ancora .shell. Il sqlite3 predefinito non lo attiva.
src/shell.c.in contiene ancora il percorso di compatibilità SQL Server / Oracle. Il trunk ac6ac0c22d (2026-10-08) lo disabilita a meno che non sia impostato SQLITE_SHELL_LEGACY_COMMAND_TERMINATOR. Quel check-in è successivo a questa GA.
Vicoli ciechi già registrati: considerare un punto e virgola come lo stesso residuo; ri-segnalare CVE-2022-46908; aspettarsi che --safe sia predefinito; definire questa una RCE di libsqlite3; usare una reverse shell come oracolo; fissare la 3.54.0 (bozza).
cd lab
./run.sh
Compila sqlite-src-3530400 ufficiale nel sqlite3 Unix predefinito (--disable-readline). Compose sqlite-cli-go. TCP fittizio su 127.0.0.1:18920. La CLI predefinita ha trattato go e / come terminatori, quindi ha eseguito .shell echo SQLITE-CLI-GO-WITNESS. --safe ha stampato cannot run .shell in safe mode. Bind su loopback.
SUCCESS sqlite-cli-go how=go-then-dot-shell slash=yes safe=blocked SQLITE-CLI-GO-WITNESS
Smettere di trattare go e / come terminatori, che è ciò che fa il trunk ac6ac0c22d a meno che non si usi -DSQLITE_SHELL_LEGACY_COMMAND_TERMINATOR. Fino ad allora, eseguire gli script non attendibili con --safe. --safe è il controllo che regge ancora.
b09c88c14082339b66c7b7158d609a771e64ca69)src/shell.c.in line_is_command_terminator, riscrittura di process_input, do_meta_command, .shell system() dopo failIfSafeMode--safe--safe