
SQLite 3.53.4 sqlite3_rsync - Alta - Remota - RCE - Inyección de comandos en nombre de archivo SSH
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · sqlite-rsync-ssh
Análisis: https://abraxaslabs.tech/research/sqlite-rsync-ssh
Clase: RCE (inyección de comandos) Alcance: Remoto (UI:R)
SQLite 3.53.4 (b09c88c) sqlite3_rsync entrecomilla USER@HOST:PATH para el /bin/sh -c local. OpenSSH luego une con espacios el argv remoto para el shell de inicio de sesión sin esas comillas. Un punto y coma, $(), una comilla invertida o | en PATH se ejecuta con el UID remoto de SSH. Es una utilidad, no libsqlite3. El desbordamiento de pila de readPow2 x>16 de Ada Logics está cerrado en esta versión fijada.
| ID | aún sin CVE |
| Clase | RCE (inyección de comandos con el UID remoto de SSH) |
| Alcance | Remoto (la víctima ejecuta sqlite3_rsync; UI:R) |
| CWE | CWE-78 |
| CVSS | Alto: 8.8 CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H |
| Producto | SQLite utilidad sqlite3_rsync |
| Afectado | 3.53.4 (b09c88c14082339b66c7b7158d609a771e64ca69, SOURCE_ID 2026-07-24 19:02:57 bf7c7f30031888f4e796e429ab3978879485813aaca6f641c7b33e4e09459bcc) |
| Autenticación | la víctima ejecuta sqlite3_rsync con un USER@HOST:PATH hostil |
| Licencia | GNU Affero GPL v3.0 |
| Laboratorio | solo 127.0.0.1:18910. Testigo por eco. Sin reverse shell. |
Coloca ;, $(), comillas invertidas o | en la ruta remota de sqlite3_rsync USER@HOST:PATH. La víctima debe ejecutar la utilidad (UI:R). El comando adicional se ejecuta con el UID remoto de SSH.
append_escaped_arg(..., 1) entrecomilla con comillas simples para el /bin/sh -c local. Esas comillas se consumen localmente. OpenSSH concatena el argv restante en una única cadena de comando remota. El shell de inicio de sesión ve los metacaracteres sin comillas.
Esto no es libsqlite3. El sqlite3.c por defecto no incluye este protocolo. El desbordamiento de pila de la réplica de Ada Logics (límite del exponente en readPow2) ya está cerrado en 3.53.4.
Veinte búsquedas en el código fuente de la etiqueta version-3.53.4 de SQLite tras la oleada de FTS5 / session de 3.53.2. La biblioteca por defecto aún tiene otros restos (este paquete es la utilidad rsync). tool/sqlite3_rsync.c popen2 ejecuta /bin/sh -c. hostSeparator divide en el primer dos puntos. El valor de retorno de append_escaped_arg nunca se comprueba.
Caminos equivocados: tratar el desbordamiento de pila de Ada Logics como aún abierto; montar un laboratorio con reverse shell; hablar con un sshd real; fijar el borrador 3.54.0; llamar a esto un RCE de biblioteca.
cd lab
./run.sh
Compila sqlite3_rsync desde el zip oficial del código fuente 3.53.4. Un OpenSSH falso une el argv tras el destino. Origen lab@host:;echo SQLITE-RSYNC-SSH-WITNESS>/work/sandbox/pwned.txt. El comando remoto tenía ;echo sin comillas. Enlace en loopback.
SUCCESS sqlite-rsync-ssh how=openssh-argv-join dest=lab@host remote-has-semicolon=yes SQLITE-RSYNC-SSH-WITNESS
Codifica en hexadecimal los nombres de archivo enviados al par (isFilename==2 / --encoded-filenames) tal como hace el trunk b0db2db (2026-10-07, ANT-2026-31X9HVRR) tras esta GA. USER@HOST y --ssh siguen usando el entrecomillado local de sh. No confíes en que las comillas simples locales sobrevivan a la unión de argv de OpenSSH.
b09c88c14082339b66c7b7158d609a771e64ca69)append_escaped_arg, popen2, argv SSH remoto de ORIGIN/REPLICAb0db2db / Fossil eaec2f7f (2026-10-07)