
SQLite 3.53.4 CLI - Alta - Local - Injeção de comando - terminadores go e barra e depois comando dot
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · sqlite-cli-go
Classe: Injeção de comando Alcance: Local
O CLI sqlite3 padrão do SQLite 3.53.4 (b09c88c) ainda trata go do SQL Server e / do Oracle como terminadores de instrução. line_is_command_terminator reescreve essa linha para ;. A linha seguinte com um buffer SQL vazio é do_meta_command, então .shell / .output / .read são executados com o UID do operador.
--safe ainda bloqueia .shell. Esse controle se mantém. O sqlite3 padrão não ativa --safe. Não é libsqlite3. O Oracle é echo de uma string testemunha.
| ID | ainda sem CVE |
| Classe | Injeção de comando (terminador go / / do CLI e depois um dot-command posterior) |
| Alcance | Local (a vítima executa o sqlite3 padrão sobre SQL/script do atacante sem --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 |
| Produto | SQLite (CLI sqlite3) |
| Afetado | 3.53.4 (b09c88c14082339b66c7b7158d609a771e64ca69) SOURCE_ID 2026-07-24 19:02:57 bf7c7f30031888f4e796e429ab3978879485813aaca6f641c7b33e4e09459bcc |
| Autenticação | a vítima fornece um script ao sqlite3 padrão; sem --safe |
| Licença | GNU Affero GPL v3.0 |
| Lab | apenas 127.0.0.1:18920. Testemunha SQLITE-CLI-GO-WITNESS. |
Após SQL não terminado em um script que o operador fornece ao sqlite3 sem --safe, uma linha go ou / e depois .shell / .output / .read são executados com o UID do operador.
Um ponto e vírgula já encerra uma instrução. O que sobra é SQL de terminação que não tem ;, então um wrapper que pensava que a instrução ainda estava aberta ainda executa o próximo dot-command. .shell é system(). O oráculo do lab é echo de uma testemunha. Não é um reverse shell.
Vinte buscas no código-fonte da 3.53.4 depois do OpenLiteSpeed. Última GA, não o rascunho 3.54.0. Os extras do CLI não são a biblioteca padrão. --safe é o sink documentado para scripts não confiáveis (CVE-2022-46908). Ele ainda bloqueia .shell. O sqlite3 padrão não o ativa.
src/shell.c.in ainda tem o caminho de compatibilidade com SQL Server / Oracle. O trunk ac6ac0c22d (2026-10-08) o desativa a menos que SQLITE_SHELL_LEGACY_COMMAND_TERMINATOR. Esse check-in é posterior a esta GA.
Caminhos errados já registrados: tratar um ponto e vírgula como o mesmo resto; reabrir o CVE-2022-46908; esperar que --safe fosse o padrão; chamar isso de RCE do libsqlite3; usar um reverse shell como oráculo; fixar na 3.54.0 (rascunho).
cd lab
./run.sh
Compila o sqlite-src-3530400 oficial no sqlite3 Unix padrão (--disable-readline). Compose sqlite-cli-go. TCP dummy em 127.0.0.1:18920. O CLI padrão tratou go e / como terminadores e então executou .shell echo SQLITE-CLI-GO-WITNESS. --safe imprimiu cannot run .shell in safe mode. Bind em loopback.
SUCCESS sqlite-cli-go how=go-then-dot-shell slash=yes safe=blocked SQLITE-CLI-GO-WITNESS
Pare de tratar go e / como terminadores, que é o que o trunk ac6ac0c22d faz a menos que -DSQLITE_SHELL_LEGACY_COMMAND_TERMINATOR. Até então, execute scripts não confiáveis com --safe. --safe é o controle que ainda se mantém.
b09c88c14082339b66c7b7158d609a771e64ca69)src/shell.c.in line_is_command_terminator, reescrita de process_input, do_meta_command, .shell system() após failIfSafeMode--safe--safe