
SQLite 3.53.4 CLI - Hoch - Lokal - Command Injection - go und Slash-Terminatoren, dann Dot-Command
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · sqlite-cli-go
Klasse: Command Injection Reichweite: Lokal
Die Standard-sqlite3-CLI von SQLite 3.53.4 (b09c88c) behandelt SQL-Server-go und Oracle-/ weiterhin als Statement-Terminatoren. line_is_command_terminator schreibt diese Zeile in ; um. Die nächste Zeile mit leerem SQL-Puffer ist do_meta_command, sodass .shell / .output / .read als UID des Operators ausgeführt werden.
--safe blockiert .shell weiterhin. Diese Kontrolle hält. Standard-sqlite3 aktiviert --safe nicht. Nicht libsqlite3. Oracle ist echo eines Witness-Strings.
| ID | noch keine CVE |
| Klasse | Command Injection (CLI-go / /-Terminator, dann ein späterer Dot-Command) |
| Reichweite | Lokal (Opfer führt Standard-sqlite3 auf Angreifer-SQL/Skript ohne --safe aus; 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 |
| Produkt | SQLite (sqlite3 CLI) |
| Betroffen | 3.53.4 (b09c88c14082339b66c7b7158d609a771e64ca69) SOURCE_ID 2026-07-24 19:02:57 bf7c7f30031888f4e796e429ab3978879485813aaca6f641c7b33e4e09459bcc |
| Auth | Opfer speist ein Skript in Standard-sqlite3 ein; kein --safe |
| Lizenz | GNU Affero GPL v3.0 |
| Lab | nur 127.0.0.1:18920. Witness SQLITE-CLI-GO-WITNESS. |
Nach nicht abgeschlossenem SQL in einem Skript, das der Operator ohne --safe in sqlite3 einspeist, wird eine go- oder /-Zeile gefolgt von .shell / .output / .read als UID des Operators ausgeführt.
Ein Semikolon beendet bereits ein Statement. Der Rest ist abschließendes SQL ohne ;, sodass ein Wrapper, der das Statement noch für offen hielt, den nächsten Dot-Command trotzdem ausführt. .shell ist system(). Das Lab-Oracle ist echo eines Witness. Keine Reverse Shell.
Zwanzig Source-Hunts von 3.53.4 nach OpenLiteSpeed. Neuestes GA, nicht der 3.54.0-Draft. CLI-Extras sind nicht die Standardbibliothek. --safe ist der dokumentierte Sink für nicht vertrauenswürdige Skripte (CVE-2022-46908). Es blockiert .shell weiterhin. Standard-sqlite3 aktiviert es nicht.
src/shell.c.in enthält weiterhin den SQL-Server-/Oracle-Kompatibilitätspfad. Trunk ac6ac0c22d (2026-10-08) deaktiviert ihn, außer bei SQLITE_SHELL_LEGACY_COMMAND_TERMINATOR. Dieser Check-in erfolgt nach diesem GA.
Bereits dokumentierte Irrwege: ein Semikolon als denselben Rest behandeln; CVE-2022-46908 erneut einreichen; erwarten, dass --safe Standard ist; dies als libsqlite3-RCE bezeichnen; eine Reverse Shell als Oracle verwenden; 3.54.0 (Draft) pinnen.
cd lab
./run.sh
Baut offizielles sqlite-src-3530400 in Standard-Unix-sqlite3 (--disable-readline). Compose sqlite-cli-go. Dummy-TCP auf 127.0.0.1:18920. Standard-CLI behandelte go und / als Terminatoren und führte dann .shell echo SQLITE-CLI-GO-WITNESS aus. --safe gab cannot run .shell in safe mode aus. Bind Loopback.
SUCCESS sqlite-cli-go how=go-then-dot-shell slash=yes safe=blocked SQLITE-CLI-GO-WITNESS
go und / nicht mehr als Terminatoren behandeln, was Trunk ac6ac0c22d tut, außer bei -DSQLITE_SHELL_LEGACY_COMMAND_TERMINATOR. Bis dahin nicht vertrauenswürdige Skripte mit --safe ausführen. --safe ist die Kontrolle, die weiterhin hält.
b09c88c14082339b66c7b7158d609a771e64ca69)src/shell.c.in line_is_command_terminator, process_input-Rewrite, do_meta_command, .shell system() nach failIfSafeMode--safe--safe