21 puntos por xguru 2022-03-07 | 3 comentarios | Compartir por WhatsApp

Resumen

  • Al obtener la "IP real del cliente" desde el encabezado X-Forwarded-For, se debe usar la IP más a la derecha
  • La IP más a la izquierda en el encabezado XFF suele considerarse la "más cercana al cliente" y "casi real", pero se puede falsificar (spoofable). No debe usarse para nada relacionado con seguridad
  • Al seleccionar la IP XFF más a la derecha, se debe usar la última instancia de ese encabezado
  • Los valores de "True Client IP" establecidos por el reverse proxy (X-Real-IP, True-Client-IP, etc.) también pueden ser útiles, pero
    • depende de cómo el reverse proxy establezca ese valor
    • no se sabe si el propio reverse proxy ya fue engañado (spoofed)
    • depende de cómo esté configurado el reverse proxy
  • No se puede confiar en encabezados que el reverse proxy no haya configurado explícitamente
    • Por ejemplo, si no está detrás de Nginx o no está configurado para establecer siempre ese encabezado, no se debe leer X-Real-IP. De lo contrario, podrías leer un valor falsificado
  • Muchas implementaciones de rate limiter usan IPs falsificables y son vulnerables a evasión de rate limiting y ataques de agotamiento de memoria
  • Si en tu código o infraestructura estás usando algo relacionado con la "IP real del cliente", revisa el contenido técnico que sigue

Detalle (como es largo, solo se trasladan los títulos)

  • Introducción: averiguar la "IP real del cliente" hoy en día es terrible
  • Trampas
    • No se puede confiar en los encabezados
    • Múltiples encabezados
    • IP privadas
    • División de IP
    • Nunca se puede confiar en datos no cifrados
    • Cosas como X-Client-IP y True-Client-IP se pueden falsificar
    • Entender X-Forwarded-For
  • Cómo evitar las trampas
    • Algoritmo para obtener la IP real
      • Obtener todos los valores de IP
      • Elegir cuál usar según el nivel de seguridad
      • La más a la izquierda, la más a la derecha
  • Ejemplos prácticos
    • Cloudflare, Nginx, Apache
    • Akamai
    • Fastly
    • Azure
    • go-chi/chi
    • didip/tollbooth
    • ulule/limiter
    • sethvargo/go-limiter
    • Let's Encrypt
    • Express
    • Traefik
    • phpList
    • IIS
    • Tor
  • Avanzado: trampas teóricas y métodos de ataque
  • RFC 7239: Forwarded HTTP Extension, June 2014

3 comentarios

 
tribela 2022-03-08

Por ejemplo, si no estás detrás de Nginx o de otra cosa que siempre lo configure, no debes revisar el encabezado X-Real-IP. Esto se debe a que podrías estar leyendo un valor falsificado.

Creo que esta parte está ligeramente mal traducida. El original dice lo siguiente.

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 ejemplo, si no estás detrás de Nginx o no está configurado para establecer siempre el encabezado, no debes leer el encabezado X-Real-IP. Esto se debe a que terminarás leyendo un valor falsificado.

 
xguru 2022-03-08

Ah, lo corregiré. ¡Gracias!

 
tribela 2022-03-08

Normalmente, el método común es usar la variable de entorno TRUSTED_PROXY para ir descartando uno por uno, desde la derecha, los proxies "confiables", y usar la primera IP que aparezca.
También se suele tratar a las IP internas (192.168.0.0/16), entre otras, como proxies confiables.