Cómo proteger un servidor contra la vulnerabilidad HTTPoxy

HTTPoxy

HTTPoxy es una vulnerabilidad que fue descubierta el 18 de julio de 2016 a la que, a pesar de todo el tiempo que ha transcurrido, aún no se le ha puesto solución definitiva. HTTPoxy afecta a aplicaciones CGI escritas en PHP, Python y Go, entre otras. Mediante este vulnerabilidad un atacante puede forzar las aplicaciones CGI vulnerables a enviar sus paquetes HTTP a un proxy intermedio controlado por los piratas informáticos.

La causa de esta vulnerabilidad es una colisión entre nombres. Si un cliente envía una cabecera «Proxy», algunas implementaciones de CGI crean una variable de entorno «HTTP_PROXY» que anula la variable real del mismo nombre. Como resultado, si en la cabecera se envía el nombre de un proxy malintencionado, este podría interceptar las conexiones de la aplicación web a otros sistemas y, dependiendo del código, podría llegar incluso a tomar el control del servidor.

Servidores y aplicaciones vulnerables a este problema

HTTPoxy es una vulnerabilidad general que se encuentra en muchas implementaciones CGI. Para que una aplicación sea vulnerable debe cumplir algunos requisitos:

  • Utilizar la variable HTTP_PROXY para configurar conexiones proxy, ya sea en nuestro código o en cualquier librería de terceras personas que utilicemos.
  • Hacer peticiones a los servicios utilizando HTTP. Otras solicitudes realizadas por otros protocolos como HTTPS no serán vulnerables.
  • Desarrollos donde se utilizan variables prefijadas con la cadena «HTTP_».

Si quier saber si una implementación se está viendo afectada, puedes hacerlo mediante el sitio para realizar estas comprobaciones creado por Lucas Rehmann.

Información específica del lenguaje

Si hay un lenguaje que tiene más riesgo de ser susceptible a esta vulnerabilidad es, sin duda, PHP. ¿Por qué? Porque es uno de los más utilizados en la actualidad y sus implementaciones CGI son más comunes que en cualquier otro lenguaje. Además nos encontramos el uso del método «getenv» en muchas bibliotecas populares utilizadas para el desarrollo de aplicaciones.

Otros lenguajes de programación que también pueden verse afectados son Python y Go. En este caso se trata de lenguajes que ofrecen una serie de métodos más seguros que en el caso de PHP. Aún así, si durante el desarrollo de la aplicación, en alguna parte del código leen la variable HTTP_PROXY, automáticamente se vuelven vulnerables de sufrir este tipo de problema.

Cómo derrotar a la vulnerabilidad HTTPoxy

Por suerte, HTTPoxy es relativamente fácil de solucionar. Se le puede poner remedio desde diferentes frentes, ya sea desde la capa del servidor o desde el propio código del CGI.

  • A nivel de las aplicaciones se puede ignorar la variable HTTP_PROXY cuando se están ejecutando en un entorno CGI.
  • Las aplicaciones o bibliotecas pueden utilizar una variable de entorno diferente para configurar las conexiones proxy.
  • A nivel de servidor se puede desarmar el encabezado Proxy recibido en las peticiones de los clientes.

Si estamos utilizando alguna librería vulnerable, tenemos que actuar a nivel de servidor para solucionar el problema. Si, por el contrario, somos propietarios del código y nuestro proyecto se basa en la variable HTTP_PROXY, la solución sería utilizar otra variable alternativa que no entre en conflicto cuando se ejecuta en un entorno CGI. Por ejemplo, en el caso de Ruby se puede utilizar CGI_HTTP_PROXY. Otra solución a nivel de servidor es desactivar la cabecera HTTP PROXY. Esta última solución es lo que veremos a continuación.

Eliminar la cabecera HTTP Proxy en Apache

Si estás utilizando un servidor web Apache, puedes utilizar mod_headers para eliminar el encabezado de todas las peticiones.

1 Servidores Ubuntu y Debian

Lo primero que hay que hacer es activar mod_headers. Para ello ejecutaremos lo siguiente:

sudo a2enmod headers

Después, abriremos el archivo de configuración:

sudo nano /etc/apache2/apache2.conf

En la parte inferior añadiremos:

RequestHeader unset Proxy early

Una vez hecho esto, guardamos los cambios y cerramos el archivo. Después revisaremos la configuración para asegurarnos de que no hay errores de sintaxis.

sudo apache2ctl configtest

Si no se han reportado errores, reiniciamos Apache.

sudo service apache2 restart

2 Servidores CentOS y Fedora

Bajo estos sistemas operativos el módulo mod_headers debería haber sido instalado por defecto cuando se instaló Apache. Para desactivar las cabeceras, hay que abrir el archivo de configuración.

sudo nano /etc/httpd/conf/httpd.conf

Casi al final del archivo, tenemos que añadir la siguiente línea:

RequestHeader unset Proxy early

Luego guardamos los cambios y cerramos el archivo. A continuación comprobamos que no se haya producido ningún error de sintaxis.

sudo apachectl configtest

Si todo ha ido bien, reiniciamos el servidor.

sudo service httpd restart

Eliminar las cabeceras HTTP Proxy con Nginx

Después de ver cómo se hace en Apache, vamos a ver como realizar la misma acción en servidores que utilicen Nginx.

1 Servidores con Ubuntu o Debian

En estos sistemas operativos, los parámetros FastCGI están incluidos de forma habitual en los ficheros «fastcgi_params» o «fastcgi_conf». En ambos casos podemos desactivar la cabecera HTTP_PROXY.

echo 'fastcgi_param HTTP_PROXY "";' | sudo tee -a /etc/nginx/fastcgi.conf
echo 'fastcgi_param HTTP_PROXY "";' | sudo tee -a  /etc/nginx/fastcgi_params

También es recomendable desactivar esta cabecera cuando usemos Nginx como proxy convencional. En este caso también hay que ejecutar la siguiente instrucción:

echo 'proxy_set_header Proxy "";' | sudo tee -a /etc/nginx/proxy_params

Una vez realizados los cambios, nos aseguraremos de que no hemos cometido errores de sintaxis.

sudo nginx –t

Si todo ha ido bien, reiniciaremos el servidor.

sudo service nginx restart

2 Servidores CentOS, RedHat y Fedora

Nginx en sistemas CentOS y Fedora también utiliza los mismos archivos que Debian y Ubuntu para desactivar estas cabeceras. Para desactivarlo, ejecutaremos lo siguiente:

echo 'fastcgi_param HTTP_PROXY "";' | sudo tee -a /etc/nginx/fastcgi.conf
echo 'fastcgi_param HTTP_PROXY "";' | sudo tee -a  /etc/nginx/fastcgi_params

Si usamos Nginx como proxy convencional, también deberíamos eliminar estas cabeceras. Para ello, ejecutaremos lo siguiente:

grep -r "proxy_pass" /etc/nginx

Como en los casos anteriores, revisaremos que no se hayan producido ningún error de sintaxis.

sudo nginx -t

Si todo ha ido correctamente, reiniciaremos el servidor.

sudo service nginx restart

Eliminar la cabecera HTTP Proxy con HAProxy

Si estamos utilizando HAProxy para dirigir el tráfico de nuestras aplicaciones a los servidores, podemos eliminar esta cabecera antes de realizar el reenvío. Para ello tenemos que editar el archivo haproxy.cfg.

sudo nano /etc/haproxy/haproxy.cfg

Ahí debemos modificar las secciones «frontend», «backend» y «listen».

frontend www
http-request del-header Proxy
. . .

backend web-backend
http-request del-header Proxy
. . .

listen appname 0.0.0.0:80
http-request del-header Proxy
. . .

Guardamos y cerramos el archivo; y revisamos que no se haya producido ningún error de sintaxis.

sudo haproxy -c -f /etc/haproxy/haproxy.cfg

Si todo ha ido bien, reiniciaremos el servicio.

sudo service haproxy restart

Solo necesitas seguir estos sencillos pasos para solucionar el problema de la vulnerabilidad HTTPoxy y disfrutar de unas aplicaciones más seguras. Previamente, no te olvides de realizar copia de seguridad de las configuraciones y datos.

Si te ha gustado, compártelo en redes sociales