ImageMagick [CVE-2016–3714] — Критическая уязвимость

В популярной библиотеке ImageMagick, с помощью которой программисты реализуют оптимизацию и изменение размеров загруженных на сайт изображений, обнаружена фатальная уязвимость. Она позволяет присоединится непосредственно к консоли сервера, чтобы получить доступ к исходному коду базы данных сервера и к другим критическим данным.


Уже существуют действующие скрипты для получения доступа на сервер, сама по себе методика атаки предельно простая. Мы ожидаем в ближайшее время большое количество эксплуатаций этой ошибки, поскольку сейчас активно распространяются рабочие скрипты для получения доступа на сервер, и к тому же сама по себе методика атаки предельно простая. Проблема исправляется простым набором операций, понятных даже специалисту с минимальными навыками (залазить в код не придется).

Попросите сотрудника, который занимается у вас работой на сервере, их выполнить.

Об уязвимости
Уязвимость вызвана ненадлежащей проверкой имён файлов при вызове внешних обработчиков, что позволяет злоумышленнику выполнять произвольные SHELL-команды от имени приложения. Также SVG и MVG форматы, поддерживаемые ImageMagick, могут включать в себя внешние ресурсы – это и несет в себе основную угрозу. Если ваше приложение не проверяет изображение перед конвертацией должным образом и напрямую отдает картинку на обработку – оно уязвимо.

Эксплуатация
Самое важное - процесс эксплуатации уязвимости примитивен. В качестве базовой проверки на собственной машине можно создать файл следующего содержания под названием exploit.mvg

    push graphic-context viewbox 0 0 640 480 fill 'url(https://example.com/image.jpg"|ls "-la)' pop graphic-context

и выполнить команду

...
$ 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 ..

...

Решение
Суть решения в том, чтобы запретить уязвимые обработчики, т.к. обновления для библиотеки ImageMagick от разработчиков все еще на стадии подготовки. Сперва нам нужно понять, откуда загружаются политики, которые использует утилита, а именно policy.xml
Для прояснения этого момента мы можем сделать следующее:

Выполнить convert -list policy:

...

Path: /etc/ImageMagick/policy.xml

...

Path - путь до файла с политиками.
Но в выводе convert не всегда может быть путь до файла, в таком случае нам поможет

strace -e file convert -list policy 2>&1 | grep xml

В выводе данной команды мы можем увидеть примерно следующее


open("/usr/share/ImageMagick-6.7.7/policy.xml", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/lib/x86_64-linux-gnu/ImageMagick-6.7.7/config/policy.xml", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/etc/ImageMagick/policy.xml", O_RDONLY) = 3
open("/usr/share/doc/ImageMagick-6.7.7/policy.xml",O_RDONLY) = -1 ENOENT (No such file or directory)
open("/root/.magick/policy.xml", O_RDONLY) = -1 ENOENT (No such file or directory)

Утилита convert произвела поиск файла в нескольких местах. В данном примере мы видим пути, по которым она их искала.

Наиболее правильным решением будет расположить файл policy.xml https://www.itsumma.ru/policy.xml в привычном для мира Linux каталоге /etc, а именно в /etc/ImageMagick/policy.xml (соответствует пути в 3-й строчке вывода strace выше). Перед применением фикса стоит удостовериться в том, что вы используете именно стандартные настройки (в редких случаях приложениям требуются нестандартные настройки ImageMagick – в этом случае предложенный фикс вам, скорее всего, не подойдет).

Сверить файл можно по контрольной сумме md5:


md5sum /etc/ImageMagick/policy.xml
0e8dd72c8d56a60e100c73c250c1ebd7

Если хэш у вас идентичен приведенному выше, значит вы используете стандартные настройки и фикс к ним применим.


    
    
    
    
    
    
    

Применить фикс просто: скачайте файл в нужное место на вашем сервере (см. вывод convert -list policy).


cp /etc/ImageMagick/policy.xml /etc/ImageMagick/policy.xml.bkp # Делаем резервную копию на всякий случай

curl https://www.itsumma.ru/policy.xml -o /etc/ImageMagick/policy.xml

md5sum /etc/ImageMagick/policy.xml # проверяем контрольную сумму

4bc6723aa18dd8462648ffe9aba8b39e # должна быть такая же

 

Дополнительно стоит взглянуть на вывод convert -list policy:

 


Path: [built-in]

Policy: Undefined

rights: None



Path: /etc/ImageMagick/policy.xml

Policy: Coder

rights: None

pattern: EPHEMERAL

Policy: Coder

rights: None

pattern: URL

Policy: Coder

rights: None

pattern: HTTP

Policy: Coder

rights: None

pattern: HTTPS

Policy: Coder

rights: None

pattern: MVG

Policy: Coder

rights: None

pattern: MSL


Здесь отображаются отключенные нами обработчики. Если вывод соответствует приведенному выше, значит фикс установлен. Если нет – что-то пошло не так.

Далее, чтобы применить наш фикс к работающему приложению, сначала нужно разобраться, какие процессы используют библиотеку ImageMagick прямо сейчас и перезапустить их.

Перечень процессов можно узнать, выполнив команду lsof -n 2> /dev/null | grep -iE 'Wand|magick'


php-fpm 11290 www mem REG 9,2 2229096 11278090 /usr/lib64/libMagickCore.so.2.0.0

php-fpm 11290 www mem REG 9,2 1097720 11278091 /usr/lib64/libMagickWand.so.2.0.0

php-fpm 11290 www mem REG 9,2 1078657 11278001 /usr/lib64/php/modules/imagick.so


В данном примере мы видим процесс php-fpm, который необходимо перезагрузить для применения конфига в любое удобное нам время. Обратите внимание: до перезагрузки процесса новые политики не применяются.

Дополнительную информацию о проблеме можно найти здесь:
imagetragick.com
opennet.ru

Готовы обсудить проект?

Ответим на заявку в ближайшие 24 часа. А еще мы можем проконсультировать вас по телефону +7 800 555-91-99, электронной почте info@itsumma.ru или в Telegram-чате.

Свяжитесь со мной здесь
Свяжитесь со мной здесь
❗️Имя не может быть пустым
❗️Телефон не может быть пустым
❗️Email не может быть пустым