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

Блог · 14 ноября 2016
В популярной библиотеке 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

 

 

 

 

 

 

 

Поделиться записью