
SQLite 3.53.4 sqlite3_rsync – Hoch – Remote – RCE – SSH-Dateinamen-Befehlsinjektion
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · sqlite-rsync-ssh
Write-up: https://abraxaslabs.tech/research/sqlite-rsync-ssh
Klasse: RCE (Command Injection) Reichweite: Remote (UI:R)
SQLite 3.53.4 (b09c88c) sqlite3_rsync setzt USER@HOST:PATH für lokales /bin/sh -c in Anführungszeichen. OpenSSH fügt dann die entfernten argv für die Login-Shell per Leerzeichen zusammen – ohne diese Anführungszeichen. 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 | Hoch: 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 entfernten 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 Anführungszeichen werden lokal verbraucht. OpenSSH verkettet die verbleibenden argv zu einem einzigen entfernten Befehlsstring. Die Login-Shell sieht die Metazeichen ohne Anführungszeichen.
Dies ist nicht libsqlite3. Das Standard-sqlite3.c liefert dieses Protokoll nicht mit. Der Ada-Logics-Replica-Stack-Smash (Exponenten-Cap in readPow2) ist bei 3.53.4 bereits geschlossen.
Zwanzig Quellcode-Durchsuchungen des SQLite-Tags version-3.53.4 nach der 3.53.2-FTS5-/Session-Welle. Die Standardbibliothek enthält 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 zu behandeln; eine Reverse Shell im Lab zu testen; mit einem echten sshd zu kommunizieren; den Entwurf 3.54.0 zu pinnen; dies als Library-RCE zu bezeichnen.
cd lab
./run.sh
Baut sqlite3_rsync aus dem offiziellen 3.53.4-Quellcode-Zip. Fake-OpenSSH fügt argv nach dest zusammen. Origin lab@host:;echo SQLITE-RSYNC-SSH-WITNESS>/work/sandbox/pwned.txt. Der entfernte Befehl enthielt ein nicht in Anführungszeichen gesetztes ;echo. Bind auf Loopback.
SUCCESS sqlite-rsync-ssh how=openssh-argv-join dest=lab@host remote-has-semicolon=yes SQLITE-RSYNC-SSH-WITNESS
Dateinamen, die an den Peer gesendet werden (isFilename==2 / --encoded-filenames), hex-kodieren, so wie es Trunk b0db2db (2026-10-07, ANT-2026-31X9HVRR) nach diesem GA tut. USER@HOST und --ssh bleiben bei lokaler sh-Quotierung. Verlasse dich nicht darauf, dass lokale einfache Anführungszeichen das OpenSSH-argv-Join überstehen.
b09c88c14082339b66c7b7158d609a771e64ca69)append_escaped_arg, popen2, entfernte ORIGIN/REPLICA-SSH-argvb0db2db / Fossil eaec2f7f (2026-10-07)