
SQLite 3.53.4 sqlite3_rsync - Alta - Remoto - RCE - Injeção de comando no nome de arquivo SSH
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · sqlite-rsync-ssh
Classe: RCE (injeção de comando) Alcance: Remoto (UI:R)
SQLite 3.53.4 (b09c88c) sqlite3_rsync coloca USER@HOST:PATH entre aspas para o /bin/sh -c local. O OpenSSH então junta com espaços o argv remoto para o shell de login sem essas aspas. Um ponto e vírgula, $(), crase ou | no PATH é executado como o UID remoto do SSH. Utilitário, não libsqlite3. O stack smash readPow2 x>16 do Ada Logics está fechado neste pin.
| ID | ainda sem CVE |
| Classe | RCE (injeção de comando como o UID remoto do SSH) |
| Alcance | Remoto (a vítima executa 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 |
| Produto | SQLite utilitário sqlite3_rsync |
| Afetado | 3.53.4 (b09c88c14082339b66c7b7158d609a771e64ca69, SOURCE_ID 2026-07-24 19:02:57 bf7c7f30031888f4e796e429ab3978879485813aaca6f641c7b33e4e09459bcc) |
| Autenticação | a vítima executa sqlite3_rsync com um USER@HOST:PATH hostil |
| Licença | GNU Affero GPL v3.0 |
| Lab | apenas 127.0.0.1:18910. Testemunha de echo. Sem reverse shell. |
Coloque ;, $(), crases ou | no caminho remoto de sqlite3_rsync USER@HOST:PATH. A vítima precisa executar o utilitário (UI:R). O comando extra é executado como o UID remoto do SSH.
append_escaped_arg(..., 1) coloca aspas simples para o /bin/sh -c local. Essas aspas são consumidas localmente. O OpenSSH concatena o argv restante em uma única string de comando remoto. O shell de login vê os metacaracteres sem aspas.
Isto não é libsqlite3. O sqlite3.c padrão não inclui este protocolo. O stack smash da réplica do Ada Logics (limite de expoente do readPow2) já está fechado na 3.53.4.
Vinte buscas no código-fonte da tag version-3.53.4 do SQLite após a onda FTS5 / session da 3.53.2. A biblioteca padrão ainda tem outros resquícios (este pacote é o utilitário rsync). tool/sqlite3_rsync.c popen2 executa /bin/sh -c. hostSeparator divide no primeiro dois-pontos. O retorno de append_escaped_arg nunca é verificado.
Caminhos errados: tratar o stack smash do Ada Logics como ainda aberto; montar um lab de reverse shell; falar com um sshd real; fixar o rascunho 3.54.0; chamar isto de RCE de biblioteca.
cd lab
./run.sh
Compila sqlite3_rsync a partir do zip oficial do código-fonte 3.53.4. O falso OpenSSH junta o argv após o dest. Origem lab@host:;echo SQLITE-RSYNC-SSH-WITNESS>/work/sandbox/pwned.txt. O comando remoto tinha ;echo sem aspas. Bind em loopback.
SUCCESS sqlite-rsync-ssh how=openssh-argv-join dest=lab@host remote-has-semicolon=yes SQLITE-RSYNC-SSH-WITNESS
Codificar em hexadecimal os nomes de arquivo enviados ao par (isFilename==2 / --encoded-filenames) da forma como o trunk b0db2db (2026-10-07, ANT-2026-31X9HVRR) faz após este GA. USER@HOST e --ssh permanecem com quoting sh local. Não confie que aspas simples locais sobrevivam à junção de argv do OpenSSH.
b09c88c14082339b66c7b7158d609a771e64ca69)append_escaped_arg, popen2, remote ORIGIN/REPLICA SSH argvb0db2db / Fossil eaec2f7f (2026-10-07)