Travessia de caminhos

Categoria do OWASP: MASVS-STORAGE - Armazenamento (link em inglês)

Visão geral

Vulnerabilidades de travessia de caminhos ocorrem quando um invasor pode controlar parte do caminho transmitido para as APIs do sistema de arquivos sem validação. Isso pode levar a operações não autorizadas do sistema de arquivos. Por exemplo, um invasor pode usar caracteres especiais, como ../, para mudar inesperadamente o destino de recurso, interrompendo o conteúdo fora do diretório de destino.

Impacto

O impacto varia dependendo da operação e do conteúdo do arquivo, mas geralmente causa substituição de arquivos (ao gravar arquivos), vazamento de dados (ao ler arquivos) ou mudanças de permissão (ao mudar permissões de arquivo/diretório).

Mitigações

Canonize o caminho usando File.getCanonicalPath() e compare o prefixo com o diretório esperado:

Kotlin

@Throws(IllegalArgumentException::class)
fun saferOpenFile(path: String, expectedDir: String?): File {
    val f = File(path)
    val canonicalPath = f.canonicalPath
    require(canonicalPath.startsWith(expectedDir!!))
    return f
}

Java

public File saferOpenFile (String path, String expectedDir) throws IllegalArgumentException {
  File f = new File(path);
  String canonicalPath = f.getCanonicalPath();
  if (!canonicalPath.startsWith(expectedDir)) {
    throw new IllegalArgumentException();
  }
  return f;
}

Outra prática recomendada é usar a validação para garantir que apenas os resultados esperados ocorram. Os exemplos incluem:

  • Verificar se o arquivo já existe para evitar uma substituição acidental
  • Conferir se o arquivo desejado é um destino esperado para evitar vazamentos de dados ou mudar permissões incorretamente.
  • Confirmar se o diretório atual da operação é exatamente o esperado no valor de retorno do caminho canônico.
  • Garantir que um sistema de permissões tenha escopo explícito para a operação, por exemplo, verificando se ele não está executando serviços como raiz e garantindo que as permissões do diretório estejam no escopo do serviço ou comando especificado.