// Vulnerabilidade e correção
Upload de arquivos seguro em SaaS
Por que upload é uma superfície perigosa
Upload aceita dado do usuário e o guarda no seu ambiente. Se você confia no nome, no tipo declarado ou no destino, abre caminho para execução de arquivo, sobrescrita de outro registro, leitura de dado alheio e até SSRF quando o "upload por URL" busca um endereço interno.
Riscos comuns
Cada atalho no upload vira um vetor.
- Arquivo executável servido de volta e executado (RCE/stored XSS).
- Path traversal: nome com ../ grava fora da pasta esperada.
- IDOR de arquivo: baixar o arquivo de outro cliente trocando o id.
- SSRF em "importar por URL" apontando para serviço interno/metadata.
- Falta de limite de tamanho virando abuso de custo e disponibilidade.
Como corrigir
Trate o arquivo como não confiável do início ao fim. Valide no servidor, guarde fora da raiz web, sirva por URL assinada e nunca deixe o cliente escolher o caminho de gravação.
- Valide tipo real (magic bytes) e tamanho no backend.
- Gere o nome/caminho no servidor; nunca use o nome do cliente direto.
- Armazene isolado (bucket privado) e sirva por URL assinada e temporária.
- Bloqueie SSRF: allowlist de destino, sem acesso a IP interno/metadata.
- Escopo por tenant no acesso ao arquivo.
Quando validar com teste manual
Upload que aceita documento de cliente, anexo em ticket ou mídia paga é fluxo sensível. Quando o impacto toca dado de cliente ou execução no seu ambiente, um Pentest Manual com escopo prova o que quebra de verdade, sem tocar no que não foi autorizado.
Perguntas frequentes
Checar a extensão do arquivo é suficiente?
Não. Extensão e content-type são declarados pelo cliente e falsificáveis. Valide o tipo real por magic bytes no servidor e defina uma allowlist do que é aceito.
O que é SSRF em upload?
Acontece em "importar por URL": o servidor busca o endereço que o usuário mandou. Se não houver allowlist, ele pode buscar um serviço interno ou o endpoint de metadata da nuvem e vazar credenciais.
Posso servir o arquivo direto da pasta pública?
Evite. Armazene em bucket privado e sirva por URL assinada e temporária, com escopo por tenant. Pasta pública facilita IDOR de arquivo e execução indevida.