Приемы, затрудняющие
обнаружение и анализ
вредоносного кода в 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 в командной строке)
Самый доступный инструмент. Хорошо работает у
админов, которые знают свои сервера и сайты.
Конец)
Спасибо за внимание!
Докладчик: Григорий Земсков, компания “Ревизиум”
www.revisium.com
audit@revisium.com

Приемы, затрудняющие обнаружение и анализ вредоносного кода в PHP скриптах

  • 1.
    Приемы, затрудняющие обнаружение ианализ вредоносного кода в PHP-сценариях Григорий Земсков, компания “Ревизиум” PHDays 2014
  • 2.
    Интро  Разработчики вредоносовиспользуют шифрование, обфускацию, различные ухищрения и возможности php  Две цели: 1) затруднить обнаружение 2) затруднить анализ  Самые “живучие” скрипты – использующие оба подхода  Методы могут использоваться разработчиками защиты лицензионного софта  Обнаружение выполняется по:  Контрольным суммам, хэшам  По сигнатурам (фикс. строки, “регулярки”)  Нечетким правилам, эвристике  10 приемов для затруднения обнаружения и 9 приемов затруднения анализа
  • 3.
    Затруднение обнаружения 1 Отбивка кода пробельными символами (пробелы, табы, переводы строки)
  • 4.
    Затруднение обнаружения 2 Сокрытие кода среди “мусора”, комментариев, внутри бинарных файлов, картинок и после заголовка .gif.
  • 5.
    Затруднение обнаружения 3 Сокрытие кода в мета-данных картинок .jpg (exif заголовок), .png.
  • 6.
    Затруднение обнаружения 4 “Мимикрия” php кода (маскировка под важный код)  Обрамление кода пугающими комментариями вида “DO NOT DELETE THIS CODE OTHERWISE SCRIPT DOESN’T OPERATE PROPERLY…”  Приклеивание к многострочным комментариям  Размещение кода между или после больших комментариев
  • 7.
    Затруднение обнаружения 5 Маскировка обфусцированного кода под PGP ключ, файл данных или лицензионный ключ
  • 8.
    Затруднение обнаружения 6 Код, написанный согласно coding style и/или вставленный в середину большого скрипта, ООП код, вставка внутрь функций или классов
  • 9.
    Затруднение обнаружения 7 Фрагментация кода (склейка из большого числа подстрок)
  • 10.
    Затруднение обнаружения 8 Полиморфный или обфусцированный фрагмент
  • 11.
    Затруднение обнаружения 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…  Без использования регулярных выражений не обнаружить
  • 12.
    Затруднение обнаружения 10 Маскировка за счет имен файлов  Именование вредоносных скриптов созвучно файлам cms: LICNESE.php, odbc_connect1.php  Использование скрытых файлов и каталогов .images, .configure.php  Обфускация имен файлов и директорий
  • 13.
    Затруднение анализа: шифрование/обфускация base64, rot13, zip архивация, шифрование кастомным шифровщиком – “классика жанра”
  • 14.
    Затруднение анализа: шифрование/обфускация Запись строк в виде hex/oct последовательностей
  • 15.
  • 16.
    Затруднение анализа: шифрование/обфускация Обфускация идентификаторов (имен переменных, функций, классов…)
  • 17.
    Затруднение анализа: шифрование/обфускация Шифрование кода через логические операции над строками
  • 18.
    Затруднение анализа: шифрование/обфускация Многоступенчатое шифрование кода (“матрешка”)
  • 19.
    Затруднение анализа: использованиеВ.И.Д.  Использование внешних источников данных в качестве хранилища кода  БД  Внешний сервер  Локальный файл  Memcached  COOKIE, переменные окружения, параметры скрипта  Мета-данные файлов изображений
  • 20.
    Затруднение анализа: неявныйвызов  Динамическое формирование кода и неявные вызовы  выполнение кода через 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()
  • 21.
    Затруднение анализа: антиреверс Использование проверок, затрудняющих реверс- инжиниринг  защита от декодирования за счет проверки на наличие в коде скрипта функций echo, print, var_dump, print_r и аварийное завершение при обнаружении  проверка в скрипте, что код запускается в окружении сервера или конкретного сайта  авторизация по входным параметрам. Код выполняется только при определенных значениях параметров запроса
  • 22.
    Инструменты, облегчающие анализскриптов Инструменты анализа скриптов (реверс-инжиниринг)  Декодеры  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)
  • 23.
    Сканеры вредоносных скриптовна сервере  AI-Bolit (http://revisium.com/ai/ ) Ищет по регулярным выражениям, а не хэшам. Большая база, эвристика.  ClamAv (http://www.clamav.net/lang/en/ ) Самый популярный на хостингах. Ищет по хэшам.  Maldet (https://www.rfxn.com/projects/linux-malware- detect/ ) Большая база хэшей.  Десктопные антивирусы (с оговорками)  “Ручки” (find/grep в командной строке) Самый доступный инструмент. Хорошо работает у админов, которые знают свои сервера и сайты.
  • 24.
    Конец) Спасибо за внимание! Докладчик:Григорий Земсков, компания “Ревизиум” www.revisium.com audit@revisium.com