Upload
revisium
View
282
Download
4
Embed Size (px)
DESCRIPTION
Как хакеры и разработчики вредоносного кода затрудняют обнаружение и анализ кода в PHP скриптах.
Citation preview
Приемы, затрудняющие обнаружение и анализ вредоносного кода в PHP-сценариях
Григорий Земсков, компания “Ревизиум”
PHDays 2014
Интро
Разработчики вредоносов используют шифрование, обфускацию, различные ухищрения и возможности php
Две цели: 1) затруднить обнаружение 2) затруднить анализ Самые “живучие” скрипты – использующие оба подхода Методы могут использоваться разработчиками защиты лицензионного софта Обнаружение выполняется по:
Контрольным суммам, хэшам По сигнатурам (фикс. строки, “регулярки”) Нечетким правилам, эвристике
10 приемов для затруднения обнаружения и 9 приемов затруднения анализа
Затруднение обнаружения 1
Отбивка кода пробельными символами (пробелы, табы, переводы строки)
Затруднение обнаружения 2
Сокрытие кода среди “мусора”, комментариев, внутри бинарных файлов, картинок и после заголовка .gif.
Затруднение обнаружения 3
Сокрытие кода в мета-данных картинок .jpg (exif заголовок), .png.
Затруднение обнаружения 4
“Мимикрия” php кода (маскировка под важный код) Обрамление кода пугающими комментариями вида “DO NOT
DELETE THIS CODE OTHERWISE SCRIPT DOESN’T OPERATE PROPERLY…”
Приклеивание к многострочным комментариям Размещение кода между или после больших комментариев
Затруднение обнаружения 5
Маскировка обфусцированного кода под PGP ключ, файл данных или лицензионный ключ
Затруднение обнаружения 6
Код, написанный согласно coding style и/или вставленный в середину большого скрипта, ООП код, вставка внутрь функций или классов
Затруднение обнаружения 7
Фрагментация кода (склейка из большого числа подстрок)
Затруднение обнаружения 8
Полиморфный или обфусцированный фрагмент
Затруднение обнаружения 9
Использование “гибкого синтаксиса” языка php для записи конструкций Строки как константы:
@assert( @$_POST[a])
Пробельные символы/переводы строк в аргументах: preg_replace( '/.*/e' , …)
Косвенный вызов: $_POST [‘f’]( $_POST[ ‘arg’ ])
Разбавление кода комментариями: eval(/*zzz*/ gzinflate( @base64_decode…
Опускание скобок при вызове функций: $a = base64_decode ‘…’;
Не чувствительность к региструPrEG_ReplAce(‘/.’ . ‘*/’ . “e”, ‘eval(base64…
Без использования регулярных выражений не обнаружить
Затруднение обнаружения 10
Маскировка за счет имен файлов Именование вредоносных скриптов созвучно файлам cms:
LICNESE.php, odbc_connect1.php Использование скрытых файлов и каталогов
.images, .configure.php Обфускация имен файлов и директорий
Затруднение анализа: шифрование/обфускация
base64, rot13, zip архивация, шифрование кастомным шифровщиком – “классика жанра”
Затруднение анализа: шифрование/обфускация
Запись строк в виде hex/oct последовательностей
Затруднение анализа: шифрование/обфускация
Замусоривание кода
Затруднение анализа: шифрование/обфускация
Обфускация идентификаторов (имен переменных, функций, классов…)
Затруднение анализа: шифрование/обфускация
Шифрование кода через логические операции над строками
Затруднение анализа: шифрование/обфускация
Многоступенчатое шифрование кода (“матрешка”)
Затруднение анализа: использование В.И.Д.
Использование внешних источников данных в качестве хранилища кода БД Внешний сервер Локальный файл Memcached COOKIE, переменные окружения, параметры скрипта Мета-данные файлов изображений
Затруднение анализа: неявный вызов
Динамическое формирование кода и неявные вызовы выполнение кода через eval, assert, *sort, array* и разные итераторы выполнение кода через preg_replace('/.*/e') косвенный вызов функции $a($b) выполнение кода через preg_replace_callback через регистрацию функции завершения register_shutdown_function использование механизма autoload (2 варианта) использование обработчика сессии session_set_save_handler вызов через обработчик исключений set_exception_handler использование обработчика ошибок set_error_handler использование собственного загрузчика сущностей
libxml_set_external_entity_loader создание собственного стрима для неявного вызова кода
stream_wrapper_register php_auto_append / php_auto_prepend динамическая загрузка расширений функцией dl()
Затруднение анализа: антиреверс
Использование проверок, затрудняющих реверс-инжиниринг защита от декодирования за счет проверки на наличие в коде
скрипта функций echo, print, var_dump, print_r и аварийное завершение при обнаружении
проверка в скрипте, что код запускается в окружении сервера или конкретного сайта
авторизация по входным параметрам. Код выполняется только при определенных значениях параметров запроса
Инструменты, облегчающие анализ скриптов
Инструменты анализа скриптов (реверс-инжиниринг) Декодеры
http://ddecode.com/ (PHP) http://www.whitefirdesign.com/tools/unobfuscate-php-hack-
code.html (PHP)
http://www.unphp.net/ (PHP) http://iblogbox.com/devtools/js/ (JS) http://php-security.org/ evalhook (PHP)
Отладка Chrome Firebug, IE10 Debugger (JS) http://www.xdebug.org/ (PHP) NuSphere DBG http://www.php-debugger.com/dbg/ (PHP) http://www.php-debug.com/www/ (PHP)
Сканеры вредоносных скриптов на сервере
AI-Bolit (http://revisium.com/ai/ )Ищет по регулярным выражениям, а не хэшам. Большая база, эвристика.
ClamAv (http://www.clamav.net/lang/en/ )Самый популярный на хостингах. Ищет по хэшам.
Maldet (https://www.rfxn.com/projects/linux-malware-detect/ )Большая база хэшей.
Десктопные антивирусы (с оговорками) “Ручки” (find/grep в командной строке)
Самый доступный инструмент. Хорошо работает у админов, которые знают свои сервера и сайты.