21 pontos por xguru 2022-03-07 | 3 comentários | Compartilhar no WhatsApp

Resumo

  • Ao obter o "Real Client IP" do cabeçalho X-Forwarded-For, use o IP mais à direita
  • O IP mais à esquerda no cabeçalho XFF costuma ser considerado o "mais próximo do cliente", o "quase real", mas pode ser falsificado (spoofable). Não o use para nada relacionado à segurança
  • Ao selecionar o IP XFF mais à direita, deve-se usar a última instância desse cabeçalho
  • Valores de "True Client IP" definidos pelo proxy reverso (X-Real-IP, True-Client-IP etc.) também podem ser bons, mas
    • isso depende de como o proxy reverso define esse valor
    • o próprio proxy reverso pode já ter sido enganado (spoofed)
    • depende de como a configuração do proxy reverso foi feita
  • Cabeçalhos que o proxy reverso não configurou explicitamente não são confiáveis
    • Por exemplo, se não estiver atrás do Nginx, ou se ele não estiver configurado para sempre definir o cabeçalho, não se deve ler o cabeçalho X-Real-IP. Você pode acabar lendo um valor falsificado
  • Muitas implementações de rate limiter usam IPs falsificáveis e estão vulneráveis a evasão de limitação de taxa e ataques de esgotamento de memória
  • Se você estiver usando algo relacionado a "real client ip" no código ou na infraestrutura, consulte os detalhes técnicos a seguir

Detalhes (como é longo, só vou traduzir os títulos)

  • Introdução: descobrir o "real client ip" hoje em dia é terrível
  • Armadilhas
    • Cabeçalhos não são confiáveis
    • Vários cabeçalhos
    • IP privado
    • Divisão de IP
    • Dados não criptografados nunca são confiáveis
    • Coisas como X-Client-IP, True-Client-IP podem ser falsificadas
    • Entendendo X-Forwarded-For
  • Como evitar armadilhas
    • Algoritmo para obter o IP real
      • Obter todos os valores de IP
      • Escolher qual usar dependendo da segurança
      • O mais à esquerda, o mais à direita
  • Exemplos práticos
    • Cloudflare, Nginx, Apache
    • Akamai
    • Fastly
    • Azure
    • go-chi/chi
    • didip/tollbooth
    • ulule/limiter
    • sethvargo/go-limiter
    • Let's Encrypt
    • Express
    • Traefik
    • phpList
    • IIS
    • Tor
  • Avançado: armadilhas teóricas e métodos de ataque
  • RFC 7239: Forwarded HTTP Extension, June 2014

3 comentários

 
tribela 2022-03-08

Por exemplo, se não estiver atrás do Nginx ou de outra coisa que sempre define esse cabeçalho, você não deve verificar o cabeçalho X-Real-IP. Caso contrário, pode acabar lendo um valor falsificado.

Acho que esta parte está levemente mal traduzida. O original é este.

For example, you must not check the X-Real-IP header if you’re not behind Nginx or something else that always sets it, because you’ll be reading a spoofed value.

Por exemplo, se você não estiver atrás do Nginx ou de algo configurado para sempre definir esse cabeçalho, não deve ler o cabeçalho X-Real-IP, porque acabará lendo um valor falsificado.

 
xguru 2022-03-08

Ah, vou corrigir isso. Obrigado!

 
tribela 2022-03-08

Em geral, usa-se a variável de ambiente TRUSTED_PROXY para ir excluindo, da direita para a esquerda, um a um os proxies "confiáveis" e então utilizar o primeiro IP que aparecer.
Também é comum tratar IPs internos (192.168.0.0/16) e afins como proxies confiáveis.