Descripción
La dirección IP del cliente se puede falsificar mediante la cabecera X-Forwarded-For
Impacto
Se trata de un problema de suplantación de la dirección IP que puede llevar a eludir controles de acceso.
Cuando una tienda funciona detrás de un proxy inverso, un balanceador de carga o una CDN, la dirección IP real del visitante llega a PrestaShop en una cabecera HTTP. PrestaShop leía el extremo equivocado de esa cabecera: la parte controlada por el visitante, en vez de la parte añadida por el propio proxy de la tienda.
Cualquier visitante podía hacer creer a la tienda que se conectaba desde la dirección que quisiera, lo que invalida todas las funciones que dependen de ella: se podía eludir la lista blanca de IP del modo mantenimiento, llenar los registros de seguridad y auditoría de direcciones falsas, y esquivar protecciones de terceros como el bloqueo por geolocalización, la puntuación antifraude o la limitación de peticiones.
Afecta a las tiendas servidas a través de un proxy inverso, un balanceador o una CDN, que son la mayoría de los despliegues en producción. Las tiendas donde los visitantes se conectan directamente al servidor web no están afectadas. No hace falta cuenta ni interacción del usuario.
Parches
PrestaShop lee ahora la cabecera de reenvío desde el final de la cadena e ignora las direcciones privadas y reservadas de la infraestructura interna, de modo que el valor devuelto es el que añade el proxy de la tienda, que un visitante no puede falsificar.
Actualiza a PrestaShop 9.1.5 o PrestaShop 8.2.8
El tratamiento correcto de la IP es una responsabilidad compartida entre la aplicación y la configuración del alojamiento, así que la sección siguiente aplica hayas actualizado o no.
Soluciones alternativas
El problema se puede mitigar por completo en el proxy, y recomendamos hacerlo además de actualizar. Tu proxy frontal debe sobrescribir la cabecera de reenvío con la dirección que realmente ve, en vez de pasar lo que envíe el visitante.
Nginx
``nginx proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Real-IP $remote_addr; ``
Si los clientes pueden llegar directamente a Nginx, usa proxy_set_header X-Forwarded-For $remote_addr;. No uses nunca $http_x_forwarded_for, que reenvía tal cual el valor enviado por el visitante.
Apache: usa mod_remoteip y declara solo los proxies de confianza:
```apache LoadModule remoteip_module modules/mod_remoteip.so
<IfModule mod_remoteip.c> RemoteIPHeader X-Forwarded-For RemoteIPTrustedProxy 10.0.0.0/8 RemoteIPTrustedProxy 172.16.0.0/12 RemoteIPTrustedProxy 192.168.0.0/16 </IfModule> ```
Si usas una CDN: asegúrate de que tu origen solo acepta conexiones desde los rangos de direcciones de la CDN, para que nadie pueda llegar directamente e inyectar su propia cabecera.
Referencias
- CWE-290: Authentication Bypass by Spoofing
- CWE-348: Use of Less Trusted Source
- MDN: X-Forwarded-For
- Para notificar un problema de seguridad: security-core@prestashop.com
Créditos: esta vulnerabilidad fue reportada de forma responsable al equipo de seguridad de PrestaShop por Pedro Gabaldón Juliá, de ITRESIT. Les agradecemos el informe y la coordinación de la divulgación.
Texto original de GitHub Security Advisory, licenciaCC BY 4.0. Traducción de PrestaShield.
Métricas CVSS 3.1
Fuente: github.com · secondaryCVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:L/A:LReferencias
¿Has encontrado una vulnerabilidad?
Escribe al equipo de seguridad del core de PrestaShop:
security-core@prestashop.com