
SQLite 3.53.4 CLI - Alta - Local - Inyección de comandos - terminadores go y slash y luego comando punto
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · sqlite-cli-go
Clase: Inyección de comandos Alcance: Local
El CLI sqlite3 predeterminado de SQLite 3.53.4 (b09c88c) sigue tratando go de SQL Server y / de Oracle como terminadores de sentencia. line_is_command_terminator reescribe esa línea a ;. La siguiente línea con un búfer SQL vacío es do_meta_command, por lo que .shell / .output / .read se ejecutan con el UID del operador.
--safe sigue bloqueando .shell. Ese control se mantiene. El sqlite3 predeterminado no activa --safe. No es libsqlite3. Oracle es echo de una cadena testigo.
| ID | aún sin CVE |
| Clase | Inyección de comandos (terminador go / / del CLI y luego un dot-command posterior) |
| Alcance | Local (la víctima ejecuta el sqlite3 predeterminado sobre SQL/script del atacante sin --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 |
| Producto | SQLite (CLI sqlite3) |
| Afectado | 3.53.4 (b09c88c14082339b66c7b7158d609a771e64ca69) SOURCE_ID 2026-07-24 19:02:57 bf7c7f30031888f4e796e429ab3978879485813aaca6f641c7b33e4e09459bcc |
| Auth | la víctima entrega un script al sqlite3 predeterminado; sin --safe |
| Licencia | GNU Affero GPL v3.0 |
| Lab | solo 127.0.0.1:18920. Testigo SQLITE-CLI-GO-WITNESS. |
Tras SQL sin terminar en un script que el operador entrega a sqlite3 sin --safe, una línea go o / y luego .shell / .output / .read se ejecutan con el UID del operador.
Un punto y coma ya termina una sentencia. Lo que queda es SQL terminado que no tiene ;, por lo que un wrapper que creía que la sentencia seguía abierta aún ejecuta el siguiente dot-command. .shell es system(). El oráculo del lab es echo de un testigo. No es una reverse shell.
Veinte búsquedas en el código fuente de 3.53.4 después de OpenLiteSpeed. Última GA, no el borrador 3.54.0. Los extras del CLI no son la biblioteca predeterminada. --safe es el sink documentado para scripts no confiables (CVE-2022-46908). Sigue bloqueando .shell. El sqlite3 predeterminado no lo activa.
src/shell.c.in todavía tiene la ruta de compatibilidad con SQL Server / Oracle. El trunk ac6ac0c22d (2026-10-08) la desactiva a menos que se defina SQLITE_SHELL_LEGACY_COMMAND_TERMINATOR. Ese check-in es posterior a esta GA.
Caminos equivocados ya registrados: tratar un punto y coma como el mismo remanente; volver a reportar CVE-2022-46908; esperar que --safe sea predeterminado; llamar a esto RCE de libsqlite3; usar una reverse shell como oráculo; fijar 3.54.0 (borrador).
cd lab
./run.sh
Compila el sqlite-src-3530400 oficial en el sqlite3 Unix predeterminado (--disable-readline). Compose sqlite-cli-go. TCP dummy en 127.0.0.1:18920. El CLI predeterminado trató go y / como terminadores y luego ejecutó .shell echo SQLITE-CLI-GO-WITNESS. --safe imprimió cannot run .shell in safe mode. Bind loopback.
SUCCESS sqlite-cli-go how=go-then-dot-shell slash=yes safe=blocked SQLITE-CLI-GO-WITNESS
Dejar de tratar go y / como terminadores, que es lo que hace el trunk ac6ac0c22d a menos que se use -DSQLITE_SHELL_LEGACY_COMMAND_TERMINATOR. Hasta entonces, ejecutar scripts no confiables con --safe. --safe es el control que aún se mantiene.
b09c88c14082339b66c7b7158d609a771e64ca69)src/shell.c.in line_is_command_terminator, reescritura de process_input, do_meta_command, .shell system() después de failIfSafeMode--safe--safe