
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
Classe : RCE (injection de commande) Portée : Distante (UI:R)
SQLite 3.53.4 (b09c88c) sqlite3_rsync met USER@HOST:PATH entre guillemets pour le /bin/sh -c local. OpenSSH joint ensuite par des espaces les argv distants pour le shell de connexion sans ces guillemets. Un point-virgule, $(), un backtick ou | dans PATH s'exécute en tant qu'UID distant SSH. Utilitaire, pas libsqlite3. Le stack smash readPow2 x>16 d'Ada Logics est fermé sur ce pin.
| ID | pas encore de CVE |
| Classe | RCE (injection de commande en tant qu'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 echo. Pas de reverse shell. |
Placez ;, $(), 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 en tant qu'UID distant SSH.
append_escaped_arg(..., 1) met entre guillemets simples pour le /bin/sh -c local. Ces guillemets sont consommés localement. OpenSSH concatène les argv restants en une seule chaîne de commande distante. Le shell de connexion voit les métacaractères non protégés par des 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à fermé sur 3.53.4.
Vingt recherches dans les sources 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 est l'utilitaire rsync). tool/sqlite3_rsync.c popen2 exécute /bin/sh -c. hostSeparator découpe sur le 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 ; parler à un vrai sshd ; épingler le brouillon 3.54.0 ; qualifier cela de RCE de bibliothèque.
cd lab
./run.sh
Compile sqlite3_rsync depuis l'archive source officielle 3.53.4. Le faux OpenSSH joint les argv après dest. Origine lab@host:;echo SQLITE-RSYNC-SSH-WITNESS>/work/sandbox/pwned.txt. La commande distante contenait ;echo non protégé par des 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 sh local. Ne pas compter sur la survie des guillemets simples locaux à la jointure argv d'OpenSSH.
b09c88c14082339b66c7b7158d609a771e64ca69)append_escaped_arg, popen2, argv SSH distant ORIGIN/REPLICAb0db2db / Fossil eaec2f7f (2026-10-07)