
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
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, $(), backtick o | en PATH se ejecuta como el UID remoto de SSH. Util, no libsqlite3. El desbordamiento de pila readPow2 x>16 de Ada Logics está cerrado en este pin.
| ID | sin CVE todavía |
| Clase | RCE (inyección de comandos como 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 util sqlite3_rsync |
| Afectado | 3.53.4 (b09c88c14082339b66c7b7158d609a771e64ca69, SOURCE_ID 2026-07-24 19:02:57 bf7c7f30031888f4e796e429ab3978879485813aaca6f641c7b33e4e09459bcc) |
| Auth | la víctima ejecuta sqlite3_rsync con un USER@HOST:PATH hostil |
| Licencia | GNU Affero GPL v3.0 |
| Lab | solo 127.0.0.1:18910. Testigo de eco. Sin reverse shell. |
Coloca ;, $(), backticks o | en la ruta remota de sqlite3_rsync USER@HOST:PATH. La víctima debe ejecutar el util (UI:R). El comando extra se ejecuta como 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 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 todavía tiene otros restos (este paquete es el util rsync). tool/sqlite3_rsync.c popen2 ejecuta /bin/sh -c. hostSeparator divide en el primer dos puntos. El 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 una 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. El OpenSSH falso une el argv después de dest. Origen lab@host:;echo SQLITE-RSYNC-SSH-WITNESS>/work/sandbox/pwned.txt. El comando remoto tenía ;echo sin comillas. Bind 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 lo hace el trunk b0db2db (2026-10-07, ANT-2026-31X9HVRR) después de este GA. USER@HOST y --ssh permanecen con quoting 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, remote ORIGIN/REPLICA SSH argvb0db2db / Fossil eaec2f7f (2026-10-07)