Pular para o conteúdo
Todos os conceitos

Como fechar o SSRF

Analise a URL, permita só hosts da lista, bloqueie faixas internas pelo IP resolvido, não siga redirecionamento e fixe o IP.

Não existe um único interruptor; a defesa é uma pilha de camadas, cada uma fechando um dos buracos que você viu:

  1. Analise a URL de verdade e trabalhe com o host, nunca com o texto. Exija https e um host, rejeite esquemas estranhos (file:, gopher:).
  2. Lista de permissão de hosts: aceite só os destinos de que o recurso realmente precisa. Bloquear uma lista de ruins deixa buracos; permitir uma lista de bons, não.
  3. Resolva o host e bloqueie faixas internas pelo IP RESOLVIDO: loopback 127.0.0.0/8, privadas 10/8, 172.16/12, 192.168/16, link-local 169.254/16 (os metadados).
  4. Não siga redirecionamento (redirect: 'manual'), ou revalide o host e o IP a cada salto. Um host permitido pode te redirecionar para dentro.
  5. Resolva uma vez e fixe o IP: conecte ao IP já conferido, mandando o Host certo, para que uma segunda resposta DNS não troque o endereço entre a checagem e a conexão (DNS rebinding).

Ler o patch é ler essas camadas aparecendo no código. Em Python, o mesmo: urlparse, lista de permissão, getaddrinfo + checagem de IP, allow_redirects=False.

URL do usuário 1 analise a URL (host, não texto) 2 lista de permissão de hosts 3 bloqueie faixas internas (IP resolvido) 4 não siga redirecionamento 5 resolva uma vez e fixe o IP buscar o IP já conferido
Cinco camadas em sequência entre a URL do usuário e a conexão: analisar, lista de permissão, bloquear IP interno, não redirecionar, fixar o IP.

Aparece nestes desafios