
SQLite 3.53.4 sqlite3_rsync - Élevé - À distance - RCE - Injection de commande via nom de fichier SSH
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · sqlite-rsync-ssh
Write-up : https://abraxaslabs.tech/research/sqlite-rsync-ssh
Classe : RCE (injection de commande) Portée : Distante (UI:R)
SQLite 3.53.4 (b09c88c) sqlite3_rsync met entre guillemets USER@HOST:PATH pour le /bin/sh -c local. OpenSSH joint ensuite par des espaces l'argv distant pour le shell de connexion sans ces guillemets. Un point-virgule, $(), un backtick ou | dans PATH s'exécute avec l'UID distant SSH. Utilitaire, pas libsqlite3. Le stack smash readPow2 x>16 d'Ada Logics est corrigé sur ce pin.
| ID | pas encore de CVE |
| Classe | RCE (injection de commande avec l'UID distant SSH) |
| Portée | Distante (la victime exécute sqlite3_rsync ; UI:R) |
| CWE | CWE-78 |
| CVSS | Élevé : 8.8 CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H |
| Produit | SQLite utilitaire sqlite3_rsync |
| Affecté | 3.53.4 (b09c88c14082339b66c7b7158d609a771e64ca69, SOURCE_ID 2026-07-24 19:02:57 bf7c7f30031888f4e796e429ab3978879485813aaca6f641c7b33e4e09459bcc) |
| Auth | la victime exécute sqlite3_rsync avec un USER@HOST:PATH hostile |
| Licence | GNU Affero GPL v3.0 |
| Lab | 127.0.0.1:18910 uniquement. Témoin par echo. Pas de reverse shell. |
Placer ;, $(), des backticks ou | dans le chemin distant de sqlite3_rsync USER@HOST:PATH. La victime doit exécuter l'utilitaire (UI:R). La commande supplémentaire s'exécute avec l'UID distant SSH.
append_escaped_arg(..., 1) entoure d'apostrophes pour le /bin/sh -c local. Ces apostrophes sont consommées localement. OpenSSH concatène l'argv restant en une seule chaîne de commande distante. Le shell de connexion voit les métacaractères sans guillemets.
Ce n'est pas libsqlite3. Le sqlite3.c par défaut n'embarque pas ce protocole. Le stack smash de la réplique Ada Logics (plafond d'exposant readPow2) est déjà corrigé sur 3.53.4.
Vingt recherches dans le code source du tag SQLite version-3.53.4 après la vague FTS5 / session de 3.53.2. La bibliothèque par défaut contient encore d'autres résidus (ce pack concerne l'utilitaire rsync). tool/sqlite3_rsync.c popen2 exécute /bin/sh -c. hostSeparator découpe au premier deux-points. Le retour de append_escaped_arg n'est jamais vérifié.
Fausses pistes : considérer le stack smash d'Ada Logics comme encore ouvert ; monter un reverse shell en lab ; dialoguer avec un vrai sshd ; épingler le brouillon 3.54.0 ; qualifier cela de RCE de bibliothèque.
cd lab
./run.sh
Compile sqlite3_rsync à partir de l'archive source officielle 3.53.4. Un faux OpenSSH joint l'argv après dest. Origine lab@host:;echo SQLITE-RSYNC-SSH-WITNESS>/work/sandbox/pwned.txt. La commande distante contenait ;echo sans guillemets. Bind sur loopback.
SUCCESS sqlite-rsync-ssh how=openssh-argv-join dest=lab@host remote-has-semicolon=yes SQLITE-RSYNC-SSH-WITNESS
Encoder en hexadécimal les noms de fichiers envoyés au pair (isFilename==2 / --encoded-filenames) comme le fait le trunk b0db2db (2026-10-07, ANT-2026-31X9HVRR) après cette GA. USER@HOST et --ssh restent en quoting local sh. Ne pas compter sur la survie des apostrophes locales à la jointure d'argv d'OpenSSH.
b09c88c14082339b66c7b7158d609a771e64ca69)append_escaped_arg, popen2, argv SSH distant ORIGIN/REPLICAb0db2db / Fossil eaec2f7f (2026-10-07)