El 18 de julio de 2016 se anunció una vulnerabilidad denominada «HTTPoxy», que afecta a algunas aplicaciones web del lado del servidor que se ejecutan en entornos CGI o similares a CGI, como determinadas configuraciones de FastCGI. Entre los lenguajes que hasta ahora se sabe que están afectados se encuentran PHP, Python y Go.
Se han asignado varios identificadores CVE que afectan a lenguajes e implementaciones CGI específicos:
- Servidor HTTP Apache (CVE-2016-5387)
- Apache Tomcat (CVE-2016-5388)
- Go (CVE-2016-5386)
- PHP (CVE-2016-5385)
Hay un nuevo sitio web que describe la vulnerabilidad, una nota de vulnerabilidad del CERT, y una descripción del descubrimiento de la vulnerabilidad. Hay más información en el sitio web personal de Dominic Scheirlinck, desarrollador web de código abierto en Vend.
Este artículo describe la vulnerabilidad y explica cómo utilizar NGINX o NGINX Plus para impedir los intentos de explotarla en sus servidores.
La vulnerabilidad se debe a un conflicto de espacios de nombres. Una interfaz CGI o similar a FastCGI establece variables de entorno a partir de los parámetros de las solicitudes HTTP, que pueden sobrescribir las variables internas utilizadas para configurar la aplicación.
Actualmente, la única forma conocida de explotar esta vulnerabilidad afecta a las aplicaciones web que se ejecutan en entornos CGI y similares a CGI y que utilizan determinadas bibliotecas de cliente HTTP para realizar solicitudes HTTP a otros servicios. En este caso, los atacantes podrían redirigir las solicitudes internas generadas por la aplicación a un servidor de su elección y, de este modo, capturar cualquier dato confidencial incluido en ellas, como se muestra a continuación.
HTTPoxy aprovecha una colisión de espacios de nombres para acceder al tráfico interno del servidor
Puede utilizar NGINX o NGINX Plus para identificar y frustrar los intentos de explotar esta vulnerabilidad. De este modo, podrá prevenir eficazmente cualquier ataque y dispondrá de tiempo para auditar y actualizar el código afectado.
Cómo se explota la vulnerabilidad HTTPoxy
Para entender cómo funciona esta vulnerabilidad —y cómo proteger su sitio web frente a ella—, es necesario comprender cómo las interfaces CGI y similares a CGI establecen las variables de entorno y cómo algunas bibliotecas de aplicaciones se configuran mediante variables de entorno.
1 – CGI y las interfaces similares a CGI definen variables de entorno denominadas HTTP_*
Muchas plataformas de aplicaciones web utilizan CGI o interfaces similares a CGI para conectar las aplicaciones a un servidor web. Estas interfaces convierten las cabeceras de una solicitud HTTP en variables de entorno con el prefijo «HTTP_». De este modo, una aplicación puede consultar el valor de las cabeceras de la solicitud (como «User-Agent») examinando su entorno.
Un cliente puede crear variables de entorno arbitrarias (que comiencen por HTTP_) en el entorno de la aplicación enviando solicitudes con la cabecera adecuada. Por ejemplo, la cabecera de solicitud Foo: bar se convierte en la variable de entorno HTTP_FOO=bar.
Algunas plataformas proporcionan una capa de abstracción que oculta las variables de entorno, como la variable global $_SERVER de PHP. No obstante, estas abstracciones se basan en la práctica estándar de CGI y FastCGI de establecer variables de entorno.
Por ejemplo, cuando se ejecuta en modo FastCGI, una aplicación PHP puede determinar la cabecera User-Agent de una solicitud de la siguiente manera:
// both methods return the same result$useragent = getenv( 'HTTP_USER_AGENT' );
$useragent = $_SERVER['HTTP_USER_AGENT'];2 – Algunas bibliotecas de aplicaciones se configuran mediante variables de entorno
Una aplicación web compleja incorpora funcionalidades de bibliotecas externas. Por ejemplo, a veces las aplicaciones necesitan realizar solicitudes HTTP a otros servicios (de forma similar a una arquitectura de microservicios) y pueden utilizar para ello alguna de las bibliotecas de terceros más habituales. Estas bibliotecas suelen admitir una función denominada «proxy HTTP», que consiste en un servidor intermediario utilizado para retransmitir la solicitud HTTP.
Una forma sencilla de configurar una biblioteca de este tipo es definir la configuración mediante variables de entorno. La popular biblioteca PHP Guzzle se configura en parte mediante una variable de entorno denominada HTTP_PROXY, cuyo valor se establece en la dirección de un servidor proxy. Si HTTP_PROXY se configura de este modo, la biblioteca reenvía todas las solicitudes HTTP que genera a la dirección del servidor proxy. El paquete net/http de Go y el módulo Requests de Python también confían en la variable de entorno HTTP_PROXY y la interpretan de la misma manera.
3 – La naturaleza de la vulnerabilidad
Las bibliotecas descritas en el apartado 2 no se diseñaron teniendo en cuenta las interfaces CGI o similares a CGI, y la variable de entorno HTTP_PROXY en la que confían se solapa con el espacio de nombres HTTP_ utilizado por las interfaces CGI y FastCGI, como se explica en el apartado 1.
Al establecer el valor de la variable de entorno HTTP_PROXY en una dirección de su elección, los atacantes pueden redirigir y capturar las solicitudes HTTP internas generadas por la aplicación. Estas solicitudes pueden contener información confidencial, como claves de autenticación y datos privados, y pueden revelar información sobre otras API y puntos de conexión que podrían aprovecharse.
Un atacante puede hacerlo enviando una solicitud con una cabecera Proxy, tras lo cual la interfaz CGI o FastCGI crea automáticamente una variable de entorno denominada HTTP_PROXY para esa ejecución de la aplicación. Tenga en cuenta que solo se ven afectadas directamente las solicitudes que contienen la cabecera Proxy fraudulenta.
Cómo impedir el ataque mediante NGINX y NGINX Plus
La vulnerabilidad HTTPoxy no afecta directamente a NGINX, pero NGINX y NGINX Plus pueden utilizarse para detener ataques que aprovechen esta vulnerabilidad.
Comunicación con una aplicación FastCGI ascendente
Puede usar NGINX para «sanear» la entrada de la aplicación estableciendo el parámetro FastCGI HTTP_PROXY en una cadena vacía. De este modo, el parámetro se elimina por completo de la solicitud FastCGI:
fastcgi_param HTTP_PROXY "";Balanceo de carga y uso de proxy para el tráfico HTTP
Al reenviar solicitudes HTTP a una aplicación de nivel superior, es recomendable establecer cualquier cabecera «Proxy» como una cadena vacía, por si la aplicación de nivel superior se ejecuta en una plataforma vulnerable:
proxy_set_header Proxy "";Detección de intentos de explotación de la vulnerabilidad
Proxy no es una cabecera HTTP estándar, por lo que cualquier solicitud que contenga esta cabecera puede considerarse sospechosa. Puede utilizar NGINX o NGINX Plus para registrar estas solicitudes sospechosas en un registro de acceso específico, denominado en este caso badactor.log:
# define 'proxylog' format in the http{} context:log_format proxylog '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'"$http_proxy"';
# log requests with a Proxy header using the 'proxylog' format
access_log /var/log/nginx/badactor.log proxylog if=$http_proxy;Nota: En el contexto de configuración en el que coloque esta directiva access_log, esta sustituye cualquier registro de acceso definido en un nivel superior de la configuración de NGINX.
Mantente seguro
NGINX y NGINX Plus ofrecen una forma eficaz de supervisar y neutralizar el ataque HTTPoxy. Utilice las técnicas descritas anteriormente para proteger su aplicación mientras audita, actualiza y prueba el código con el fin de eliminar la vulnerabilidad.
Si tiene alguna pregunta, deje un comentario en esta publicación o, si es suscriptor de NGINX Plus, no dude en ponerse en contacto con nuestro equipo de soporte para obtener ayuda.
Sobre el autor

Artículos relacionados del blog
Únete a F5 NGINX en AppWorld 2024
Descubre las numerosas razones para asistir al evento insignia de F5, que incluirá un emocionante anuncio sobre la cartera de productos NGINX.
Rotación de certificados SSL/TLS sin reinicios en NGINX Open Source
La función de diccionario compartido permite configurar NGINX sin necesidad de reiniciarlo al renovar los certificados SSL/TLS.
Exposición de APIs en Kubernetes
La unidad 2 de Microservices March 2022 se centra en cómo exponer tus API en Kubernetes. Aquí tienes enlaces a los recursos que necesitas: la retransmisión en directo del 14 de marzo, artículos de blog y otros recursos de preparación, y el laboratorio práctico «Protege las API de Kubernetes mediante la limitación de solicitudes».
NGINX Sprint 2.0: visión clara, código renovado y nuevos compromisos con el código abierto
Hoy, en NGINX Sprint 2.0, anunciamos cómo respaldaremos nuestra visión del futuro de las aplicaciones modernas con una mayor presencia en la comunidad de código abierto, incluida la participación en el proyecto comunitario Kubernetes, nuevos proyectos de software de código abierto y la arquitectura de referencia para aplicaciones modernas.
Presentamos NGINX Plus R22
NGINX Plus R22 incorpora nuevas funcionalidades, como la compatibilidad con OCSP para verificar la revocación de certificados en TLS mutuo, el uso de varios proveedores de identidad OIDC en una configuración, el seguimiento en tiempo real de la limitación de solicitudes y conexiones en el panel de NGINX Plus y mejoras en NGINX JavaScript.
Presentamos NGINX Plus R17
NGINX Plus R17 incorpora compatibilidad con la limitación de velocidad en dos fases y con TLS 1.3, la versión más reciente del protocolo Transport Layer Security. La configuración de OpenID Connect es más sencilla y NGINX ModSecurity WAF es el doble de rápido que antes. También se ha actualizado el módulo JavaScript de NGINX.