
SQLite 3.53.4 sqlite3_rsync – Hoch – Remote – RCE – SSH-Dateinamen-Befehlsinjektion
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · sqlite-rsync-ssh
Klasse: RCE (Command Injection) Reichweite: Remote (UI:R)
SQLite 3.53.4 (b09c88c) sqlite3_rsync quotet USER@HOST:PATH für lokales /bin/sh -c. OpenSSH fügt dann die Remote-argv per Leerzeichen für die Login-Shell zusammen, ohne diese Quotes. Ein Semikolon, $(), Backtick oder | in PATH wird als SSH-Remote-UID ausgeführt. Util, nicht libsqlite3. Der Ada Logics readPow2 x>16 Stack-Smash ist bei diesem Pin geschlossen.
| ID | noch keine CVE |
| Klasse | RCE (Command Injection als SSH-Remote-UID) |
| Reichweite | Remote (Opfer führt sqlite3_rsync aus; UI:R) |
| CWE | CWE-78 |
| CVSS | High: 8.8 CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H |
| Produkt | SQLite sqlite3_rsync Util |
| Betroffen | 3.53.4 (b09c88c14082339b66c7b7158d609a771e64ca69, SOURCE_ID 2026-07-24 19:02:57 bf7c7f30031888f4e796e429ab3978879485813aaca6f641c7b33e4e09459bcc) |
| Auth | Opfer führt sqlite3_rsync mit einem feindlichen USER@HOST:PATH aus |
| Lizenz | GNU Affero GPL v3.0 |
| Lab | nur 127.0.0.1:18910. Echo-Witness. Keine Reverse Shell. |
Setze ;, $(), Backticks oder | in den Remote-Pfad von sqlite3_rsync USER@HOST:PATH. Das Opfer muss das Util ausführen (UI:R). Der zusätzliche Befehl läuft als SSH-Remote-UID.
append_escaped_arg(..., 1) setzt einfache Anführungszeichen für lokales /bin/sh -c. Diese Quotes werden lokal verbraucht. OpenSSH konkateniert die verbleibende argv zu einem einzigen Remote-Befehlstring. Die Login-Shell sieht die Metazeichen unquoted.
Dies ist nicht libsqlite3. Das Standard-sqlite3.c liefert dieses Protokoll nicht mit. Der Ada Logics Replica Stack-Smash (Cap des readPow2-Exponenten) ist bei 3.53.4 bereits geschlossen.
Zwanzig Source-Hunts des SQLite-Tags version-3.53.4 nach der 3.53.2 FTS5-/Session-Welle. Die Standardbibliothek hat noch andere Überbleibsel (dieses Paket ist das rsync-Util). tool/sqlite3_rsync.c popen2 führt /bin/sh -c aus. hostSeparator trennt am ersten Doppelpunkt. Der Rückgabewert von append_escaped_arg wird nie geprüft.
Irrwege: den Ada Logics Stack-Smash als noch offen behandeln; eine Reverse Shell labben; mit einem echten sshd sprechen; den Entwurf 3.54.0 pinnen; dies als Library-RCE bezeichnen.
cd lab
./run.sh
Baut sqlite3_rsync aus dem offiziellen 3.53.4 Source-Zip. Fake-OpenSSH fügt argv nach dest zusammen. Origin lab@host:;echo SQLITE-RSYNC-SSH-WITNESS>/work/sandbox/pwned.txt. Der Remote-Befehl hatte unquoted ;echo. Bind Loopback.
SUCCESS sqlite-rsync-ssh how=openssh-argv-join dest=lab@host remote-has-semicolon=yes SQLITE-RSYNC-SSH-WITNESS
Hex-encode Dateinamen, die an den Peer gesendet werden (isFilename==2 / --encoded-filenames), so wie es Trunk b0db2db (2026-10-07, ANT-2026-31X9HVRR) nach diesem GA tut. USER@HOST und --ssh bleiben local-sh-quoting. Verlasse dich nicht darauf, dass lokale einfache Anführungszeichen das OpenSSH-argv-Join überleben.
b09c88c14082339b66c7b7158d609a771e64ca69)append_escaped_arg, popen2, remote ORIGIN/REPLICA SSH argvb0db2db / Fossil eaec2f7f (2026-10-07)