
SQLite 3.53.4 CLI - Élevé - Local - Injection de commande - go et terminateurs slash puis dot-command
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · sqlite-cli-go
Classe : Injection de commande Portée : Locale
SQLite 3.53.4 (b09c88c) l'interface sqlite3 par défaut traite toujours go de SQL Server et / d'Oracle comme des terminateurs d'instruction. line_is_command_terminator réécrit cette ligne en ;. La ligne suivante avec un tampon SQL vide est do_meta_command, donc .shell / .output / .read s'exécutent avec l'UID de l'opérateur.
--safe bloque toujours .shell. Ce contrôle tient. Le sqlite3 par défaut n'active pas --safe. Pas libsqlite3. Oracle est un echo d'une chaîne témoin.
| ID | pas encore de CVE |
| Classe | Injection de commande (terminateur CLI go / / puis une dot-commande ultérieure) |
| Portée | Locale (la victime exécute le sqlite3 par défaut sur du SQL/un script attaquant sans --safe ; UI:R) |
| CWE | CWE-78 |
| CVSS | Élevé : 7.8 CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H |
| Produit | SQLite (interface sqlite3) |
| Affecté | 3.53.4 (b09c88c14082339b66c7b7158d609a771e64ca69) SOURCE_ID 2026-07-24 19:02:57 bf7c7f30031888f4e796e429ab3978879485813aaca6f641c7b33e4e09459bcc |
| Auth | la victime fournit un script au sqlite3 par défaut ; pas de --safe |
| Licence | GNU Affero GPL v3.0 |
| Lab | 127.0.0.1:18920 uniquement. Témoin SQLITE-CLI-GO-WITNESS. |
Après du SQL non terminé dans un script que l'opérateur fournit à sqlite3 sans --safe, une ligne go ou / puis .shell / .output / .read s'exécutent avec l'UID de l'opérateur.
Un point-virgule termine déjà une instruction. Le reste est du SQL de terminaison qui n'a pas de ;, donc un wrapper qui croyait l'instruction encore ouverte exécute quand même la dot-commande suivante. .shell est system(). L'oracle du lab est un echo d'un témoin. Pas un reverse shell.
Vingt recherches dans le code source de 3.53.4 après OpenLiteSpeed. Dernière GA, pas le brouillon 3.54.0. Les extras du CLI ne sont pas la bibliothèque par défaut. --safe est le puits documenté pour les scripts non fiables (CVE-2022-46908). Il bloque toujours .shell. Le sqlite3 par défaut ne l'active pas.
src/shell.c.in contient toujours le chemin de compatibilité SQL Server / Oracle. Le trunk ac6ac0c22d (2026-10-08) le désactive sauf si SQLITE_SHELL_LEGACY_COMMAND_TERMINATOR. Ce commit est postérieur à cette GA.
Fausses pistes déjà consignées : traiter un point-virgule comme le même reste ; re-déposer CVE-2022-46908 ; s'attendre à ce que --safe soit par défaut ; qualifier cela de RCE libsqlite3 ; utiliser un reverse shell comme oracle ; épingler 3.54.0 (brouillon).
cd lab
./run.sh
Compile le sqlite-src-3530400 officiel en sqlite3 Unix par défaut (--disable-readline). Compose sqlite-cli-go. TCP factice sur 127.0.0.1:18920. Le CLI par défaut a traité go et / comme terminateurs puis a exécuté .shell echo SQLITE-CLI-GO-WITNESS. --safe a affiché 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
Cesser de traiter go et / comme des terminateurs, ce que fait le trunk ac6ac0c22d sauf avec -DSQLITE_SHELL_LEGACY_COMMAND_TERMINATOR. D'ici là, exécuter les scripts non fiables avec --safe. --safe est le contrôle qui tient toujours.
b09c88c14082339b66c7b7158d609a771e64ca69)src/shell.c.in line_is_command_terminator, réécriture de process_input, do_meta_command, .shell system() après failIfSafeMode--safe--safe