Como mitigar vulnerabilidades de travessia de caminho no Java usando o Snyk Code
6 de março de 2023
0 minutos de leituraA travessia de caminho é um tipo de vulnerabilidade de segurança que pode ocorrer quando um aplicativo ou serviço web permite que um invasor acesse arquivos ou diretórios no servidor que estão fora da estrutura de diretórios pretendida. Isso pode resultar na leitura ou modificação não autorizada de dados confidenciais. No contexto de uploads de arquivos, uma vulnerabilidade de travessia de caminho pode ocorrer quando um aplicativo não valida adequadamente o caminho do arquivo especificado pelo usuário. Isso permite que o invasor envie um arquivo mal-intencionado com um nome de arquivo para obter acesso a arquivos restritos no servidor.
É essencial prevenir a travessia de caminho em uploads de arquivos para garantir a segurança dos aplicativos Java. Essa medida ajuda a proteger dados confidenciais e evitar acesso não autorizado a arquivos e diretórios restritos. Neste post, vamos explorar mais detalhadamente a travessia de caminho em uploads de arquivos e mostrar como usar o Snyk Code para prevenir essa vulnerabilidade em aplicativos Java.
Se você é profissional de desenvolvimento ou tem interesse em aprender mais sobre segurança no Java, leia este post para obter informações e insights úteis na manutenção da segurança de aplicativos Java.
Entendendo a travessia de caminho em uploads de arquivos
Imagine um aplicativo que permite aos usuários fazer upload de fotos de perfil. O aplicativo armazena as fotos de perfil em um diretório no servidor, como /images/profiles/
. Quando o aplicativo não valida adequadamente o nome do arquivo especificado pelo usuário, um invasor pode enviar um arquivo mal-intencionado com o nome de arquivo como ../../etc/passwd
, por exemplo. Isso permite que o invasor acesse arquivos de sistema confidenciais fora da estrutura de diretórios pretendida.
Veja o exemplo abaixo de um aplicativo Spring Boot usando Thymeleaf.
1@PostMapping("/uploadimage")
2public String uploadImage (Model model, @RequestParam("image") MultipartFile file) throws IOException {
3 var name = file.getOriginalFilename().replace(" ", "_");
4 var fileNameAndPath = Paths.get(UPLOAD_DIRECTORY, name);
5 Files.write(fileNameAndPath, file.getBytes());
6 model.addAttribute("msg", "Uploaded images: " + name);
7 return "person/upload";
8}
O uso de formulários web para carregar imagens é bastante comum. No upload, usamos o originalFilename
do MultipartFile
recebido. Se interceptarmos e inspecionarmos a chamada do post HTTP, veremos que filename
é apenas um metadado na solicitação HTTP mostrada na linha 24.
Com as ferramentas certas, é fácil alterar o nome do arquivo para qualquer outro nome desejado. Quando alteramos o nome do arquivo para ../../../../../../../etc/passwd
, o código faz upload do arquivo para images/profiles/../../../../../../../etc/passwd
. Com a travessia de caminho para o root, o arquivo carregado substitui /etc/passwd
.
Como a Snyk Code detecta a travessia de caminho
O Snyk Code é uma ferramenta SAST em tempo real que ajuda desenvolvedores Java a identificar vulnerabilidades nos aplicativos, inclusive a travessia de caminho em uploads de arquivos. A ferramenta usa uma análise estática baseada em um modelo avançado de machine learning para verificar o código e identificar possíveis riscos de segurança.
No que diz respeito à travessia de caminho, o Snyk Code pode ajudar a identificar partes do código que usam caminhos de arquivos especificados pelo usuário sem validação adequada. Por exemplo, na conexão do meu repositório do GitHub à Snyk, o Snyk Code encontrou o problema de travessia de caminho na interface de usuário web.
Em seguida, uso o plugin da Snyk para IntelliJ IDEA com o Snyk Code habilitado. A verificação na minha máquina local durante o desenvolvimento já apontou o problema de travessia de caminho quando fiz upload do arquivo. Além disso, ela fez algumas sugestões de possíveis abordagens de mitigação.
Usando o Snyk Code, é possível identificar e corrigir proativamente essas vulnerabilidades de travessia de caminho antes que sejam exploradas, ajudando a garantir a segurança dos aplicativos e dos dados monitorados.
Em resumo, o Snyk Code ajuda os desenvolvedores Java a identificar vulnerabilidades de travessia de caminho em uploads de arquivos verificando o código e identificando áreas sem validação adequada. Isso pode ajudar a garantir a segurança dos aplicativos e protegê-los contra possíveis ataques.
Mitigação da travessia de caminho em uploads de arquivos
A maneira mais fácil de corrigir uma vulnerabilidade de travessia de caminho é não usar file.getOriginalFilename()
. Quando você mesmo gera um nome, o controle é absoluto sobre o local onde o arquivo é armazenado, pois ele é influenciado pela entrada do usuário.
No entanto, se quiser preservar o nome original do arquivo, precisamos verificar se o local onde o arquivo será armazenado é onde queremos que ele esteja. O Snyk Code (veja o exemplo do plugin do IDE) já sugeriu que podemos normalizar
o caminho.
Vamos alterar o exemplo anterior para verificar se pelo menos o caminho normalizado começa com a pasta de upload pretendida. Dessa forma, prevenimos problemas de travessia de caminho.
Observação do editor: 31 de março de 2023
Este bloco de código foi atualizado
1@PostMapping("/uploadimage")
2public String uploadImage (Model model, @RequestParam("image") MultipartFile file) throws IOException {
3 var name = file.getOriginalFilename().replace(" ", "_");
4 var fileNameAndPath = Paths.get(UPLOAD_DIRECTORY, name);
5
6 if (!fileNameAndPath.normalize().startsWith(UPLOAD_DIRECTORY)) {
7 throw new IOException("Could not upload file: " + name);
8 }
9
10 Files.write(fileNameAndPath, file.getBytes());
11 model.addAttribute("msg", "Uploaded images: " + name);
12 return "person/upload";
13}
14
É essencial prevenir esse tipo de vulnerabilidades.
Elas são uma séria ameaça à segurança de aplicativos web Java e estão entre os principais problemas de segurança que a Snyk encontra em código Java.
Os desenvolvedores precisam estar cientes delas e entender como preveni-las. Com a implementação de validação adequada e o uso de ferramentas como o Snyk Code para identificar possíveis vulnerabilidades, os desenvolvedores podem ajudar a garantir a segurança dos aplicativos e protegê-los contra os riscos de ataques de travessia de caminho. É vital lembrar que a segurança é um processo contínuo. A identificação e mitigação de vulnerabilidades de forma atenta e proativa é fundamental para manter a segurança de aplicativos Java.
Corrija vulnerabilidades de travessia de caminho e ganhe brindes incríveis
A maratona de correção de vulnerabilidades da Snyk, The Big Fix, ocorre entre 14 de fevereiro e 14 de março. Participe da competição e corrija vulnerabilidades em projetos pessoais ou em um projeto de código aberto que você usa frequentemente. Se você acabou de descobrir que seu aplicativo tem uma vulnerabilidade de travessia de caminho, adicione seu projeto ao The Big Fix. Basta corrigir uma única vulnerabilidade para ganhar uma camiseta Big Fix 2023 de edição limitada. As pessoas com mais correções travarão uma disputa por prêmios ainda mais sensacionais.
E então, o que você está esperando? Participe do The Big Fix e comece a proteger seus aplicativos hoje mesmo.
Primeiros passos com Capture the Flag
Saiba como resolver desafios de Capture the Flag assistindo ao nosso workshop virtual de conceitos básicos sob demanda.