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