Translated message

A translation of this page exists in English.

HTTPoxy - conflicto de nombre de variable "HTTP_PROXY" en CGI

Public Date: July 18, 2016, 12:00 am
Updated -
Ongoing Status
Important Impact

Se ha descubierto una vulnerabilidad en los scripts utilizados por los productos de Red Hat que utilizan PHP, Go, Python y otros lenguajes de programación.


Los servidores Web, los marcos de trabajo web y los lenguajes de programación, (comúnmente en un entorno CGI) determinarán la variable de entorno “HTTP_PROXY” con base en datos de solicitudes entrantes (p.e.j., una solicitud denominada “Proxy” con datos provistos por el usuario). La variable de entorno “HTTP_PROXY” es utilizada por varios paquetes de software de clientes Web para especificar que un servidor proxy remoto utilice solicitudes HTTP, y en algunos casos, HTTPS . Como resultado, cuando se ejecuta una aplicación de red, es posible que un atacante especifique un servidor proxy utilizado por la aplicación para las subsiguientes solicitudes salientes, permitiendo así un ataque de "Hombre en el medio". Esta falla ha recibido el nombre de HTTPoxy .

### Información de fondo

Programa CGI y variables de entorno

El servidor HTTP utiliza una serie de variables de entorno para pasar información al script CGI. Algunas de estas variables sirven para comunicar ciertos aspectos de la solicitud HTTP como por ejemplo, GET o POST). Hay una serie de variables de entorno, que RFC denomina "Protocol-Specific Meta-Variables", las cuales sirven para pasar los valores de encabezamientos HTTP al script CGI. La asignación de encabezamientos HTTP a variables de entornos sigue un procedimiento estándar: el nombre del encabezamiento HTTP se convierte en mayúsculas, "-" es remplazado por "_", y "HTTP_" es el prefijo.

Por ejemplo, el encabezamiento "Cookie" se pasa mediante la variable de entorno "HTTP_COOKIE" y el encabezamiento "Proxy" se pasa mediante la variable de entorno "HTTP_PROXY". Por favor observe que el encabezamiento "Proxy" no es un estándar oficial, ni es el registrador de encabezamiento provisional. El encabezamiento "Proxy" no debe ser utilizado por clientes o aplicaciones en cumplimiento a las normas.

La variable de entorno HTTP_PROXY "system"

Existe una variable de entorno del sistema llamada "HTTP_PROXY", la cual sirve para comunicarse con parámetros proxy HTTP (y algunas veces HTTPS) para un proxy HTTP saliente a una aplicación. Esta variable tiene un propósito y contexto completamente diferentes al de la variable HTTP server-script. Las aplicaciones, bibliotecas de lenguajes o módulos de scripts usan esta variable de entorno para configurar su proxy para el subsiguiente tráfico HTTP de salida.

Estándar CGI

La interfaz de puerta de enlace común es un estándar diseñado para permitir a servidores web HTTP, tales como Apache o nginx, interactuar con los scripts ejecutables o binarios para generar páginas web dinámicas. Este estándar se documenta en RFC 3875 . Los scripts CGI pueden estar escritos en varios lenguajes de programación, tales como PHP, Python, Perl, Ruby, o golang, pero también pueden ser archivos binarios compilados.

El servidor HTTP y el script CGI interactúan en la siguiente forma:

1. El servidor HTTP recibe y analiza una solicitud HTTP, y configura las variables necesarias.
2. El servidor HTTP llama al script CGI y pasa cualquier información de la solicitud, a través de la entrada estándar del script.
3. El script CGI procesa las variables de entorno y la salida, y envía una respuesta al servidor HTTP mediante la salida estándar del script.
4. El servidor HTTP envía al cliente la respuesta generada por el script CGI.

El problema: Conflicto de nombre HTTP_PROXY

Un script CGI no puede distinguir entre "Protocol-Specific Meta-Variable" de CGI, que contiene el valor del encabezamiento "Proxy" de la solicitud HTTP, y la variable de entorno HTTP_PROXY, que contiene los parámetros Proxy HTTP. Un script CGI, módulo o biblioteca lee la variable de entorno "HTTP_PROXY" y asume que esta contiene los parámetros proxy HTTP de "system". El valor mal interpretado luego cambia la forma como las solicitudes HTTP son tratadas por el script CGI (y cualquier otro script o programa que llame) creado durante el proceso de la solicitud HTTP actual.

Acción

Se recomienda encarecidamente a todos los clientes de Red Hat que utilicen scripts CGI con PHP, Go o Python, aplicar las mitigaciones a sus sistemas. Encontrarán información sobre los paquetes impactados y las versiones de imágenes en la pestaña Resolver.

Reconocimientos

Red Hat agradece a Dominic Scheirlinck de VendHQ por reportar y su asistencia en este incidente.

Red Hat Product Security ha clasificado esta actualización como un nivel de impacto de seguridad Importante .

Para diagnosticar esta vulnerabilidad en su entorno OpenStack, consulte la pestaña Resolver

Productos impactados

  • Red Hat Enterprise Linux 7.x
  • Red Hat Enterprise Application Platform 6.x

  • Red Hat Enterprise Web Server 2.x

  • Red Hat JBoss Web Server 3.x

  • Red Hat Satellite

Descripción del ataque e impacto

El ataque

El ataque es bastante simple. Un atacante envía una solicitud HTTP muy bien elaborada a un script CGI vulnerable CGI. La solicitud contiene un encabezamiento "Proxy" con el nombre de host o dirección IP o puerto de un proxy controlado por una atacante como su valor. El servidor HTTP recibe la solicitud y, como parte del proceso usual, convierte el encabezamiento del "Proxy" y su valor en la variable de metadatos "HTTP_PROXY" antes de llamar al script CGI. El script CGI, lee la variable HTTP_PROXY, pero la confunde con la variable de "system", utilizada para comunicar los parámetros para el proxy HTTP saliente, y se configura para usar el proxy especificado. Si el script CGI realiza solicitudes HTTP, dichas solicitudes son enviadas a través de un proxy controlado por el atacante, lo cual permite al atacante ejecutar como "Hombre en el medio" todas las partes del tráfico HTTP.

Impacto y gravedad

Los scripts CGI únicamente son susceptibles a esta vulnerabilidad si malinterpretan la variable HTTP_PROXY Y envían solicitudes HTTP (o en algunos casos HTTPS). El número de scripts que haga ambas cosas será menor al subconjunto de los scripts CGI generales.

Es difícil establecer el impacto global y la gravedad, puesto que todo depende del comportamiento del script. Un escenario preocupante es el de un script CGI que realice tareas confidenciales (por ejemplo, autenticación mediante una API REST-style). En este caso, el atacante podría redirigir todas las partes del tráfico HTTP entre el script CGI y el servidor HTTP (REST-style) a través de un proxy controlado por él mismo. Esto podría conllevar a divulgar la información confidencial contenida en la solicitud y la respuesta enviada entre el script CGI y el servidor HTTP.

Además, el atacante podría manipular la solicitud y el contenido de la respuesta. Si el script CGI envía solicitudes a un servidor interno que no puede ser conectado desde la Internet externa, el proxy del atacante podría comunicarse con el servidor interno y el atacante no podría interceptar las respuestas del servidor interno. Sin embargo, el atacante aún podría interceptar la solicitud de script CGI y enviar una respuesta falsa.

Diagnóstico

Para diagnosticar el incidente, instale temporalmente lo siguiente como un script CGI en su servidor y hágalo ejecutable:


test.cgi:

#!/bin/sh
echo "Content-Type:text/plain"
​echo ""
echo "HTTP_PROXY='$HTTP_PROXY'"
											

Luego llame al script CGI con un encabezamiento de solicitud “Proxy:”:

curl -H ‘Proxy: AFFECTED’ http://my-server-name/cgi-bin/test.cgi
												

Si ve la siguiente salida, significará que su servidor no ha sido afectado:

HTTP_PROXY="
													

Si en cambio, usted ve la siguiente salida o cualquier otra salida, su servidor puede estar afectado y deberá aplicar una de las mitigaciones de abajo:

HTTP_PROXY='AFFECTED'
														

Mitigación

Para obtener información sobre la mitigación, revise el artículo de la base de conocimiento que corresponda a su servidor impactado:

HTTPoxy - ¿Se ha afectado mi JBoss/tomcat ?

HTTPoxy - ¿Se ha afectado mi Apache mod_cgi?

HTTPoxy - ¿Se ha afectado mi nginx?

HTTPoxy - ¿Se ha afectado mi Apache mod_fcgid?

HTTPoxy - ¿Se ha afectado mi aplicación PHP?

HTTPoxy - ¿Se ha afectado mi Go?

Actualizaciones por productos afectados

El 18 de julio de 2016, se lanzaron los correctivos para todos los productos impactados.

Producto Paquete Recomendación/Actualización
Red Hat Enterprise Linux 5.x httpd RHSA-2016:1421
Red Hat Enterprise Linux 6.x httpd RHSA-2016:1421
Red Hat Enterprise Linux 7.x httpd RHSA-2016:1422
Red Hat Enterprise Application Platform 6.x httpd parches pendientes
Red Hat Enterprise Web Server 2.x httpd parches pendientes
Red Hat JBoss Web Server 3.x httpd parches pendientes
Red Hat Software Collections httpd24 RHSA-2016:1420

Comments