Análisis: Grave vulnerabilidad en PHP y CGI

Publicado en Artículos, Seguridad,


Tweet about this on TwitterShare on Google+3Share on Facebook0Share on LinkedIn0

A finales de la semana pasada hubo un gran revuelo porque se publicó una vulnerabilidad que podría estar presente hace más de 8 años y que afecta a aquellos servidores que ejecutan PHP como interfaz de entrada común o CGI. Particularmente, esta vulnerabilidad (CVE-2012-1823) admite la inyección de argumentos debido a que los mismos no son debidamente controlados y permiten acceder a información que no debería ser visible, como por ejemplo, el código fuente de una página PHP, o incluso la ejecución de comandos de forma remota.

¿Qué es CGI o interfaz de entrada común?

Para comprender en qué consiste la vulnerabilidad es importante entender la tecnología CGI. Particularmente, esta tecnología es muy utilizada por los servidores web y permite a un cliente (por ejemplo, un navegador web) solicitar datos e información a dichos servidores que son obtenidos mediante la ejecución de un programa en el mismo. En otras palabras, permite extender las capacidades de HTTP, agregando funcionalidad al servidor web.

Generalmente esta tecnología es utilizada en conjunto con el famoso servidor Apache. A su vez, muchos de los servidores que hoy existen en la red, están configurados para soportar PHP. Es por esto que es importante aclarar algunos detalles que conciernen a estas tecnologías.

A grandes rasgos, Apache cuenta con módulos para el soporte de PHP nativo. Estos módulos están compilados como parte del propio binario de Apache por lo que para atender los requerimientos se utilizan procesos hijos e hilos. Esta configuración es ampliamente utilizada ya que brinda un buen rendimiento a la hora de atender múltiples peticiones.
CGI trabaja de forma un poco diferente. Cada petición que recibe el servidor crea un nuevo proceso para atender la misma, y en el caso de PHP crea un proceso del intérprete PHP por cada petición.

A partir de todo esto, hay que destacar que la vulnerabilidad afecta al segundo método que se explicó anteriormente, es decir, cuando se utiliza PHP mediante CGI. Un detalle que hay que tener en cuenta es que FastCGI (variación de CGI con algunas mejoras) no es vulnerable a este tipo de inyección de parámetros.

A continuación se pueden visualizar las dos configuraciones de las API del servidor que se explicaron anteriormente.

¿Qué versiones son vulnerables y en dónde radica la vulnerabilidad?

Hasta el momento, las versiones conocidas que son vulnerables son:

  • Versiones de PHP anteriores a 5.3.12
  • Versiones de PHP anteriores a 5.4.2

Uno de los puntos que llama la atención es que esta vulnerabilidad pudo haber sido explotada durante los últimos ocho años, y su criticidad es realmente alta ya que permite incluso la ejecución de código.

La vulnerabilidad reside en la falta de controles en el pasaje de parámetros. Existen diferentes parámetros para la ejecución de CGI tal como se ve en la siguiente imagen:

Puntualmente el parámetro “-s” permite ver el código fuente de aquella aplicación que se esté ejecutando mediante CGI. Esto puede revelar información muy sensible si alguien, por ejemplo, inserta mediante un navegador este parámetro en el contexto de un archivo PHP. En otras palabras, permitirá ver el código fuente de cualquier archivo que se ejecute mediante la interfaz CGI. Si esto se lo proyecta en archivos de configuración, se puede acceder a información muy sensible, como por ejemplo, contraseñas de bases de datos, entre otros.

También se puede visualizar el archivo de configuración de WordPresswp-config.php” si este es ejecutado mediante la interfaz CGI haciendo uso de la inyección de parámetros. Este archivo contiene los datos referentes a la conexión de la base de datos del propio WordPress. Cabe destacar que esta no es una vulnerabilidad de WordPress, sino que a través de CGI pueden verse los códigos fuentes de los distintos archivos de la plataforma de blogging.

Muchas veces surge la pregunta de cómo es posible que se comprometan ciertos sitios de prestigio incluso alojando malware en el propio servidor con el fin de poder diseminarlo aprovechando la reputación y el alcance del sitio infectado. Si bien no es posible decir que solo a través de esta vulnerabilidad, si es posible pensar que es viable debido a que, como se mencionó anteriormente, está vigente hace más de ocho años.

¿Cómo es posible la ejecución de código remoto?

Nuevamente, esto recae sobre la inyección de parámetros aprovechando las funcionalidades de CGI. Existe otro tipo de parámetro, específicamente “-d”, el cual permite la habilitación de ciertas opciones de PHP especificándolas directamente en el comando. Además utilizando esto junto con el parámetro “-n” se puede indicar que se ignore el archivo de configuración “php.ini”. De esta forma, es posible de alguna manera establecer las opciones según se requiera a través de parámetros.

Alguna de las opciones más llamativas para el contexto de esta vulnerabilidad son:

  • Allow_url_include: Permite el uso de fopen con algunas funciones como include, include_once,require, require_once.
  • Auto_prepend_file: Permite especificar un archivo que será interpretado antes del fichero principal.

A través de estos parámetros sería posible realizar lo que se conoce como RFI (remote file inclusion), es decir, ejecutar código desde un sitio remoto en el propio servidor. En la siguiente imagen se puede observar cómo a través de RFI se puede ejecutar el comando “phpinfo()”, el cual permite ver toda la información detallada sobre el PHP instalado en el servidor.

Entonces, de esta forma, es posible la ejecución de comandos de forma remota, ya que en este caso es posible ejecutar phpinfo(), por lo tanto será posible ejecutar cualquier código que soporte ejecución mediante CGI. Los resultados de estos comandos pueden comprometer seriamente la seguridad e integridad del servidor. Por ejemplo, si se desarrolla un script en PHP que permita ver las contraseñas del servidor y se lo ejecuta remotamente se puede tener una idea del daño que realizaría esta acción. A continuación, vemos unas capturas al respecto:

Como un detalle más, ya existen exploits públicos que aprovechan esta vulnerabilidad y comprometen el sistema vulnerable. Incluso existen módulos de herramientas que permiten realizar un escaneo en la red y determinar si el mismo es vulnerable o no. Todas estas herramientas y exploits utilizan el mismo principio y ejecutan las pruebas contra el servidor para probar si este responde devolviendo el código fuente. En caso de que la consulta sea exitosa, mediante distintos métodos combinando lo que se explicó anteriormente ejecuta comandos de forma remota.

Todo esto se puede hacia el contexto del malware. Un atacante podría utilizar esta vulnerabilidad para alojar de forma ilícita archivos maliciosos con la finalidad de infectar usuarios. Incluso podría modificar el código fuente del sitio con fines similares.

¿Cómo se soluciona?

Existen algunas alternativas para solucionar esta vulnerabilidad. Es posible realizar algunas modificaciones ya sea mediante el código fuente, es decir, descargándolo nuevamente con las modificaciones para que esto no ocurra, así como también es posible modificar uno de los módulos del servidor de Apache.

RewriteCond %{QUERY_STRING} ^(%2d|-)[^=]+$ [NC]
RewriteRule ^(.*) $1? [L]

De esta manera se controlan los parámetros que se insertan en las URL y como consecuencia el servidor ya no será vulnerable a este tipo de ataques.

Es más que notorio que la seguridad no puede ser tomada a la ligera. A veces una simple falla o vulnerabilidad que parece sencilla puede tener un gran impacto a nivel de la seguridad de un sistema si se lo utiliza en conjunción con otras técnicas. Es por eso que la seguridad debe ser gestionada para lograr la protección adecuada ante estos eventos y en caso de que un incidente ocurra, reponerse del mismo de la mejor forma posible.


Por Fernando Catoira vía ESET

Califica esta entrada

Etiquetas: , ,


Deja un comentario

Cuanto es 17 + 14 ?
Please leave these two fields as-is:
IMPORTANTE! Necesitas resolver la operación matemática para poder continuar.

Newsletter

Redes sociales

Centro de soporte

Centro de recursos