
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
Classe: Command injection Reach: Locale
SQLite 3.53.4 (b09c88c) la CLI sqlite3 predefinita continua a trattare 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. La sqlite3 predefinita non attiva --safe. Non è libsqlite3. Oracle è echo di una stringa witness.
| ID | nessuna CVE al momento |
| Classe | Command injection (CLI go / / terminatore seguito da un dot-command successivo) |
| Reach | Locale (la vittima esegue la sqlite3 predefinita su SQL/script dell'attaccante senza --safe; 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) |
| Affected | 3.53.4 (b09c88c14082339b66c7b7158d609a771e64ca69) SOURCE_ID 2026-07-24 19:02:57 bf7c7f30031888f4e796e429ab3978879485813aaca6f641c7b33e4e09459bcc |
| Auth | la vittima fornisce uno script alla sqlite3 predefinita; 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 / e poi .shell / .output / .read vengono eseguiti con l'UID dell'operatore.
Un punto e virgola termina già un'istruzione. Ciò che resta è SQL terminante che non ha ;, quindi un wrapper che pensava che l'istruzione fosse ancora aperta esegue comunque il dot-command successivo. .shell è system(). L'oracolo del lab è echo di una witness. Non una reverse shell.
Venticinque ricerche nel sorgente della 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 script non attendibili (CVE-2022-46908). Blocca ancora .shell. La sqlite3 predefinita non lo attiva.
src/shell.c.in ha ancora il percorso di compatibilità SQL Server / Oracle. Il trunk ac6ac0c22d (2026-10-08) lo disabilita a meno che non sia definito SQLITE_SHELL_LEGACY_COMMAND_TERMINATOR. Quel check-in è successivo a questa GA.
Vicoli ciechi già registrati: trattare un punto e virgola come lo stesso residuo; ri-segnalare CVE-2022-46908; aspettarsi che --safe sia predefinito; chiamare questo RCE di libsqlite3; usare una reverse shell come oracolo; fissare la 3.54.0 (bozza).
cd lab
./run.sh
Compila la sqlite-src-3530400 ufficiale nella sqlite3 Unix predefinita (--disable-readline). Compose sqlite-cli-go. TCP fittizio su 127.0.0.1:18920. La CLI predefinita ha trattato go e / come terminatori e poi 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 sia definito -DSQLITE_SHELL_LEGACY_COMMAND_TERMINATOR. Fino ad allora, eseguire 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