Skip to main content

Como mitigar vulnerabilidades de path traversal em Java com Snyk Code

Escrito por
snyk code featured

6 de março de 2023

0 minutos de leitura

Path traversal é 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 do servidor que estão fora da estrutura de diretórios prevista. Isso pode levar à leitura ou modificação não autorizada de dados confidenciais. No contexto de uploads de arquivos, uma vulnerabilidade de path traversal pode ocorrer quando um aplicativo não valida corretamente o caminho do arquivo especificado pelo usuário, permitindo que o invasor envie um arquivo malicioso cujo nome lhe dê acesso a arquivos restritos no servidor.

Prevenir path traversal em uploads de arquivos é fundamental para a segurança de aplicativos Java, pois ajuda a proteger dados confidenciais e impede o acesso não autorizado a arquivos e diretórios restritos. Neste artigo, vamos explorar em mais detalhes o path traversal em uploads de arquivos e mostrar como prevenir essa vulnerabilidade em aplicativos Java com o Snyk Code.

Seja você desenvolvedor ou apenas queira aprender mais sobre segurança em Java, este artigo traz informações e insights para ajudar a manter seus aplicativos Java seguros.

Entenda o path traversal em uploads de arquivos

Imagine um aplicativo que permite aos usuários enviar fotos de perfil. O aplicativo armazena as fotos em um diretório no servidor, como /images/profiles/. Se o aplicativo não validar corretamente o nome de arquivo especificado pelo usuário, um invasor poderá enviar um arquivo malicioso com um nome como ../../etc/passwd. Isso permitiria que ele acessasse arquivos confidenciais do sistema fora da estrutura de diretórios prevista. 

Veja o exemplo abaixo de um aplicativo Spring Boot que usa Thymeleaf.

@PostMapping("/uploadimage")
public String uploadImage (Model model, @RequestParam("image") MultipartFile file) throws IOException {
   var name = file.getOriginalFilename().replace(" ", "_");
   var fileNameAndPath = Paths.get(UPLOAD_DIRECTORY, name);
   Files.write(fileNameAndPath, file.getBytes());
   model.addAttribute("msg", "Uploaded images: " + name);
   return "person/upload";
}

Formulários web são muito comuns para o upload de imagens. No upload, usamos o originalFilename do MultipartFile recebido. Se interceptarmos e inspecionarmos a chamada HTTP POST, veremos que filename é apenas metadado nesta solicitação HTTP, como mostrado na linha 24.

Trecho de código que mostra um cookie JSESSIONID e o envio de uma imagem JPEG usando multipart/form-data.

Com as ferramentas certas, é fácil alterar o nome do arquivo para o que quisermos! Ao mudar o nome para ../../../../../../../etc/passwd, nosso código enviará o arquivo para images/profiles/../../../../../../../etc/passwd. O caminho percorrerá os diretórios até chegar à raiz, e o arquivo substituirá /etc/passwd.

Como o Snyk Code detecta path traversal

Snyk Code é uma ferramenta SAST em tempo real que ajuda desenvolvedores Java a identificar vulnerabilidades nos aplicativos, incluindo path traversal em uploads de arquivos. A ferramenta usa análise estática baseada em um modelo avançado de machine learning para verificar seu código e identificar possíveis riscos de segurança.

Em relação ao path traversal, Snyk Code ajuda você a identificar trechos do código que usam caminhos de arquivo especificados pelo usuário sem a validação adequada. Por exemplo, ao conectar meu repositório do GitHub ao Snyk, o Snyk Code encontrou o problema de path traversal para mim na interface web.

Interface do Snyk Code destacando uma vulnerabilidade de Path Traversal no código de upload em Java, com a linha insegura de gravação de arquivos e uma explicação de como corrigir o problema.

Em seguida, usei o plugin do Snyk para IntelliJ IDEA com o Snyk Code ativado. A análise na minha máquina local durante o desenvolvimento já identificou o problema de path traversal no upload de arquivos. Além disso, também sugeriu algumas possíveis medidas de mitigação.

Painel de segurança da Snyk que destaca uma vulnerabilidade de travessia de caminho CWE-23 de alta gravidade e correções de código para evitar caminhos de arquivo inseguros.

Com o Snyk Code, você pode identificar e corrigir proativamente essas vulnerabilidades de path traversal antes que sejam exploradas, ajudando a garantir a segurança do seu aplicativo e dos dados que ele processa. 

Em resumo, o Snyk Code ajuda desenvolvedores Java a identificar vulnerabilidades de path traversal em uploads de arquivos, analisando o código e apontando trechos sem a validação adequada. Isso ajuda a garantir a segurança do seu aplicativo e a protegê-lo contra possíveis ataques.

Como mitigar path traversal em uploads de arquivos

A maneira mais fácil de corrigir uma vulnerabilidade de path traversal é evitar usar file.getOriginalFilename(). Se você gerar o nome do arquivo, terá controle total sobre o local em que ele será armazenado, pois esse local não será influenciado pela entrada do usuário.

No entanto, se você quiser preservar o nome original do arquivo, precisamos verificar se o local em que ele será armazenado é o local desejado. O Snyk Code (veja o exemplo do plugin para IDE) já indicou que podemos normalizar o caminho com normalize.

Vamos alterar o exemplo anterior para verificar se o caminho normalizado começa, pelo menos, com a pasta de upload prevista. Assim, evitamos problemas de path traversal.

Nota do editor: 31 de março de 2023

Este bloco de código foi atualizado.

@PostMapping("/uploadimage")
public String uploadImage (Model model, @RequestParam("image") MultipartFile file) throws IOException {
   var name = file.getOriginalFilename().replace(" ", "_");
   var fileNameAndPath = Paths.get(UPLOAD_DIRECTORY, name);

   if (!fileNameAndPath.normalize().startsWith(UPLOAD_DIRECTORY)) {
        throw new IOException("Could not upload file: " + name);
   }

   Files.write(fileNameAndPath, file.getBytes());
   model.addAttribute("msg", "Uploaded images: " + name);
   return "person/upload";
}

É essencial prevenir vulnerabilidades de path traversal.

As vulnerabilidades de path traversal são uma ameaça séria à segurança de aplicativos web Java e estão entre os principais problemas de segurança encontrados pelo Snyk em código Java.
Desenvolvedores precisam conhecê-las e entender como preveni-las. Com a validação adequada e ferramentas como o Snyk Code para identificar possíveis vulnerabilidades, é possível ajudar a garantir a segurança dos aplicativos e protegê-los contra os riscos de ataques de path traversal. É fundamental lembrar que segurança é um processo contínuo: manter-se atento e agir proativamente para identificar e mitigar vulnerabilidades é essencial para preservar a segurança dos seus aplicativos Java.

Corrija suas vulnerabilidades de path traversal e ganhe brindes incríveis

O hackathon de correção de vulnerabilidades do Snyk, The Big Fix, está acontecendo de 14 de fevereiro a 14 de março. Participe da competição e corrija vulnerabilidades nos seus projetos pessoais ou em um projeto de código aberto que você usa com frequência. Se você acabou de descobrir uma vulnerabilidade de path traversal no seu aplicativo, inscreva seu projeto no The Big Fix. Corrigir uma única vulnerabilidade dá direito a uma camiseta exclusiva do Big Fix 2023. Quem fizer mais correções neste ano concorrerá a prêmios ainda mais incríveis.

E aí, está esperando o quê? Participe do The Big Fix e comece a proteger seu aplicativo hoje mesmo.

Banner promocional do The Big Fix com a frase “Corrija vulnerabilidades e ganhe brindes incríveis”, válido de 14 de fev. a 14 de mar., com um botão “Participe”. אם

Comece a jogar Capture the Flag

Aprenda a resolver desafios de Capture the Flag assistindo à gravação sob demanda do nosso workshop virtual introdutório.

Leia mais

blog feature snyk container custom base recommendations
Blog

Conheça o Evo Agentic AppSec: segurança que acompanha o ritmo do desenvolvimento com IA

O desenvolvimento impulsionado por IA está avançando mais rápido do que os fluxos de trabalho de segurança tradicionais. O AppSec agentivo da Snyk usa agentes de segurança para encontrar, corrigir e verificar vulnerabilidades continuamente, enquanto as pessoas definem os critérios.

blog feature ai violet
Blog

VulnBump: agentes de IA conseguem corrigir dependências vulneráveis sem quebrar o build?

O VulnBump testa agentes de IA em 307 atualizações reais de dependências. Uma correção só é considerada válida se eliminar a vulnerabilidade e mantiver o build e os testes funcionando.

Blog

Modelos de ponta encontraram as vulnerabilidades. Só o atacante encontrou as cadeias.

A análise estática encontrou as falhas, mas só os testes de ataque em aplicações ativas provaram como elas poderiam ser encadeadas para causar invasões. Uma comparação entre Evo COS, Claude Security e Claude Code Security.