jueves, 21 de julio de 2016

¿Colega, dónde está mi Proxy?

Hoy traemos a la palestra una vulnerabilidad genérica que afecta a varias implementaciones del protocolo CGI y que permite, de manera trivial, forzar al servidor a usar un proxy controlado por un atacante.

¡nombre, logo y web!
Los autores han decidido llamarla httpoxy (en un futuro habrá asignaturas en las universidades dedicadas a nombrar vulnerabilidades), un juego de palabras con las palabras "proxy" y "poxy".


¿En qué consiste?

La explicación es tremendamente sencilla. Cuando el servidor atiende las peticiones de los clientes (navegadores) le pasa la petición completa al script o ejecutable que hace de CGI, cabeceras incluidas. Al procesar las cabeceras del cliente si se encuentra una cabecera denominada "Proxy" cogerá el valor y lo pondrá como valor de la variable de entorno del servidor "HTTP_PROXY".

Es típico de CGI funcionar así. A cada cabecera del cliente le antepone el "HTTP_" y la cambia a mayúsculas. No es un defecto que ocurra por procesar cierto valor, simplemente es una colisión de nombres ya que HTTP_PROXY se usa en otros contextos independientes de CGI.

El problema con esta variable de entorno es que le estamos diciendo a todos los procesos, que le hagan caso y la tengan en su entorno, que envíen todas las peticiones HTTP a través de ese proxy.

De este modo, lo que estamos es manipulando al servidor vía CGI para forzar el uso de un proxy. Si tenemos controlado el proxy nos llegarán las respuestas del servidor, con lo que podemos hacer un hombre en el medio con todo el tráfico en texto claro (no, no funcionaría con el tráfico cifrado) o simplemente ralentizar las respuestas para degradar el servicio.


¿A qué afecta?

Bien. Tranquilidad. Si tu servidor no sirve un entorno CGI no hay de que preocuparse, en principio. Esto solo afecta a CGI, que es un autentico vestigio de otros tiempos en los que la gente hablaba por teléfonos que residían en pequeños habitáculos puestos en la calle a cambio de insertarles monedas de metal.

Tampoco afecta a FastCGI, alternativa "más moderna" que no usa variables de entorno para comunicar al proceso receptor los valores de las peticiones de los clientes.

Ahora bien, si el entorno del servidor da soporte a CGI la cosa cambia. Como sabemos, CGI es soportado por cualquier lenguaje que se ejecute en el servidor. Incluso llegaron a existir CGIs corriendo sobre bash (en serio, no es broma) o binarios en C (recordad, ¡teléfonos en la calle!) atendiendo peticiones HTTP. Pues bien, algunos lenguajes ya parchearon esta vulnerabilidad hace tiempo y de manera independiente, como Ruby o Perl, pero no todos... hasta que la vulnerabilidad volvió a cobrar protagonismo.

En algo así como un revival, alguien se dio cuenta de que lo que parchearon en algunos lenguajes y herramientas se podía reproducir en otros lenguajes, como por ejemplo PHP (¿Sorprendido?), Python y el recién llegado Go. Además se han parcheado los servidores Apache HTTP Server y Apache Tomcat para evitar que esto ocurra. Es de esperar que otros lenguajes y herramientas se unan y saquen los oportunos parches ya que este fallo es un error de diseño y por lo tanto transversal a todo el bestiario de librerías, implementaciones y herramientas que usen CGI.

Por cierto si estabas a punto de dejar de leer pensando que no afecta a Microsoft IIS, sí que afecta en cierto modo, como por ejemplo derivado del uso de la librería cURL, tal y como comentan en la nota enlazada.


Prueba de concepto y más información

Los autores nos han dejado un legado para la posteridad en forma de página web con su logo y dominio, como viene siendo costumbre, aquí.

No es recomendable hacer una prueba de concepto en entornos de producción, ya que si funciona todo el tráfico HTTP saliente del servidor se dirigirá al proxy indicado por la petición manipulada, pero si se insiste los autores han dejado código en un repositorio de GitHub.

Más información:

httpoxy

The CERT vulnerability note - VU#797896
CGI web servers assign Proxy header values from client requests to internal HTTP_PROXY environment variables

Red Hat advisory
HTTPoxy - CGI "HTTP_PROXY" variable name clash

Apache Software Foundation Projects and "httpoxy" CERT VU#797896

Microsoft advisory KB3179800
IIS CGI HTTP_PROXY header requests may be redirected

Mitigating the HTTPoxy Vulnerability with NGINX

Drupal Core - Highly Critical - Injection - SA-CORE-2016-003



David García
Twitter: @dgn1729


1 comentario: