WWW.DISS.SELUK.RU

БЕСПЛАТНАЯ ЭЛЕКТРОННАЯ БИБЛИОТЕКА
(Авторефераты, диссертации, методички, учебные программы, монографии)

 

Pages:     || 2 | 3 |

«ИССЛЕДОВАНИЕ МЕТОДОВ ОБНАРУЖЕНИЯ ШЕЛЛКОДОВ В ВЫСОКОСКОРОСТНЫХ КАНАЛАХ ПЕРЕДАЧИ ДАННЫХ ...»

-- [ Страница 1 ] --

МОСКОВСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ

ИМ М. В. ЛОМОНОСОВА

На правах рукописи

ГАЙВОРОНСКАЯ СВЕТЛАНА АЛЕКСАНДРОВНА

ИССЛЕДОВАНИЕ

МЕТОДОВ ОБНАРУЖЕНИЯ ШЕЛЛКОДОВ

В ВЫСОКОСКОРОСТНЫХ КАНАЛАХ ПЕРЕДАЧИ

ДАННЫХ

Специальность 05.13.11 Математическое и программное обеспечение вычислительных машин, комплексов и компьютерных сетей Диссертация на соискание учёной степени кандидата физико-математических наук

Научный руководитель:

д. ф.-м. н., член-корр. РАН, профессор Смелянский Р.Л.

Москва – Оглавление Стр Список иллюстраций............................ Список таблиц................................ Введение................................... Глава 1. Задача распознавания объектов................. 1.1 Математическая модель..................... 1.2 Задача распознавания объектов................. 1.3 Постановка уточненной задачи распознавания объектов... 1.4 Предлагаемый подход к решению задачи распознавания... 1.5 Исследование алгоритма..................... Глава 2. Классификация вредоносного исполнимого кода........ 2.1 Признаки вредоносного исполнимого кода........... 2.1.1 Статические признаки................... 2.1.2 Динамические признаки................. 2.2 Классификация вредоносного исполнимого кода........ Глава 3. Методы обнаружения вредоносного исполнимого кода.... 3.1 Показатели эффективности методов.............. 3.2 Классификация методов обнаружения шеллкодов....... 3.3 Основные методы......................... 3.3.1 Статические методы.................... 3.3.2 Динамические методы................... 3.3.3 Гибридные методы..................... 3.4 Результаты обзора......................... Глава 4. Инструментальная среда обнаружения шеллкодов Demorpheus 4.1 Архитектура............................ 4.2 Компоненты системы....................... 4.2.1 Дизассемблирование входного потока.......... 4.2.2 Восстановление служебных структур.......... 4.2.3 Библиотека шеллкодов.................. 4.2.4 Гибридный классификатор................ 4.3 Испытания прототипа....................... 4.3.1 Тестовые наборы данных................. 4.3.2 Результаты экспериментов................ Глава 5. Заключение............................. Литература.................................. Приложение А. Алгоритм восстановления IFG.............. Список иллюстраций 1 Жизненный цикл ботнета...................... 2 Состояние стека при вызове функции target_instruction.

Указатель RET содержит адрес начала следующей инструкции. 3 Состояние стека после записи шеллкода. Указатель RET содержит адрес шеллкода (не обязательно начала).......... 4 Типичная структура шеллкода................... 5 Пример использования средства обнаружения и фильтрации шеллкодов.............................. 1.1 Пример классификатора...................... 1.2 Линейная структура классификаторов.............. 1.3 Возможный пример топологии графа принятия решений.... 2.1 Многобайтный NOP-эквивалентный след............. 2.2 Пример батутного NOP-следа................... 2.3 Пример батутного NOP-следа, исполнимого с каждого смещения.................................. 3.1 Пример генерации идентификатора подграфа.......... 3.2 Пример генерации идентификатора подграфа.......... 3.3 Пример генерации идентификатора подграфа.......... 4.1 Инструментальная среда Demorpheus............... 4.2 Пример работы среды Demorpheus................. 4.3 Пример части префиксного дерева дизассемблера........ 4.4 Пример вектора дизассемблированных цепочек......... 4.5 Сравнение времени работы для линейной и гибридной топологии детекторов на вредоносном и легитимном наборе данных.

Красная линия соответсвует линейной топологии, голубая гибридной.............................. 4.6 Сравнение времени работы для линейной и гибридной топологии детекторов на случайном и мультимедийном наборе данных. Красная линия соответсвует линейной топологии, голубая - гибридной........................... Список таблиц 2.1 Значения критериев статических признаков........... 2.2 Значения критериев динамических признаков.......... 3.1 Значения ошибок первого и второго рода и описание тестового набора данных некоторых методов................ 3.2 Значения ошибок первого и второго рода и описание тестового набора данных некоторых методов................ 3.3 Значения ошибок первого и второго рода и описание тестового набора данных некоторых методов................ 3.4 Алгоритмическая сложность методов.............. 3.5 Покрытие классов вредоносного исполнимого кода рассматриваемыми методами....................... 4.1 Результаты значений ошибок первого рода (FN) для линейной и гибридной структур классификаторов............. 4.2 Результаты значений ошибок второго рода (FP) для линейной и гибридной структур классификаторов............. 4.3 Результаты значений пропускной способности на тестовой машине. Значение оценивается в Mб/сек............... Введение С начала 2000-х годов и по сегодняшний день одним из ключевых инструментов киберпреступности являются ботнеты. Ботнетом называется сеть зараженных узлов, на которых запущен автономный процесс, выполняющий команды злоумышленника. Узел, на котором запущен такой процесс, принято называть ботом или узлом-зомби. Среди крупных ботнетов можно отметить Torpig, подробно исследованный командой ученых Университета Калифорнии в Санта-Барбаре [95], Zeus, по которому в 2010 году было завершено расследование ФБР и арестовано более двадцати человек [48], а так же ботнет Concker, который привлекал внимание исследователей с 2008 года, и долгое время оставался одним из самых распространенных ботов на пользовательских компьютерах [69].



Ботнеты используются для самой разнообразной криминальной деятельности, наиболее распространенными видами которой являются:

• Фишинг - кража финансовой и/или приватной информации пользователей распространенного программного обеспечения. Примером такого ботнета является Storm [79].

• Организация DDoS-атак. DDoS-атака (Destributed Denial of Service) - распределенная атака, нацеленная на исчерпание ресурсов узлажертвы [19]. Ботнеты, как наиболее удобный инструмент для организации подобных атак, активно используются злоумышленниками. К примеру, по статистике Arbor [1], в декабре 2013 года ежедневно были активны как минимум 1034 крупных ботнета, организующие DDoSатаки на клиентов компании, большая часть которых является Tier- провайдерами. В частности, в отчете Arbor отмечены такие крупные ботнеты, как Cutwail [15], Mariposa [96], Dirt Jumper [21], Darkness [8] • Рассылка спама. Спам - процесс рассылки сообщений, содержащих коммерческий или иной контент большому числу лиц, не выражавшим желания их получать. Использование ботнетов существенно увеличивает число разосланных сообщений в единицу времени. Примером спам-ботнета является Bobax [94].

• Кликфрод - процесс перехода на ссылки рекламодателей или другие сайты лицом, не заинтересованном в посещении данных ресурсов.

Кликфрод используется для повышения рейтинга веб-сайтов в поисковых системах, для повышения доходности рекламных площадок и др. Использование ботнета симулирует поведение большого числа легитимных пользователей [37].

Жизненный цикл любого ботнета [83] включает в себя несколько стадий (см. Рисунок 1) :

На стадии разработки осуществляется планирование архитектуры ботнета и его реализация. Архитектура ботнета может быть трех типов:

1. Централизованная (C2C: command to control) [23], в которой боты управляются некотором выделенным узлом. Такой выделенный узел принято называть бот-мастером.

2. Распределенная (P2P: peer to peer), где каждый из ботов может выполнять роль управляющего узла [84].

3. Гибридная, включающая в себя несколько равноправных подсетей ботнета, каждая из которых управляется выделенным узлом.

На стадии разработки так же выбирается механизм распространения ботнета и конкретная уязвимость, которая будет эксплуатироваться при распространении.

На стадии распространения, в некоторой литературе так же обозначающейся как стадии заражения, осуществляется эксплуатирование уязвимостей узлов и внедрения на них ботов. За счет этого достигается подключение к инфраструктуре ботнета как можно большего количества узлов, необходимых злоумышленнику. В целях увеличения эффективности распространения и заражения большего числа узлов, на которых могут быть запущены различное программное обеспечение, ботнеты для своего распространения используют одновременно до нескольких эксплойтов - вредоносных программ, эксплуатирующих уязвимости. Часто ботнеты используют для своего распространения zero-days эксплойты - вредоносные программы, эксплуатирующие еще неопубликованные ошибки в распространенном программном обеспечении. В качестве примера можно привести ботнет, распространяющийся с помощью червя Stuxnet [31], эксплуатирующий одновременно несколько уязвимостей системы SCADA, установленной на ядерных электростанциях, и ботнет Agobot [25], использующий для своего распространения более 10 эксплойтов одновременно.

Стадия взаимодействия характеризует взаимодействие между ботами и их мастером (в случае его наличия в архитектуре ботнета). Взаимодействие между узлами ботнета разделяют на процесс регистрации - процесса, во время которого скомпрометированный узел становится эффективной частью ботнета, и процесс получения команд от мастера или группы узлов в случае распределенной архитектуры ботнета.

На cтадии активности ботнет осуществляет вредоносную активность непосредственно.

В работе [83] рассматривается утверждение, что разрыв представленной цепочки на любой из стадий позволяет избежать потери от вредоносной активности ботнета. Стоит заметить, что разрыв цепочки на этапе разработки ботнета требует сотрудничества с его создателями, что на практике редко достижимо. Обнаружение и фильтрация ботнета на других стадиях его жизненного цикла возможна.

В настоящей работе рассматривается проблема обнаружения и фильтрации ботнетов на этапе их распространения, эффективная для борьбы с ботнетами в виду своей превентивности. В тот момент, когда осуществляется стадия вредоносной активности ботнета, ущерб атакуемым узлам уже нанесен либо полностью, либо частично. В этом случае задача обнаружения и фильтрации ботнетов сводится к борьбе с последствиями вредоносной активности. Превентивное обнаружение позволит минимизировать наносимый ботнетом ущерб.

Рассматривается проблема обнаружения и фильтрации ботнетов, распространяющихся посредством удаленного эксплуатирования уязвимостей работы с памятью. Уязвимости работы с памятью возникают тогда, когда некоторый код в программе записывает в память больше данных, чем было предусмотрено разработчиком приложения. Типичными примерами таких уязвимостей являются переполнение стека [75], переполнение кучи [22], [38], [62], а так же некоторых других служебных структур [106], [57], [27], [89], [55]. Несмотря на то, что набирает обороты использование веб-уязвимостей для распространения ботнетов посредством drive-by-download [36], [43], [82], заражения легитимных сайтов [71], значимость удаленно эксплуатируемых уязвимостей в распространенном программном обеспечении не снижается, и вряд ли будет снижаться в ближайшее время. Большая установочная база уязвимой версии программного обеспечения обеспечивает возможность быстрого захвата значительного числа узлов. В качестве примера можно привести недавно исправленные уязвимости протокола RDP компании Майкрософт [97], уязвимости Java [91]. За последние три года, согласно статистике CVE [39], было опубликовано около 15000 удаленно эксплуатируемых уязвимостей.

Вредоносный код, эксплуатирующий уязвимости работы с памятью, традиционно называется шеллкодом (shellcode) [75]. Название такого вредоносного кода обусловлено первыми атаками, эксплуатирующими уязвимости работы с памятью. Как правило, целью таких являлось получение доступа злоумышленника к консоли (shell) атакуемой системы с правами администратора. Несмотря на то, что в настоящее время с помощью таких атак возможно выполнение различной вредоносной активности, их название сохранилось.

В качестве примера рассмотрим подробнее шеллкоды, эксплуатирующие переполнения стека - один из наиболее популярных и хорошо изученных методов эксплуатирования ошибок работы с памятью. Впервые описание этой атаки было опубликовано в 1996 году в работе [75]. Тем не менее, об этой уязвимости было известно задолго до данной публикации - упоминания об этой уязвимости встречаются на протяжении как минимум 25 лет [67].

Переполнение стека возможно из-за отсутствия неявных проверок границ записываемых данных в языках C и C++ : в данных языках возможна запись большего числа данных в буфер, чем его размер. Рассмотрим эксплуатирование этой уязвимости на примере. Пусть в программе содержится некоторая уязвимая функция, в которой определяется локальный массив некоторого размера. При вызове функции в стек заносится значение адреса возврата - адреса, на который необходимо передать управление при завершении функции (например, на адрес инструкции, расположенной в памяти за вызываемой функцией непосредственно). Так же в стек заносится значение флага BP, после чего выделяется память под локальные переменные функции. Пример стека при вызове функции изображен на рисунке 2.

Цель атакующего в данном случае - записать в область, отведенную под локальные переменные, специально сформированную строку бльшей длиo ны таким образом, чтобы адрес возврата из функции был перезаписан на специально сформированное значение. Строка, перезаписывающая значения стека, содержит в себе вредоносные инструкции. Таким образом, цель атакующего - перезаписать адрес возврата таким образом, чтобы управление при выходе из функций передавалось на только что внедренные данные.

Пример стека с внедренным шеллкодом приведен на рисунке 3.

стек код Рис. 2: Состояние стека при вызове функции target_instruction. Указатель RET содержит адрес начала следующей инструкции.

В отличие от вирусов, имеющих неограниченное число модификаций, шеллкоды имеют типичную структуру. Структуры шеллкодов, эксплуатирующих уязвимости переполнения стека, кучи, строковых переменных схошеллкод Рис. 3: Состояние стека после записи шеллкода. Указатель RET содержит адрес шеллкода (не обязательно начала).

жи, но могут различаться в отдельных компонентах (например, шеллкод, эксплуатирующий уязвимость переполнения кучи, не обязательно должен содержать активатор). Рассмотрим типичную структуру шеллкода, эксплуатирующего уязвимость переполнения стека (см. Рисунок 4).

Активатор представляет из себя участок тела шеллкода, гарантирующий корректное выполнение полезной нагрузки шеллкода. Под корректным выполнением здесь будем понимать выполнение функциональности, заложенной автором шеллкода. Необходимость в активаторе возникает в виду того, что зачастую атакующий не знает конкретных характеристик атакуемого узла: адресации, адреса начала стека и других характеристик, влияющих на выполнение внедренного кода. В случае, если управление передано на некоторое смещение от начала шеллкода, возможно выполнение совершенно иной цепочки инструкций или даже некорректной инструкции, что может привести к аварийному завершению исполнимого процесса. Активатор может быть представлен одной из следующих сущностей:

• NOP-след (No OPeration) - набор инструкций, обладающий следующими двумя свойствами:

1. NOP-след не влияет на выполнение программы. NOP-след может быть представлен как инструкцией nop (0x90) непосредственно, так и состоять из многобайтовых инструкций, производящих в том числе и арифметические операции, но не задействующие ресурсы (регистры, память), используемые в коде далее. Таким образом, единственный эффект выполнения NOP-следа - увеличение программного счетчика.

2. NOP-след представляет из себя корректную цепочку инструкций целевого процессора, начиная с любого смещения. Данное свойство гарантирует достижимость вредоносной нагрузки шеллкода, не зависимо от того, на какое смещение от начала шеллкода было передано управление (учитывая, что смещение не превышает размер NOP-следа).

• GetPC код (Get Program Counter) - код, вычисляющий свое расположение в адресном пространстве исполнимого процесса. GetPC код может использоваться только с шеллкодами, содержащими декриптор.

Подобный код встречается в шеллкодах в виду того, что злоумышленник не имеет возможность заранее предсказать абсолютный адрес в адресном пространстве исполнимого процесса, в который внедряется шеллкод. Тем не менее, для успешной расшифровки зашифрованной полезной нагрузки, декриптору эта информация необходима.

Декриптор. Часть тела шеллкода, необходимая для расшифровки зашифрованной части шеллкода, в случае ее присутствия. Декрипторы используются в шеллкодах, содержащих обфускации, которые активно используются злоумышленниками для уклонения от обнаружения: самораспаковка, самомодификация [105]. При этом обфусцированная часть шеллкода, производящая вредоносную активность непосредственно, до расшифровки представляет из себя набор случайных данных, а потому может быть принята различными средствами обнаружения за легитимные данные. Декриптор может представлять из себя как функцию, производящую простейшие модификации над зашифрованным телом шеллкода (xor, and, not), так и реализовывать более сложные криптоалгоритмы [50]. Шеллкод, не содержащий декрипторную часть, принято называть простым шеллкодом (plain shellcode).

Полезная нагрузка. Полезная нагрузка является неотъемлемой частью любого шеллкода. Это участок кода, выполняющий вредоносную активность непосредственно. В случае обфусцированных шеллкодов, полезная нагрузка до работы декриптора может представлять из себя последовательность случайных данных.

Зона адресов возврата. Зона адресов возврата содержит предполагаемый злоумышленником абсолютный адрес, который должен указывать внутрь NOP-следа или передавать управление на GetPC-код. Для того, чтобы увеличить вероятность перезаписывания зоны адресов возврата стека на нужное значение, оно дублируется после полезной нагрузки шеллкода несколько раз [99].

В данной работе рассматривается задача обнаружения и фильтрации ботнетов, распространяющихся посредством шеллкодов, на высокоскоростных каналах передачи данных (например, с пропускной способностью в 1Гб/сек). Возможный пример применения решения поставленной проблемы - монитор в рамках IDS/IPS - изображен на рисунке 5. На данном рисунке каждый пакет, проходящий по каналу, анализируется на предмет содержания в нем шеллкодов. Если шеллкод в пакете обнаружен, то пакет сбрасывается.

Рис. 5: Пример использования средства обнаружения и фильтрации шеллкодов.

Это, в свою очередь, накладывает определенные ограничения на решение рассматриваемой проблемы. В виду того, что высокоскоростные каналы характеризуются большим объемом передаваемой информации, проходящей по каналу в единицу времени, алгоритмическая сложность решения крайне критична. В случае высокой алгоритмической сложности возможно два сценария. При первом проходящие по каналу данные будут обработаны частично, что не дает гарантий обнаружения ботнета в обработанном объеме данных, даже при условии его передачи по каналу. Обработка же всего объема передаваемых данных влечет за собой уменьшение пропускной способности канала до значения пропускной способности средства обнаружения распространения ботнетов, либо приводит к запозданию решения о вредоносности данных. Последнее означает, что даже если в проходящем трафике были обнаружены шеллкоды, то данные уже были переданы далее, а ущерб, возможно, уже нанесен.

Кроме того, для средства обнаружения и фильтрации шеллкодов крайне важен показатель ложных срабатываний. При больших объемах анализируемых данных, даже незначительный процент ложных срабатываний метода влечет за собой значительное абсолютное значение ложных алертов, что может сказаться на качестве обслуживания легитимных пользователей.

Апробация работы. Основные результаты диссертационной работы опубликованы в статьях [109], [110], [53], [111], [112], в том числе две [109] и [110] - в изданиях, рекомендованных ВАК для публикации результатов кандидатских и докторских диссертаций. Результаты докладывались на научном семинаре лаборатории вычислительных комплексов кафедры АСВК факультета ВМиК МГУ им М. В. Ломоносова под руководством член-корр.

РАН Р. Л. Смелянского; на семинаре кафедры АСВК под руководством член-корр. РАН Л. Н. Королева; на научном семинаре группы Network and system security исследовательского подразделения компании Майкрософт, а так же на следующих конференциях:

1. Конференция РусКрипто, Солнечногорск, Россия, 27-29 марта 2. Конференция РусКрипто, Солнечногорск, Россия, 28-31 марта 3. Международная конференция DEFCON-20, Лас-Вегас, США, 26- июля 2012г.

4. Международная конференция BlackHat-EU-13, Амстердам, Нидерланды, 12-15 марта 2013г.

5. Летний коллоквиум молодых ученых в области программной инженерии SYRCoSE, Казань, Россия, 30-31 мая 2013г.

6. Международная конференция NOPCON, Стамбул, Турция, 6 июня

Работа была выполнена при поддержке фонда Сколково.

Работа структурирована следующим образом. В главе 1 приводится математическая модель, в рамках которой ставится задача распознавания объектов - отнесения анализируемых объектов к множеству заданных классов, а так же предлагается решение поставленной задачи. Главы 2 и 3 посвящены обоснованию применимости предложенной модели к шеллкодам.

В главе 2 описаны выделенные признаки шеллкодов, а так же предлагается классификация шеллкодов. В главе 3 приведен обзор существующих алгоритмов обнаружения шеллкодов. В главе 4 приведено описание инструментального средства обнаружения шеллкодов Demorpheus и приведены результаты его экспериментального исследования. Глава 5 содержит заключение представленной работы.

Глава 1. Задача распознавания объектов В данной главе рассматривается формальная модель процесса распознавания шеллкода (объекта), свойства этого процесса, его основные понятия и их свойства. В рамках построенной модели ставится задача распознавания объектов - задача отнесения объектов в некоторому фиксированному множеству классов объектов. Так же в данной главе приводится доказательство существования решения задачи распознавания шеллкодов в рамках приведенной модели и приводится алгоритм, строящий такое решение.

1.1. Математическая модель Рассмотрим набор некоторый набор битовых исполнимых строк {si}n = {s1,..., sn }, в дальнейшем называемых исследуемыми объектаi= ми, или просто объектами. Исполнимость битовых строк в данном случае будем понимать в интуитивном смысле этого слова.

Пусть множеству рассматриваемых объектов сопоставлен набор признаков {fj }k, каждым из которых обладает хотя бы один из объектов si рассматриваемого множества. Пусть каждому объекту si сопоставлено некоторое непустое подмножество {fj } = признаков, которыми объект sj обладает. Введем на множестве объектов {si }n множество вычислимых функций {Fj (sj )}k, ставящих в соответствие объекту si значение признака fj, где признаки могут принимать значения из множества {0, 1}. Значение признака fj равно 0 в том случае, если объект si не обладает признаком fj и 1 в противном случае.

Произведем разбиение множества исследуемых объектов на подмножества {K1,..., Kl}. В дальнейшем такие подмножества будем называть классами объектов. Будем считать, что каждый класс определяется некоторой структурой признаков из {fk }. Такие подмножества будем называть определяющими наборами для соответствующих классов. Каждый признак может входить в определяющие наборы нескольких классов. Некоторые признаки, описывающие класс, являются зависимыми друг от друга, то есть наличие одного признака fl предполагает наличие другого признака fm. При этом стоит заметить, что данное отношение между признаками не обязательно является бинарным: наличие признака fm не обязано учитывать наличие признака fl. Кроме того, будем считать, что часть признаков обязана присутствовать в определяющей структуре класса. Такие признаки будем называть базовыми. Признаки, которые могут присутствовать в определяющей структуре класса. будем называть вариативными. Признаки, наличие которых в определяющей структуре класса невозможно, будем называть исключающими. Взаимосвязь между признаками, определяющими некоторый класс Kj, и самим классом Kj, задается формулой Pj (S) = [Fj11 (S) · · · Fj1m (S)] · · · [Fjk1 (S) · · · Fjkn (S)], представляемой в виде конъюнктивной нормальной формы (КНФ).

Каждому объекту sj сопоставим информационный вектор (sj ) = (1,..., l ), кодирующий информацию о принадлежности объекта sj к классам {K1,..., Kl }. Бит вектора i принимает значение 1, если объект sj является объектом класса Ki, и 0 в обратном случае.

Пусть для множества функций {F(s)} задано отношение частичного порядка, определяющее взаимосвязь между зависимыми признаками.

Так как множество {F(s)} представляет из себя множество вычислимых функций, то для каждой функции Fj {F(s)} существует алгоритм Ak, реализующий ее. Будем считать, что на множестве алгоритмов {A}, так же сохраняется отношение частичного порядка. Отношение частичного порядка в этом случае определяет, в какой последовательности должны быть запущены алгоритмы, вычисляющие функции зависимых признаков объектов. Кроме того, будем считать, что каждый алгоритм Ak {A}, при определении наличия признака fk может ошибаться, долю ошибок алгоритма будем обозначать как Pk. Это может быть связано с тем, что вычисляемый признак в объекте может быть запутан - например, обфусцирован или зашифрован. Сложность работы алгоритма Ak будем обозначать как cAk.

Рассмотрим теперь еще одну сущность - классификатор. Классификатор µi содержит структуру некоторого подмножества {Ak } алгоритмов Ak, представляющую из себя граф, в котором узлы являются алгоритмами из подмножества {Ak }, а дуги соответствуют путям передачи входного объекта между алгоритмами. Все алгоритмы, входящие в классификатор µi структурированы с учетом отношения частичного порядка: алгоритмы, имеющие зависимость, организуются в цепочку. Пусть, например, классификатор µ1 содержит алгоритмы A1, A2, A3, A4, причем A1 A2, A1 A3, A A4, A3 A4. В этом случае классификатор будет содержать граф, представленный на рисунке 1.1.

Будем считать, что классификатор µi способен распознавать объекты класса Kj в том случае, если пересечение множества признаков, вычисляемых алгоритмами, которые содержатся в классификаторе µi, и множества признаков, определяющих класс Kj, не пусто. Каждый классификатор характеризуется некоторой долей ложных срабатываний. Причины неоднозначности в распознавании классов классификатором две. Во-первых, как уже отмечалось, сами алгоритмы из множества {A} определяют признаки с некоторой долей ошибки, что оказывает непосредственное влияние на точность классификатора, в состав которого они входят. Во-вторых, классификатор может анализировать не все признаки, определяющие некоторый класс, а лишь их часть, что так же сказывается на точности классификатора.

В рамках построенной модели рассмотрим задачу распознавания объектов - задачу отнесения объектов к некоторым классам из заданного списка классов.

1.2. Задача распознавания объектов Пусть задано фиксированное множество классов {Kl } объектов. Пусть так же задано множество классификаторов {µm }, способных распознавать объекты всех классов из множества {Kl }, при этом каждый классификатор распознает некоторое непустое подмножество классов {Kl }. Задача состоит в построении распознающего алгоритма A, представляющего из себя такую суперпозицию классификаторов, для которой выполнено следующее условие:

• Для любого объекта si, принадлежащего любому классу Kj из множества заданных классов, структура классификаторов, построенная алгоритмом A, распознает объект si как объект класса Kj.

В качестве доказательства существования решения этой задачи укажем алгоритм построения.

Рассмотрим два классификатора µi = (A1,..., An, A) и µi = (Ak,..., Ak+l, A). По определению классификаторов, алгоритмы, входящие в них, структурированы в соответствии с отношением частичного порядка, заданного на множестве алгоритмов. Так, A1 Ai, i = 2... n и, аналогично, Ak Ai, i = k + 1... k + l. Будем считать, что µi < µj, если A1 < Ak. Операции =, > определяются аналогично. Таким образом, зададим на множестве классификаторов отношение частичного порядка µ.

Структуру классификаторов будем строить как линейный список, отсортированный по возрастанию. Последнее необходимо для соблюдения зависимости между алгоритмами, входящими в один классификатор, и алгоритмами, входящими в другой, если такие имеются. Пример построенной структуры изображен на рисунке 1.2.

Рис. 1.2: Линейная структура классификаторов.

Исследуемый объект si поступает на вход очередному классификатору, внутри которого объект обрабатывается цепочкой алгоритмов, входящих в этот классификатор. В случае, если все алгоритмы в классификаторе выявили во входном объекте si соответствующие признаки, алгоритм A распознает объект si как принадлежащий к некоторому подмножеству классов {K }, обнаруживаемых классификатором. После определения принадлежности объекта к некоторому подмножеству классов, меняются соответствующие биты информационного вектора объекта. Далее, объект передается на вход следующему классификатору.

Мы показали, что алгоритм A, выстраивающий классификаторы в линейную структуру с сохранение частичного порядка алгоритмов, входящих в них, действительно является решением поставленной задачи в рамках заданной модели.

Из существования решения поставленной задачи так же следует корректность построенной модели. Исследуем теперь это решение.

Покрытие классов объектов. В результате запуска структуры, построенной данным решением, для каждого объекта будет получен его информационный вектор, который, позволяет вычислить принадлежность объекта к некоторому подмножеству классов. Распознавание объектов всего множества классов (полное покрытие классов объектов) возможно только в том случае, если для каждого класса Ki из заданного множества существует хотя бы один классификатор µj, алгоритмы которого вычисляют непустое подмножество признаков, определяющих класс Ki. Выполнение этого условия напрямую следует из формулировки задачи.

Доля ложных срабатываний решения. Как было отмечено ранее, каждый классификатор относит объект к классам с некоторой долей ложных срабатываний. В виду этого интересен для анализа вопрос о доле ложных срабатываний представленного решения. Будем считать, что распределение объектов различного вида (на которых классификатор может ошибаться или работать точно) - равномерное.

Рассмотрим цепочку из двух классификаторов µi и µj. Пусть событие A1 соответствует ошибочному срабатыванию классификатора µi, а событие A2 - ошибочному срабатыванию классификатора µj. Доли ложных срабатываний классификаторов обозначим как P (A1 ) и P (A2 ), соответственно. При этом будем считать, что события A1 и A2 независимы. Долю ложных срабатываний цепочки классификаторов обозначим за P (A1, A2). Рассмотрим два возможных случая.

1 Пересечение множеств классов, определяемых классификаторами µi В этом случае P (A1, A2) = P (A1)P (A2 ). Учитывая, что 0 P (A1 ) и 0 P (A2 ) 1, то P (A1, A2) min(P (A1), P (A2). Таким образом, общая доля числа ложных срабатываний монотонно убывает с увеличением числа классификаторов в цепочке.

2 Пересечение множеств классов, определяемых классификаторами µi В таком случае доли ложных срабатываний классификаторов не влияют друг на друга. Общая доля ложных срабатываний цепочки классификатора может быть оценена как P (A1, A2) max(P (A1 ), P (A2)).

То есть доля ложных срабатываний цепочки классификаторов будет не хуже, чем доля ложных срабатываний самого неточного классификатора.

Отсюда можно сделать следующий вывод. Классификаторы, определяющие пересекающиеся подмножества классов и структурированные в цепочку, существенно снижают долю ошибок структуры. В такой структуре каждый следующий классификатор "перепроверяет"результат работы предыдущего. Линейная структура в этом случае будет наиболее оптимальной с точки зрения доли ошибок.

Вычислительная сложность выполнения линейной структуры. Сложность построения линейной структуры классификаторов сводится к задаче сортировки элементов (в виду того, что классификаторы сортируются по возрастанию в соотвестсвии с заданным отношением частичного порядка). Для решения этой задачи существует множество подходов, имеющих приемлемую сложность - сортировка слиянием, быстрая сортировка и другие. Средняя сложность этих алгоритмов оценивается как O(n log(n)), где n - количество классификаторов.

Алгоритм построения структуры классификаторов запускается один раз. Далее построенная структура используется для распознавания объектов, поэтому сложность выполнения такой структуры имеет большое значение. Как было отмечено ранее, (c)Ai обозначает сложность выполнения алгоритма Ai. Тогда сложность выполнения классификатора µi, в состав котоik рого входят алгоритмы Ai1,..., Aik, будет определяться как cµi = j=i1 cAj.

Так как в линейной структуре классификаторов при анализе входного объекта sj должен быть запущен каждый из классификаторов множества {µi }m, то сложность выполнения линейной структуры представляется соi= ности классификаторов, входящих в структуру.

Итак, мы показали существование решения поставленной задачи распознавания в рамках построенной модели. Рассмотрим вопрос о существовании более оптимального по сложности выполнения решения задачи.

1.3. Постановка уточненной задачи распознавания объектов Рассмотрим некоторый классификатор µi, в состав которого входят алгоритмы Ai1 , Ai2, Ai3. Пусть выполнено следующее условие: Ai1 < Ai2 < Ai3, то есть алгоритм Ai2 зависит от алгоритма Ai1, а алгоритм Ai3 зависит от алгоритма Ai2. В этом случае, если алгоритм Ai1 не выявил во входном объекте соответствующего признака, то запуск алгоритмов Ai2 и Ai3 не повлияет на результат работы классификатора. Аналогично, если алгоритм Ai2 не выявил во входном объекте соответствующего признака, нет необходимости запускать алгоритм Ai3.

В этом случае примем следующее допущение. Пусть каждый алгоритм Ai может сбрасывать входящие в него объекты, то есть не передавать объект на вход другим алгоритмам, если он не обнаружил во входном объекте соответствующий признак. Кроме того, будем считать, что такой же функцией могут обладать и сами классификаторы: в случае, если классификатор µi не распознал входной объект как объект обнаруживаемых им классов, классификатор может не передавать объект на вход другим классификаторам.

С учетом результатов, полученных при анализе решения задачи, описанной в разделе 1.2, рассмотрим более оптимальную задачу распознавания объектов.

Уточненная задача распознавания объектов. Пусть задано фиксированное множество классов {K1,..., Kl } объектов. Пусть так же задано множество классификаторов {µ1,..., µm }, способных распознавать объекты всех классов их множества {K1,..., Kl }, при этом каждый классификатор распознает непустое подмножество заданных классов. Кроме того, будем считать, что классификаторы могут сбрасывать объекты. Задача состоит в построении распознающего алгоритма A, представляющего из себя суперпозицию классификаторов, такую, что выполнены следующие условия:

• Для любого объекта si, принадлежащего любому классу Kj из множества заданных классов, структура классификаторов, построенная алгоритмом A, распознает объект si как объект класса Kj. Другими словами, выполняется требование полноты покрытия заданных классов объектов.

• Полученная структура классификаторов не ухудшает значения доли ложных срабатываний: P maxPµi.

• Полученная структура оптимизирует суммарную вычислительную сложность входящих в нее алгоритмов: C i cAi, где {Ai } - множество алгоритмов, входящих в множество классификаторов {µi}.

1.4. Предлагаемый подход к решению задачи распознавания Организуем классификаторы в направленный ориентированный граф G, множество вершин {V } соответствует классификаторам непосредственно, а множество ребер {E} соответствует передаче данных между классификаторами. Граф G является частным случаем дерева принятия решений [108].

Граф G будем строить таким образом, чтобы передача потоков данных осуществлялась только между классификаторами, пересечение обнаруживаемых классов объектов которых не пусто. Именно в таком случае, как было показано в разделе 1.2, имеет место перепроверка результатов работы предыдущего классификатора, что приводит к снижению доли ложных срабатываний структуры классификаторов. Поступление входных объектов на классификаторы, пересечение обнаруживаемых классов которых пусто, должно осуществляться независимо.

Возможная структура такого графа приведена на Рисунке 1.3.

Рис. 1.3: Возможный пример топологии графа принятия решений.

При такой структуре классификаторов, анализируемый поток данных, состоящий из множества объектов {sj } поступает одновременно на классификаторы, обнаруживающие различные классы объектов. Уровнем i графа G назовем такой набор классификаторов, для которых выполнены следующие условия:

1. между классификаторами уровня i не осуществляется передача входных объектов;

2. классификаторы уровня i получают на вход объекты из классификаторов уровня i 1;

3. классификаторы уровня i передают входные объекты на классификаторы уровня i + 1;

4. при условии того, что отработали классификаторы уровня i 1, классификаторы уровня i могут быть выполнены одновременно, то есть отсутствует зависимость по данным от всех низлежащих уровней.

Каждый уровень j графа G, содержащим всего J уровней, будем выбирать таким образом, чтобы он обеспечивал покрытие классов, обнаруживаемых классификаторами всех уровней j... J. Как следствие, на уровне j = 1 классификатора должно обеспечиваться полное покрытие множества M классов шеллкодов. Кроме того, при выборе классификаторов уровня j необходимо, чтобы соблюдалось следующее условие: для любого классификатора µjp уровня j, пересечение обнаруживаемых классов которого с любым классификаторов µj1q, должно выполняться µjp >= µj1q. То есть между зависимыми классификаторами должно выполняться отношение частичного порядка. Поток данных, поступающий на первый уровень графа, дублируется между всеми классификаторами этого уровня.

Классификаторы, обладающие меньшей вычислительной сложностью, будем располагать на верхних уровнях графа G. Чем большей вычислительной сложностью характеризуется классификатор, тем на более низких уровнях он будет расположен. Как было отмечено ранее, классификаторы могут сбрасывать входные объекты, которые не были распознаны как объекты обнаруживаемых классов. Таким образом, объекты, не относящие к обнаруживаемым классам, будут отсекаться на верхних уровнях структуры, что приводит к снижению суммарной вычислительной сложности исполнения графа G. Объекты, ошибочно принятые некоторым классификатором за принадлежащий к обнаруживаемым им классом, будет передан на анализ другим классификаторам.

Итак, сведем поставленную задач распознавания объектов к задаче построения графа G классификаторов, обладающего следующими свойствами:

• Каждый уровень графа обеспечивает полное покрытие классов объектов, обнаруживаемых доступными для организации уровня классификаторов. Это значит, что если из множества классификаторов {µi } некоторое подмножество {µj } составляет уровни 1... j 1, то для организации уровня j полнота покрытия классов должна обеспечиваться для классов, обнаруживаемых классификаторами из множества {µi }\{µj } ;

• Ни один классификатор не встречается в графе более одного раза.

Данное требование необходимо в связи с необходимостью оптимизации вычислительной сложности запуска графа G;

• Каждый уровень классификатора оптимален с точки зрения вычислительной сложности;

• Каждый уровень классификатора сохраняет отношение частичного порядка алгоритмов, входящих в классификаторы.

В качестве меры оптимальности для уровня графа в работе выбраP но значение, где P - доля ложных срабатываний классификатора, а C - сложность работы. При построении очередного уровня классификатора будем максимизировать значение этой меры. Выбор подобной меры обосновывается следующими рассуждениями. Как было отмечено выше, чем меньше вычислительная сложность классификатора, тем на более высоком уровне графа G он должен быть расположен. Этим обосновывается обратная зависимость сложности классификатора в выбранной мере. Если же принять гипотезу о том, что более сложные классификаторы обладают более высокой точностью работы, в то время, как более простые классификаторы характеризуются более высокой вероятностью ошибок, то вероятность ошибки классификатора должна быть прямо зависима в рассматриваемой мере.

Алгоритм построения графа классификаторов.

Рассмотрим эвристический алгоритм построения оптимальной топологии графа классификаторов.

На вход алгоритму поступает множество классификаторов, выходом алгоритма является топология графа классификаторов.

Описание алгоритма:

1. Если множество входных классификаторов алгоритма не пусто, перейти на шаг 2, иначе перейти на шаг 7.

2. Вычислить множество K классов шеллкодов, обнаруживаемых классификаторами из входного набора.

3. Построить все возможные комбинации из классификаторов входного набора, обеспечивающих покрытие классов из множества K и сохраняющие отношения частичного порядка с классификаторами предыдущего уровня.

4. Выбрать оптимальную комбинацию классификаторов. Данная комбинация является очередным построенным уровнем графа классификаторов.

5. Связать классификаторов из выбранной комбинации с последним уровнем графа. Связывание осуществляется в соответствии с обнаруживаемыми классификаторами классов.

6. Удалить классификаторы, входящие в оптимальную комбинацию из входного набора классификаторов. Вернуться на шаг 1.

7. Выход.

Листинг алгоритма представляется следующим образом:

CONSTRUCT_GRAPH

input: set of classifiers M return: graph G 1: previous_level = v;

2: G = previous_level;

3: K = RECOGNIZE_SHELLCODE_CLASSES(M);

4: while M is not empty 5: current_level = CREATE_NEXT_LEVEL(M,K);

6: LINK_LEVELS(previous_level, current_level);

7: for each m from current_level remove m from M;

8: previous_level = current_level;

CREATE_NEXT_LEVEL input: set of classifiers M, set of classes K return: set of classifiers level for the constructed level 1: arr = PROCESS_NEXT_LEVEL(M,K);

2: level = OPTIMAL(arr);

PROCESS_LEVEL

input: set of classifiers M, set of classes K return: array level of all possible classifiers combinations which provides coverage of K 1: level = empty;

6: sub_level = PROCESS_NEXT_LEVEL(M_new,K_new);

elements from sub_level;

10: K = RECOGNIZE_SHELLCODE_CLASSES(M);

REBUILD_SET input: set of classifiers M_new, detected classes K_new return: set of classifiers M_new 1: for each m from M_new 2: if CLASSES(m) intersection K_new == LINK_LEVELS input: level_1, level_ return: linked levels with respect to detected classes 1: for each m_1 in level_ 3: if CLASSES(m_1) intersection CLASSES(m_2) is not empty 1.5. Исследование алгоритма Рассмотрим вычислительную сложность описанного алгоритма. Предположим, что на вход алгоритму поступает множество M классификаторов, мощность которого равна |M| = m. Пусть входное множество M классификаторов способно обнаруживать множество K классов шеллкодов, мощность которого равна |K| = k. Для оценки вычислительной сложности процедуры CONSTRUCT_GRAPH, в первую очередь необходимо оценить вычислительную сложность всех вызываемых ею процедур.

Сложность шагов 1-2 алгоритма оценивается как Вычислительная сложность вызываемой процедуры вычисления обнаруживаемых классов recognize_shellcode_classes оценивается как T (recognize_shellcode_classes) O(mk).

Такая оценка объясняется необходимостью анализа всех возможных классов шеллкодов для каждого классификатора из множества M. Сложность процедуры связывания построенного уровня с предыдущим уровнем графа классификатора link_levels( level1, level2) оценивается значением где |level1 | = m1, |level2 | = m2 и m1 + m2 m в общем случае. Сложность процедуры построения очередного уровня графа классификаторов create_next_level оценивается как T (create_next_level) T (process_level) + O(m), где O(C1m) = O(m) - сложность выбора оптимальной комбинации при общем числе комбинаций C1, являющимся некоторым константным значением. Анализируя вычислительную сложность процедуры process_level можно заметить, что T (process_level(4)) = T (process_level(5)) O(mk), T (process_level(8)) = T (process_level(9)) O(1).

Таким образом, сложность процедуры process_level оценивается как T (process_level) = T (m, k) m(2O(mk) + T (m, k ) + где m and k - новые параметры рекурсивного вызова процедуры. Зафиксируем параметр k. Тогда, в худшем случае параметр m будет иметь значение m = m 1. Следовательно, В среднем случае, параметр m принимает значение m =, где b - эмпиb рически вычисленная константа. Таким образом, Решение этого рекуррентного соотношения, согласно Основной теореме о рекурсии [34], принимает вид 1. T (m) O(m2 logm), если m = b 2. T (n) O(m2 ), если m < b 3. T (n) O(mlogb m ), если m > b2.

Предполагая, что b - эмпирически вычисленная константа с ограниченным значением, можно заметить, что начиная с некоторого m > m0 всегда будет выполняться условие 3 Основной теоремы о рекурсии. Таким образом, освобождая параметр k, получаем следующую оценку для процедуры process_level в худшем случае:

В среднем случае значение сложности выполнения процедуры принимает вид:

Исходя из 1.1 - 1.10, можно сделать вывод, что сложность алгоритма построения оптимальной топологии графа в худшем случае представляется в следующем виде:

T (construct_graph) m(O(mk) + O(m2 ) + O(m!m2 k) Сложность алгоритма построения оптимальной топологии графа в среднем случае представляется в виде:

T (construct_graph) logm(O(mk) + O(m2 ) + Несмотря на сравнительно высокую вычислительную сложность алгоритма построения топологии классификатора, алгоритм остается применимым с практической точки зрения в виду нескольких допущений. В первую очередь, будем считать, что число классификаторов, поступающих на вход, ограничено. Кроме того, алгоритм построения оптимальной топологии графа классификаторов запускается однократно перед началом анализа входных объектов, либо при добавлении новых классификаторов для перестроения топологии графа классификаторов. Исследуем теперь представленное решение.

Полнота покрытия классов. По построению графа G, его первый уровень должен включать в себя классификаторы {µ1,..., µm } такие, что {K1,..., Kl } {K(µ1)} · · · {K(µm)}, где {K(µi)} - множество классов, обнаруживаемых классификатором µi. Другими словами, классификаторы первого уровня графа должны распознавать объекты всех классов {K1,..., Kl }. Таким образом, для Ki µj : Ki {K(µj )}.

Если на любом нижележащем уровне существует некоторый классификатор µp, так же обнаруживающий класс Ki, то между классификатором µj и µp будет существовать путь в графе G. Если же на нижележащих уровнях такие классификаторы отсутствуют, то ребро из классификатора µi будет входить в модуль принятия решений непосредственно. Отсюда можно сделать вывод, что граф G обеспечивает полное покрытие классов {K1,..., Kl }.

Доля ложных срабатываний. Ориентированный граф G можно представить в виде набора линейных структур классификаторов (цепочек), в которых на позиции i расположены классификаторы уровня i или модуль принятия решений. Будем считать, что при анализе доли ложных срабатываний выполнения графа G модуль принятия решений роди не играет.

Любой классификатор, в который входит n ребер, будет включен в n таких линейных структур. Обозначим линейные структуры классификаторов за L1,..., Lq, где q - количество классификаторов первого уровня в графе G.

Для каждой линейной структуры Li, проводя рассуждения, аналогичные анализу доли ложных срабатываний для решения, описанного в 1.2, получим, что P (Li ) min(P (µi1 ),..., P (µik ), где µi1,..., µik - классификаторы, входящие в линейную структуру Li.

max(min(P (µ11,..., P (µ1w )),..., min(P (µq1,..., P (µqr )))).

за µLi классификатор, обладающий минимальной долей ложных срабатываний в цепочке Li. Тогда P (G) max(P (µL1 )...., P (µLq )) max(P (µi ))).

Анализ вычислительной сложности выполнения. Снижение суммарной вычислительной сложности выполнения графа G достигается за счет размещения наиболее простых классификаторов на верхних уровнях графа и за счет возможности классификаторов сбрасывать объекты, не принадлежащие к обнаруживаемым классификатором классов.

Рассмотрим два возможных случая.

1. Входной объект sj принадлежит всем заданным классам {K1,..., K + l}. В этом случае должны быть запущены все классификаторы графа G, так как входной объект сбрасываться не будет. В таком случае 2. В среднем ожидаемом случае входной объект sj принадлежит некоторому подмножеству входного множества классов. В этом случае, при анализе объекта sj будет выполнена только часть графа G - некий будут запущены.

Итак, мы доказали, что построенный граф G удовлетворяет требованиям поставленной задачи. Покажем теперь, что представленная в текущей главе модель применима к исследуемой в работе задаче обнаружения шеллкодов.

Глава 2. Классификация вредоносного исполнимого кода Рассмотрим теперь исследуемую область в терминах модели, введенной в главе 1. Множеством объектов {sj } будем считать набор исполнимых строк, полученных путем дизассемблирования байтовых строк. К примеру, такие строки могут быть получены из TCP-сессии, из PDF-файлов, из java-script и других исследуемых на предмет вредоносности сущностей.

Как было отмечено в главе 1, множеству объектов сопоставлен набор признаков {fj }k. В данном разделе выделено множество признаков, характерных для шеллкодов. В зависимости от эксплуатируемых уязвимостей, шеллкоды могут обладать некоторыми специфичными признаками, характерными только для данной уязвимости. Кроме того, вид шеллкода может меняться так же в зависимости от вида защиты памяти на уровне операционной системы (stack canaries [44], рандомизация адресного пространства [104], запрет на выполнение команд в стеке), которую шеллкодам приходится обходить для успешного запуска вредоносной нагрузки. Шеллкод, обходящий некоторый вид защиты памяти на уровне операционной системы и эксплуатирующий некоторую уязвимость, обладает некоторым набором признаков, отличающих его от шеллкодов, обходящих другие виды защиты и/или эксплуатирующих другие уязвимости. Однако стоит так же заметить, что часть признаков может быть присуща и легитимным объектам. К таким признакам, например, можно отнести те, с которые отличают исполнимый код от случайного набора данных.

Итак, первым шагом на пути решения поставленной задачи является выявление списка признаков шеллкодов. При выделение признаков были использованы литературные источники - материалы, описывающие способы эксплуатации уязвимостей работы с памятью вредоносным исполнимым кодом и соответствующих ограничений, накладываемых на такой код. Так же были рассмотрены материалы, описывающие механизмы обнаружения вредоносных исполнимых кодов. Кроме того, при выделении признаков использовался анализ исходных кодов шеллкодов, содержащихся в доступных базах эксплойтов. Примером базы публично опубликованных вредоносных кодов может служить база exploitdb [47]. Все признаки, полученные при анализе исходных кодов, были выделены вручную (на момент написания работы источников, содержащих описание признаков шеллкодов не существует).

На основе выделенных признаков в данной главе предлагается разбиение пространства шеллкодов на классы {K1,..., Kl }.

Данная глава организована следующим образом. В разделе 2.1 описан процесс выделения признаков шеллкодов и приведен список выделенных признаков, в разделе 2.2 предложена классификация шеллкодов.

2.1. Признаки вредоносного исполнимого кода В процессе чтения научных статей, посвященных вредоносному исполнимому коду, а так же анализа исходных кодов (в случае его доступности) и изучения принципов их работы, был выявлен набор признаков шеллкодов.

Такие признаки классифицируются по следующим критериям:

1. Универсальность признака. Критерий позволяет классифицировать признаки вредоносного исполнимого кода, эксплуатирующего ошибки работы с памятью, в зависимости от того, является ли признак общим для всех образцов вредоносного исполнимого кода, или же этот признак специфичен для конкретного образца или некоторого семейства образцов.

• Универсальные признаки. К этой группе относятся признаки, характерные для всех образцов вредоносного исполнимого кода, эксплуатирующего уязвимости работы с памятью. Стоит отметить, что такие признаки могут быть и у легитимных объектов.

Это связано с тем, что, в первую очередь, исследуемый вредоносный исполнимый код представляет из себя программу, осуществляющую какую-либо активность. Ввиду этого, выделяется набор признаков характерных для исполнимых программ. Само по себе наличие подобных признаков во входном потоке данных не доказывает его вредоносность, однако позволяет отличить исполнимый код от набора случайных данных. Входной поток, обладающий подобными признаками может потенциально являться шеллкодом.

В то же время, исследуемый вредоносный исполнимый код имеет ряд ограничений, например, по размеру. Таким образом, возможно выделить ряд признаков, характерных для всех образцов шеллкодов.

• Специфичные признаки. К этой группе относятся признаки, характерные для конкретного образца шеллкода или для некоторых семейств, но не всех одновременно.

Оправданность поиска универсальных признаков во входном потоке данных связана, в первую очередь, с тем, что в реальных каналах бльшая часть данных, передаваемая по трансмагистральным канаo лам, не является исполнимым кодом. Универсальные признаки позволяют отличить случайные данные от исполнимого кода, который может потенциально являться шеллкодом.

2. Способ выявления признака. По способу выявления признаки классифицируются, исходя из того, каким типом анализа (статическим, динамическим) возможно выявление этого признака в исследуемых данных. По данному критерию признаки вредоносного исполнимого кода классифицируются на следующие:

• Статические. К этой группе относятся признаки, наличие которых в исследуемом объекте можно выявить путем статического анализа объекта - анализа кода объекта без его непосредственного исполнения.

• Динамические. К этой группе относятся признаки, наличие которых в исследуемом объекте возможно выявить путем непосредственного исполнения кода объекта.

3. Платформа. Шеллкод может изменяться в зависимости от платформы, на которой запущено приложение, эксплуатируемое шеллкодом.

В виду того, что шеллкодами используются специфичные особенности операционных систем, особенности реализации команд процессора, то шеллкод, написанный под одну платформу, в общем случае не запускается корректно под другими платформами. Данный критерий определяет платформу, под которой выполняется вредоносный исполнимый код. Признаки такого кода для разных платформ могут не только не совпадать, но так же и противоречить друг другу: признаки, характерные для шеллкодов под одну платформу, могут являться обоснованием того, что рассматриваемый код не является шеллкодом под другую платформу.

• x86. К этой группе относятся признаки, наличие которых выявляется в шеллкодах, исполняющихся на целевом процессоре x86.

• ARM. К этой группе относятся признаки, наличие которых выявляется в шеллкодах, исполняющихся на целевом процессоре семейства ARM [80]. Процессор ARM может работать в специальном режимом Thumb [56], в котором используется сокращенная система команд. В стандартном режиме процессора ARM разрядность используемых команд равна 32 [81], в то время, как режим Thumb использует 16-битные команды. С помощью анализа исходных кодов шеллкодов, написанных под платформу ARM, было выявлено, что злоумышленники зачастую используют технику переключения режима процессора в шеллкоде. Это позволяет записать большее количество команд в ограниченный по размеру шеллкод, а так же уклониться от обнаружения простыми сигнатурными детекторами. Начиная с версии ARMv6T2 процессора, доступна технология Thumb-2, позволяющая добавлять 32битные инструкции.

В результате проведенного анализа было выделено четырнадцать статических и пять динамических признаков, присущих шеллкодам. Результирующие значения критериев признаков приведены в таблицах 2.1 и 2.2.

2.1.1. Статические признаки 1. Дизассемблирование входных данных в цепочку инструкций определенной длины. Очевидно, что подобное свойство можно обойти, например, с помощью техники самораспаковывания - получения новых инструкций и записи их в память в процессе непосредственного исполнения кода. Тем не менее, в ходе экспериментального исследования существующих шеллкодов, приведенного в работе [99], было показано, что для выявления программой вредоносных свойств, количество ее инструкций должно превосходить значение 14. Исполнимый код, включающий в себя меньшее количество инструкций, как правило, является последовательностью случайных данных, реже - легитимной программой. Признак является универсальным для всех платформ.

Признак был выделен путем анализа литературных источников.

2. Дизассемблирование данных в команды ARM и в команды режима Thumb. Так как у процессора ARM существует два режима работы, некорректное дизассемблирование входного потока в команды одного из режимов может означать, что произошла смена режима работы процессора. В этом случае, дизассемблированный байтовый поток буУниверсальность Признак в команды ARM и Thumb процессора с каждого смещения перед системным вызовом Диапазон адресов возврата Нет x86, ARM Использование инвариантов Нет x Вид последней инструкции Нет x86, ARM Инициализация операндов Нет x86, ARM Таблица 2.1: Значения критериев статических признаков.

Признак Количество чтений полезной Нет x нагрузки Количество уникальных записей Нет x другой адрес Количество wx-инструкций Нет x Соответствие сигнатуре в Нет ARM зависимости от флагов Таблица 2.2: Значения критериев динамических признаков.

дет корректно выполнен на целевом процессоре, несмотря на то, что с точки зрения статического анализа, он будет представлять из себя последовательность случайных данных. Подобная техника широко используется злоумышленниками в современных эксплойтах, позволяя избегать обнаружение шеллкода статическими детекторами, а так же исполнить большее количество инструкций. Последнее свойство актуально в виду ограниченности размера шеллкода. Признак является универсальным для платформы ARM. Признак был выделен путем анализа доступных исходных кодов шеллкодов.

3. Наличие команды смены режима процессора. Последней командой дизассемблируемого байтового потока в режиме ARM (или Thumb) перед началом случайных данных, должна быть команда bx Rm, переводящая процессор в другой режим работы. Здесь Rm - регистр общего назначения. Признак должен проверяться в случае наличия в анализируемом потоке предыдущего признака: дизассемблируемости различных частей байтового потока в инструкции двух режимов процессора.

Признак является универсальным для платформы ARM. Признак был выделен путем анализа доступных исходных кодов шеллкодов.

4. Дизассемблирование входных данных с каждого смещения. Как было отмечено в Главе, шеллкод, эксплуатирующий уязвимость переполнения стека, перезаписывает адрес возврата уязвимой функции на некоторый адрес, указывающий в NOP-след. В общем случае злоумышленник не знает особенностей атакуемого узла, от которых может зависеть абсолютный адрес начала NOP-следа в адресном пространстве исполнимого процесса. Тем не менее, целью злоумышленника является выполнение вредоносной нагрузки объекта не зависимо от таких особенностей. Как следствие, NOP-след должен корректно дизассемблироваться с каждого смещения. Признак является специфичным для вредоносных исполнимых инструкций, содержащих NOP-след. Признак является универсальным для всех платформ. Признак был выделен путем анализа доступных исходных кодов шеллкодов.

5. Наличие GetPC кода. GetPC (Get Program Counter, так же известен как GetEIP) - набор исполнимых инструкций, вычисляющих свое расположение в адресном пространстве исполнимого процесса. GetPC код, как правило, необходим, чтобы возможно было подменить значение программного указателя на адрес самого кода непосредственно. Этот признак специфичен для вредоносных исполнимых инструкций, использующих техники самодекодирования и самомодификации.

Признак не выполняется для ARM, как как в этом случае процессор поддерживает команду непосредственного получения значения программного счетчика. Признак был выделен путем анализа доступных исходных кодов шеллкодов.

6. Число push-call паттернов превышает предопределенное пороговое значение. Так как исследуемый объект является исполнимым кодом, он обладает характеристиками, специфичными для различных операционных систем. В частности, исполнимый код должен работать с вызовами операционной системы или библиотеки ядра. При выполнении кода, инструкции call, как правило, предшествует одна или несколько инструкций push. Пороговое значение push-call паттернов, равное 2, вычислено эмпирически в работе [102]. Признак не выполняется для платформы ARM, так как в этом случае аргументы вызова заносятся не в стек, а в регистры общего назначения. Кроме того, в ARM возможно занести значения сразу в несколько регистров вызовом одной инструкции. Данный признак позволяет отличить исполнимый код от набора случайных данных, часто встречающихся в канале. Признак является универсальным для всех платформ. Признак был выделен путем анализа литературных источников.

7. Системному вызову svc 0 предшествует загрузка некоторых значений в регистры общего назначения, а количество системных вызовов превышает определенный порог. Признак вызван особенностью платформы ARM передавать локальные переменные функции через регистры, а не через стек. В частности, так же должно выполняться следующее условие: в регистр общего назначения R7 должно быть занесено значение номера корректного системного вызова. Признак является универсальным для платформы ARM. Признак позволяет отличить исполнимый код платформы ARM от случайных данных.

Признак был выделен путем анализа доступных исходных кодов шеллкодов.

8. Адрес возврата находится в определенном диапазоне значений. В шеллкоде адрес возврата перезаписывается значением, которое находится в диапазоне адресного пространства исполнимого процесса.

Нижняя граница диапазона определяется адресом начала перезаписываемого буфера. Верхняя граница определяется как RA SL, где RA – адрес поля адреса возврата и SL – длина шеллкода, или как BS SL, где BS - адрес начала стека. Этот признак общий для всех исследуемых объектов, не использующих технику рандомизации стека ASLR [104]. Признак сохраняется для всех рассматриваемых платформ и выделен путем анализа доступных исходных кодов.

9. Использование шаблонов. В шеллкодах часто используются зарезервированные ключевые слова или априорно известные числовые константы. Такие признаки являются специфичными для вредоносных объектов, использующих конкретные уязвимости. В большинстве случаев, уязвимая программа содержит несколько путей выполнения. Какой путь будет выполняться зависит от поступивших на вход программе или некоторой ее функции данных. Таким образом, для того, чтобы выполнить нужный путь уязвимой программы, шеллкод содержит так называемые шаблоны структуры - некоторые зарезервированные ключевые слова, расположенные в определенных позициях шеллкода. В таким ключевым словам, например, могут относиться части сетевого протокола в том случае, если уязвимое приложение анализирует пакеты. Шеллкоды, содержащие подобные шаблоны в своей структуре, Такие инварианты, были использованы при распространении ApacheKnacker [29] и сетевого червя Lion [60]. Признак выделен путем анализа литературных источников и доступных исходных кодов.

10. Максимальная длина исполнимой цепочки (MEL - Maximum Execution Length) превышает определенное пороговое значение. Длина исполнимой цепочки является важным признаком корректной последовательности инструкций, отличающего последовательность инструкций от случайных данных. Если цепочка заканчивается инструкцией перехода (например, jmp), то к значению прибавляется так же и длина цепочки, разобранной с адреса перехода. Пороговое значение, вычисленное экспериментально, составляет 256 байт [99]. Признак является общим для шеллкодов любых платформ. Тем не менее, данным признаком могут так же обладать и легитимные программы. Признак выделен путем анализа литературных источников.

11. Граф IFG (граф потока инструкций), из которого удалены незначимые инструкции, содержит цепочку, превосходящую определенное пороговое значение. Незначимыми инструкциями называют инструкции, приводящие к аномалиям потока данных и не влияющих на ход выполнения программы. Аномалии потока данных подразделяются на три типа [58]:

• DD-аномалии(Dene-Dene). Аномалии такого типа возникают в том случае, если какая-либо переменная была определена, а затем переопределена. Между этими действиями использования этой переменной не происходит.

• DU-аномалии(Dene-Undene). Аномалии такого типа возникают, когда какая-либо переменная была определена, после чего переменой было присвоено неопределенное значение без ее использования.

• UR-аномалии(Undene-Reference). Аномалии такого типа возникают в том случае, когда какой-либо переменной было присвоено неопределенное значение, после чего она была использована.

Критерий позволяет дифференцировать исполнимые инструкции и случайные данные, которые содержат большое количество аномалий потока данных даже в случае их дизассемблирования [102]. Критерий является универсальным и выделен путем анализа литературных источников.

12. Размер объекта не превосходит определенного значения. Шеллкод, использующий уязвимости работы с памятью, изменяет поток управления атакуемой программы путем перезаписи либо адреса возврата из стека, либо указателя служебной структуры на адрес внедренного вредоносного кода или на адрес определенного места внутри системной библиотеки. Так как и стек, и служебные структуры имеют ограниченный размер, то размер шеллкода так же лимитирован. Критерий является универсальным для всех вредоносных объектов, эксплуатирующих уязвимости работы с памятью. Признак выполняется для любых платформ. Признак выделен путем анализа литературных источников и исходных кодов.

13. Если последняя инструкция в цепочке заканчивается командой перехода с прямой или абсолютной адресацией, то адресом перехода может являться либо адрес библиотечного вызова, либо корректный номер прерывания. Как правило, при эксплуатировании уязвимости задачей злоумышленника является не аварийное завершение запущенного процесса, а например, получения контроля над консолью с уровнем доступа ядра или какой-либо другой цели. Таким образом, код вредоносного объекта должен передавать управление системным вызовам, которые могут быть доступны явным вызовом библиотеки или путем прямого прерывания. В первом случае, команды перехода (в частности, jmp, call, ret, load, int) должны сопровождаться базовым загрузочным адресом для библиотек: 0x40 для Linux и 0x для Windows. В другом случае, соответствующие номера прерываний – int 0x80 для Linux и int 0x2e для Windows. Для ARM и платформы андроид в частности, соответствующие номера прерываний - ??.

Признак выявлен путем анализа исходных кодов шеллкодов, доступных в публичных библиотеках эксплойтов.

14. Операнды самомодифицирующегося кода и кода с косвенными переходами должны быть инициированы. Критерий является универсальным для всех платформ.

2.1.2. Динамические признаки Среди динамических признаков выделены следующие:

1. Количество чтений полезной нагрузки превышает определенный порог. Процесс расшифрования вредоносным объектом своей полезной нагрузки во время непосредственного исполнения приводит к множественному доступу к памяти. Эта область памяти является небольшой частью виртуального адресного пространства, которой сопоставлен уязвимый буфер. Такая эвристика предполагает, что количество чтений из входного буфера в произвольном коде достаточно мало, в то время как декриптор обращается к множеству различных областей памяти внутри него. Этот признак является общим для полиморфных вредоносных исполнимых инструкций для процессора x86. Для платформы ARM признак выполняться не будет, так как процессор поддерживает команды одновременной загрузки данных в 16 регистров, что позволяет применить одну и ту же операцию модификации к 16-ти блокам данных одновременно, что используется в современных эксплойтах. Признак выделен путем анализа литературных источников и исходных кодов шеллкодов.

2. Количество уникальных записей в память превышает определенный порог. Признак является специфичным для полиморфных вредоносных исполнимых инструкций. Признак так же не выполняется для платформы ARM. Признак выделен путем анализа литературных источников и исходных кодов шеллкодов.

3. Поток управления хотя бы один раз передается из адресного пространства входного буфера на адрес, по которому ранее осуществлялась запись. Такой признак специфичен только для вредоносных исполнимых инструкций, обходящих техники обнаружения полиморфизма путем записи полезной нагрузки в другую область памяти (nonself-contained). Признак универсален для любых платформ. Признак выделен путем анализа литературных источников.

4. Количество исполненных wx-инструкций превышает определенный порог. Под wx-инструкциями понимаются инструкции, которые были записаны в адресное пространство процесса в ходе его выполнения.

Такие инструкции являются неотъемлемой частью вредоносных исполнимых инструкций, обходящих признаки обнаружения полиморфизма. Признак выделен путем анализа литературных источников и исходных кодов шеллкодов.

5. В зависимости от определенных значений флагов выполняется набор инструкций, удовлетворяющих вредоносной сигнатуре. Признак характерен для платформы ARM. Связан с тем, что процессор в этом случае допускает условное выполнение инструкций: в зависимости от разных значений флагов ряд инструкций может быть выполнен либо не выполнен, что существенно изменяет вид реально выполняемой программы. Признак выделен путем анализа исходных кодов шеллкодов.

2.2. Классификация вредоносного исполнимого кода Любой вредоносный исполнимый объект, эксплуатирующий ошибки работы с память, представляет из себя комбинацию признаков - вредоносных и легитимных. К примеру, длинная последовательность nopинструкций 0x90 часто встречается в таких объектах, однако такая цепочка может быть обнаружена и в легитимном коде и случайных данных. Используя уникальные признаки вредоносных объектов и легитимных объектов, возможно разбить пространство вредоносных объектов на семейства, или классы - набор экземпляров вредоносных объектов, базирующихся на схожих характеристиках или схожих паттернов исполнения. Вредоносные объекты разделяются на классы в зависимость от части объекта, которую признаки, идентифицирующие этот класс, представляют - классы, базирующиеся на признаках активатора, декриптора, полезной нагрузки или зоны адресов возврата. Ниже приводится полный список таких классов.

Классы, базирующиеся на признаках активатора:

1. KN OP P L. Класс вредоносных объектов, активатором которых является простейший NOP-след. Простейший NOP-след состоит из набора NOP (no-operation) инструкций 0x90. NOP-инструкции не влияют на поток управления программы, только увеличивая программный счетчик. Пример объекта такого класса был продемонстрирован в работе [75].

2. KN OP B. Класс вредоносных объектов, активатором которых является однобайтный NOP-эквивалентный след. NOP-след может быть обфусцирован путем замены NOP-инструкций на однобайтные инструкции, которые не имею значимого эффекта и, для целей атакующего, эквивалентны NOP-инструкциям. К примеру, такой инструкцией может быть та, которая уменьшаем и увеличивает значение регистра, не используемого в полезной нагрузке вредоносного объекта; инструкции, которые устанавливают, а зачем очищают некоторый флаг;

комбинация инструкций push и pop. Существующие средства автоматической генерации полиморфных вредоносных объектов используют такие инструкции для уклонения от обнаружения. Например, ADMmutate [61] использует такую технику со списком из 55 однобайтных NOP-эквивалентных инструкций, Metasploit Framework [10] расширяет список ADMmutate до 58 однобайтных инструкций.

3. KN OP M B. Класс вредоносных объектов, активатором которых является многобайтный NOP-эквивалентный след. Однобайтные NOPэквивалентные инструкции так же могут быть заменены на многобайтные NOP-эквивалентные инструкции, которые так же не влияют на выполнение полезной нагрузки вредоносного объекта. Тем не менее, любые многобайтные NOP-эквивалентные инструкции не могут быть включены в такой набор, так как след должен корректно исполняться с любого смещения. Для того, чтобы избежать этого ограничения, в настоящее время применяется следующая техника: операнды многобайтных инструкций ограничиваются таким образом, чтобы их значения соответствовали кодам операций однобайтных инструкций или кодам операций других многобайтных NOP-эквивалентных инструкций. Пример такого NOP-следа приведен на рисунке 2.1. В данном примере, если передача управления передается на самый левый байт, будет выполнена следующая цепочка инструкций: cmp $0x35, %al, sub $0x40, %al,.... Если же передача управления осуществляется на след со смещением 1, то будет выполнена другая цепочка: xor, or,....

Рис. 2.1: Многобайтный NOP-эквивалентный след.

4. KN OP 4AL. Класс вредоносных объектов, активатором которых является четырехбайтный выровненный след. Несмотря на то, что в общем виде NOP-след должен корректно дизассемблироваться и исполняться с каждого байтового смещения, выравнивание стека может ослабить это ограничение. По умолчанию, современные компиляторы выравнивают стек до размера слова (4 байта). Таким образом, возможно построить след, который должен быть исполнимым каждые 4 байта.

Последовательности инструкций, не начинающихся со смещения, выровненного по слову, могут содержать любой тип инструкций, в том числе и некорректные.

5. KN OP T. Класс вредоносных объектов, активатором которых является батутный NOP-след. Типичный NOP-след передает контроль управления на полезную нагрузку вредоносного объекта путем последовательного прохождения инструкций. Та же функциональность может быть достигнута путем непосредственной передачи контроля управления по нужному смещению (рис. 2.2). Такие NOP-следы называются батутными.

Тело такого шеллкода состоит из инструкций передачи управления Рис. 2.2: Пример батутного NOP-следа.

с относительным адресом, указывающим непосредственно на начало полезной нагрузки. Таким образом, передача управления осуществляется за единственный шаг, с любого смещения. Батутный след так же может быть сгенерирован, основываясь на выравнивании по слову.

В этом случае инструкции передачи управления помещаются по выровненным смещениям. Даже если NOP-след должен быть корректно исполнимым с любого смещения, возможно подобрать операнды инструкций передачи управления таким образом, чтобы их коды операций соответствовали NOP-эквивалентным инструкциям. Пример батутного следа, корректно исполнимого с каждого смещения, представлен на рисунке 2.3.

6. KN OP T O. Класс вредоносных объектов, активатором которых является обфусцированный батутный NOP-след. Так как число инструкций, которые могут быть использованы для генерации батутного NOPследа, ограничено, такой NOP-след может быть обнаружен простыми сигнатурными методами. Для того, чтобы избежать обнаружения, батутный NOP-след может быть обфусцирован. Например, в след могут быть добавлены другие NOP-эквивалентные инструкции. В этом случае полезная нагрузка может достигаться в несколько шагов.

7. KN OP SAR. Класс вредоносных объектов, активатором которых является NOP-след, устойчивый к статическому анализу (SAR - static Рис. 2.3: Пример батутного NOP-следа, исполнимого с каждого смещения.

analysis resistant). Во время непосредственного исполнения такого NOP-следа, поведение инструкций контролируется злоумышленником. Таким образом, предсказать поведение инструкций, входящих в SAR NOP-след либо трудно, либо невозможно. Это достигается либо за счет использования условных инструкций, целевой адрес которых не может быть статично определен, либо за счет использования инструкций, организующих самомодифицирующийся код. Примером первого механизма может служить использование регистров или косвенных переходов. Кроме того, SAR-NOP-след может содержать так же и некорректные инструкции целевого процессора, так как они могут быть перезаписаны в процессе исполнения на корректные инструкции, после чего NOP-след будет успешно выполнен. Тем не менее, в этом случае след должен быть выровнен по размеру стека: необходимо избежать выполнения некорректных инструкций до их перезаписывания.

8. KGET P C. Класс вредоносных объектов, активатором которых является GetPC код - код, который определяет свое расположение в адресном пространстве исполнимого процесса. В этом случае управление на вредоносную полезную нагрузку исполнимых инструкций может быть передано непосредственно, без необходимости в NOP-следе.

Классы, базирующиеся на признаках декриптора.

1. KSU. Класс самораспаковывающихся вредоносных объектов. Такие объекты изменяют, или распаковывают, блоки вредоносной полезной нагрузки, обфусцированной во время компиляции. Трансформации, примененные к полезной нагрузки могут быть как тривиально простыми (например, применение операции xor к блоку инструкций), так и достаточно сложными DEA (Data Encryption Algorithm) - алгоритмами (например, DES [86] и другие алгоритмы [87]).

2. KSC. Класс зашифрованных вредоносных объектов.

3. KN SC. Класс полиморфных вредоносных объектов, для которых выполнены два следующих условия:

• Объект не содержит какой-либо формы GetPC кода;

• Объект не выполняет операций чтения из своего собственного адресного пространства во время исполнения.

Классы, базирующие на обфускации полезной нагрузки вредоносного объекта.

1. KP L Класс оригинальных вредоносных (необфусцированных) объектов.

2. KDAT A Класс вредоносных объектов, к которым была применена обфускация данных. Примером такой обфускации может служить замена ASCII символов на UNICODE символы.

3. KR Класс вредоносных объектов, обфусцированных путем изменения порядка входящих в них инструкций. Таким способом возможно сгенерировать n! различных объектов из исходного объекта, содержащего n инструкций.

4. KALTI N S Класс вредоносных объектов, обфусцированных путем замены инструкций, входящих в объекты, другими инструкциями с той же самой операционной семантикой. К примеру, инструкция xor может быть заменена на инструкцию sub.

5. KIN J. Класс вредоносных объектов, обфусцированных путем вставки "мертвого"кода - кода, на который никогда не будет передано управление.

6. KM ET. Класс метаморфных вредоносных объектов. При таких обфускациях используется два уровня метаморфизма: алгоритмический метаморфизм и метаморфизм уровня операционных кодов. Алгоритмический метаморфизм базируется на предположении, что некоторые блоки в алгоритме могут варьироваться. Метаморфизм уровня операционных кодов базируется на предположении, что каждый элемент псевдо-языка может быть заменен различными наборами кодов операций.

Классы, базирующиеся на зоне адресов возврата.

1. KRET. Классы вредоносных объектов с инвариантными значениями зоны адресов возврата.

2. KRET+. Классы вредоносных объектов с обфусцированной зоной адресов возврата. К примеру, в таких объектах может быть изменен порядок следования младших и старших бит адреса. В этом случае, управление будет передано в другую область стека, однако условием является попадание в NOP-след.

Глава 3. Методы обнаружения вредоносного исполнимого кода В данной главе приводится обзор существующих методов обнаружения шеллкодов. В терминах введенной в главе 1 модели, существующие методы обнаружения шеллкодов представляют из себя классификаторы {µi }m, в состав которых входит один или несколько алгоритмов, обнаруi= живающих признаки шеллкодов во входных объектах. Как будет показано, каждый из существующих методов обнаружения шеллкодов действительно обнаруживает некоторое подмножество классов шеллкодов. Так как методы, описанный в данной главе, могут включать в себя не все алгоритмы, определяющие тот или иной класс, что может привести к неоднозначности в распознавании объектов. В частности, в таком случае легитимный объект может быть ошибочно отнесен к некоторому классу шеллкодов, или шеллкод одного класса может быть ошибочно распознан как шеллкод другого класса. Такие ошибки будем называть ошибками второго рода, или FP (False Positives).

Кроме того, злоумышленниками активно применяются различные механизмы запутывания и обфускации шеллкодов, а так же самомодификации и шифрования для того, чтобы усложнить задачу обнаружения вредоносного исполнимого кода. В виду этого, метод обнаружения шеллкодов может не распознать шеллкод, как объект соответствующего класса. Такие ошибки будем называть ошибками первого рода, или FN (False Negatives).

Данная глава структурирована следующим образом. В разделе 3. описаны показатели эффективности методов обнаружения шеллкодов. В разделе 3.2 приведена классификация таких методов. В разделе 3.3 приведен обзор существующих методов обнаружения шеллкодов, в результате которого показана неприменимость рассматриваемых методов к реальным высокоскоростным каналам передачи данных и неспособность существующих методов обеспечить полное покрытие классов шеллкодов.

3.1. Показатели эффективности методов В данном разделе приведены показатели эффективности методов обнаружения вредоносного исполнимого кода.

1. Доля ошибок первого рода. Критерий оценивает точность обнаружения методами вредоносного исполнимого кода. Тем не менее, в исследуемой области не существует универсального набора данных для тестирования доли ошибок первого рода алгоритмов. Авторы предложенных методов, как правило, проводят свои исследования на специально сформированных наборах данных, на которых предложенные средства демонстрируют наилучшие результаты работы.

2. Доля ложных срабатываний - ошибок второго рода. Данный критерий оценивает долю ложных срабатываний методов. Высокоскоростные каналы передачи данных, на которых предполагается использование методов обнаружения шеллкодов, характеризуются большим объемом передаваемой информации в единицу времени. При большом объеме анализируемых данных даже незначительная доля подобных ошибок влечет за собой значительное абсолютное число ложных срабатываний. Большое число ложных срабатываний негативно сказывается на работе легитимных пользователей, уменьшая показатели качества их обслуживания, а в худшем случае - приводя к отказу в их обслуживании. Стоит отметить, что критерий оценивает долю ложных срабатываний на только тех образцах шеллкода, которые относятся к обнаруживаемым методом классам.

3. Алгоритмическая сложность метода. Данный критерий оценивает сложность методов, непосредственно влияющую на скорость их работы. Из-за необходимости анализировать значительное количество данных, критерий является одним из наиболее критичных.

4. Покрытие классов шеллкодов. Критерий оценивает способность методов к обнаружению различных классов шеллкодов. Рассматриваемые классы шеллкодов представлены в Главе 2. В случае, если некоторый метод способен обнаружить все из приведенных классов, то будем считать, что метод обеспечивает полное покрытие классов шеллкодов. Если метод обнаруживает не все из перечисленных классов, то покрытие классов шеллкодов методов, соответственно, не полно.

3.2. Классификация методов обнаружения шеллкодов Для классификации методов обнаружения шеллкодов предложены следующие критерии.

1. Способ выполняемого анализа. Критерий позволяет классифицировать методы обнаружения вредоносных исполнимых объектов в зависимости от необходимости эмуляции виртуального окружения.

2. Обнаруживаемые участки шеллкода. Критерий позволяет классифицировать методы обнаружения вредоносных исполнимых объектов в зависимости от того, какие участки типичной структуры шеллкода (активатор, декриптор, полезная нагрузка, зона адресов возврата) методы способны обнаруживать. Структура шеллкода подробно рассмотрена во введении.

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

• Методы статического анализа. К этой группе относятся методы, осуществляющие анализ кода без его непосредственного выполнения.

С теоретической точки зрения, с помощью статического анализа возможно рассмотреть все пути исполнения программы (для случая последовательных программ). Статический анализ, как правило, быстрее динамического. Методы статического анализа имеют ряд недостатков:

– Часть задач, относящихся к анализу поведения программы и ее свойств, в общем случае не разрешимы при использовании одного лишь статического анализа. В частности, в работе Эрика Филиола [49] доказан ряд следующих утверждений:

Теорема 1. Задача обнаружения метаморфного вредоносного объекта статическим анализом неразрешима.

Метаморфным считается шеллкод, полученный из оригинального образца одной из следующих обфускаций: алгоритмической обфускацией, предполагающей, что некоторые блоки в алгоритме могут варьироваться, либо обфускацией уровня кодов операций, предполагающая, что каждый элемент псевдо-языка (например, цикл) может быть заменен различными наборами инструкций (на примере цикла и языка C, можно использовать конструкцию while, for, а так же просто последовательное повторение тела цикла). Другими словами, метаморфной считается обфускация, сохраняющая только семантику программы, или семантическое ядро программы [49].

Теорема 2. Задача обнаружения полиморфного вредоносного объекта статическим анализом NP-полна. [49] Полиморфным считается образец шеллкода, полученный из оригинального образца, путем применения обфускаций, изменяющих синтаксис программы [93].

– Возможно создание вредоносного кода, использующего техники уклонения от статического анализа. В частности, могут использоваться различные методы обфусцирования кода, косвенная адресация, самомодификация кода.

Ниже приведены широко применимые техники анализа кода, используемые в статических методах обнаружения вредоносных исполнимых кодов.

– Сопоставление сигнатур. Такой подход основан на сопоставлении анализируемого образца с сигнатурой – некоторым регулярным выражением. Сигнатурные методы подразделяются на методы, сопоставляющие с анализируемым кодом контекстнозависимые сигнатуры - регулярным выражением, использующим исходных код шеллкода непосредственно, и методы, сопоставляющие сигнатуры поведения программ. В сигнатурах поведения учитывается возможность замены одних инструкций на другие со схожей семантикой: например, возможна взаимозаменяемость арифметических инструкций. Сигнатурный подход является неотъемлемой частью как достаточно простых, так и более усложненных алгоритмов обнаружения шеллкода. Некоторые методы являются частично-сигнатурными: они генерируют сигнатуры после того, как сделали заключение о вредоносности потока. Такие сигнатуры используются в дальнейшем с целью минимизации временных затрат на обнаружение уже исследованных образцов вредоносного кода. Существенный недостаток сигнатурного подхода - невозможность обнаружения полиморфной версии одного и того же образца. Методы, использующие технику сопоставления сигнатур, будем так же называть сигнатурными.

– Анализ графов CFG/IFG. CFG [52] (граф потока управления) - направленный граф, вершинами которого являются линейные блоки инструкций. Линейный блок - последовательность инструкций с одним входом, одним выходом и не содержащая инструкций перехода. Дуги GFG представляют из себя пути потока управления. В отличие от CFG, в IFG (граф потока инструкций) [102] вершинами являются непосредственно инструкции.

– Анализ корректности дизассемблирования потока. Методы, входящие в эту группу, осуществляют анализ на основе результатов процесса дизассемблирования. В частности, такие методы проверяют корректное дизассемблирование, начиная с каждого смещения входного буфера, а так же встречаемость привилегированных инструкций.

– Анализ на основе абстрактной интерпретации. Абстрактная интерпретация - подход, при котором анализ изменения кода и доступности отдельных его блоков осуществляется с помощью предположения диапазона значений входных данных и переменных, влияющих на ход выполнения программы.

• Динамические методы. К этой группе относятся методы, анализирующие код программы в процессе ее непосредственного выполнения.

В отличие от статических, динамические методы устойчивы к обфускации кода и различным методам уклонения от статического анализа (в том числе самомодификации). Тем не менее, динамические методы так же имеют ряд недостатков:

– требуют гораздо больше накладных расходов, чем статические. В частности, может потребоваться выполнение достаточно длинной цепочки инструкций, прежде чем можно будет сделать какойлибо вывод о поведении программы;

– покрытие программы не полно: динамические методы рассматривают только несколько возможных вариантов выполнения программы. Более того, множество значимых вариантов выполнения программы не может быть обнаружено;

– эмуляция окружения, в котором анализируемая программа может проявить свои вредоносные свойства, сложна;

– существуют техники обнаружения выполнения программы в изолированном окружении. В этом случае программа имеет возможность изменить своё поведение с целью невыявления вредоносных • Гибридные методы. В эту группу входят методы, использующие комбинацию статических и динамических методов анализа кода программы. Как правило, подобные методы основаны на построении некоторой модели программы путем статического анализа и дальнейшей проверки этой модели динамическим анализом.



Pages:     || 2 | 3 |


Похожие работы:

«Пучков Илья Александрович РАЗРАБОТКА, ОПТИМИЗАЦИЯ И МАСШТАБИРОВАНИЕ БИОТЕХНОЛОГИЧЕСКОГО ПРОИЗВОДСТВА ПЭГИЛИРОВАННОЙ ФОРМЫ РЕКОМБИНАНТНОГО ГРАНУЛОЦИТАРНОГО КОЛОНИЕСТИМУЛИРУЮЩЕГО ФАКТОРА Специальность 03.01.06 – Биотехнология (в том числе бионанотехнологии) Диссертация на...»

«Дикарев Александр Васильевич ДВУХУРОВНЕВАЯ СИСТЕМА СТАБИЛИЗАЦИИ ИЗОБРАЖЕНИЯ ДЛЯ МОБИЛЬНЫХ РОБОТИЗИРОВАННЫХ КОМПЛЕКСОВ 05.13.01 – Системный анализ, управление и обработка информации (промышленность) Диссертация на соискание ученой степени кандидата технических наук Волгоград – 2014 1    СОДЕРЖАНИЕ ВВЕДЕНИЕ 4 1. СИСТЕМЫ ТЕХНИЧЕСКОГО ЗРЕНИЯ, РАСПОЛОЖЕННЫЕ НА ПОДВИЖНОМ ОСНОВАНИИ 1.1 Классификация СТЗ, работающих в составе МРК 1.2 Условия формирования модели изображения в СТЗ МРК...»

«Дорогуш Елена Геннадьевна Математический анализ модели транспортных потоков на автостраде и управления ее состоянием 01.01.02 дифференциальные уравнения, динамические системы и оптимальное управление Диссертация на соискание ученой степени кандидата физико-математических наук Научный руководитель : доктор физико-математических наук академик А. Б. Куржанский Москва...»

«Резвухина Юлия Александровна Колымская региональная лексика 20-х – начала 30-х годов ХХ века Специальность 10.02.01 – русский язык Диссертация на соискание ученой степени кандидата филологических наук Магадан 2014 2   Содержание 4 Введение 15 Глава I. Региональная лингвистика: история развития и современное состояние. Советизмы как особый пласт русской лексики § 1. История региональной лингвистики. Возникновение термина региолект §...»

«Балахонова Алина Сергеевна РЕНИЕВОЕ ОРУДЕНЕНИЕ В ДИКТИОНЕМОВЫХ СЛАНЦАХ ПРИБАЛТИЙСКОГО БАССЕЙНА (ЛЕНИНГРАДСКАЯ ОБЛАСТЬ) Специальность 25.00.11 – геология, поиски и разведка твердых полезных ископаемых, минерагения Диссертация на соискание ученой степени кандидата геолого-минералогических наук Научный руководитель доктор геолого-минералогических...»

«из ФОНДОВ Р О С С И Й С К О Й Г О С У Д А Р С Т В Е Н Н О Й Б И Б Л И О Т Е К И Пягай, Лариса Павловна 1. Дифференцированный подход при построении программы физической реабилитации больных хроническими неспецифическими заболеваниями легких 1.1. Российская государственная библиотека diss.rsl.ru 2003 Пярай, Лариса Павловна Дифференцированный подход при построении программы физической реабилитации больных хроническими неспецифическими заболеваниями легких [Электронный ресурс]: Дис.. канд. пед....»

«КИСЕЛЕВ Александр Владимирович МЕСТНООБЕЗБОЛИВАЮЩАЯ АКТИВНОСТЬ ПРОИЗВОДНЫХ ИНДОЛА И ИМИДАЗО[1,2-а]БЕНЗИМИДАЗОЛА В СОЧЕТАНИИ С ВИСКОЭЛАСТИКОМ ВИЗИТОНОМ-ПЭГ ПРИ ЭПИБУЛЬБАРНОЙ И ВНУТРИКАМЕРНОЙ АНЕСТЕЗИИ ГЛАЗА 14.03.06 – фармакология, клиническая фармакология Диссертация на соискание ученой...»

«Малькевич Мария Сергеевна РЕАЛИЗАЦИЯ ПРИНЦИПА РАВЕНСТВАПРАВ РОДИТЕЛЕЙ 12.00.03 – гражданское право; предпринимательское право; семейное право; международное частное право ДИССЕРТАЦИЯ на соискание ученой степени кандидата юридических наук Научный руководитель : кандидат юридических наук, доцент Т.И. Хмелева Саратов – ОГЛАВЛЕНИЕ...»

«Сергеев Олег Витальевич РАЗРАБОТКА И ИСПЫТАНИЕ ЖИВОЙ СУХОЙ ВАКЦИНЫ ПРОТИВ ЭПИЗООТИЧЕСКОЙ ДИАРЕИ СВИНЕЙ (ВАКЦИНА ВЕРРЕС-ЭДС) В ЭКСПЕРИМЕНТАЛЬНЫХ И ПРОИЗВОДСТВЕННЫХ УСЛОВИЯХ 06.02.02 – ветеринарная микробиология, вирусология, эпизоотология, микология с микотоксикологией и иммунология Диссертация на соискание учёной...»

«ЯКОВЕНКО Алексей Александрович ПРОГНОЗ И НОРМАЛИЗАЦИЯ РАДИАЦИОННОЙ ОБСТАНОВКИ ПРИ ОСВОЕНИИ ПОДЗЕМНОГО ПРОСТРАНСТВА В УСЛОВИЯХ ПОВЫШЕННОЙ РАДОНООПАСНОСТИ ГОРНЫХ ПОРОД Специальность 05.26.01 – Охрана труда (в горной промышленности) Диссертация на соискание ученой степени...»

«из ФОНДОВ РОССИЙСКОЙ ГОСУДАРСТВЕННОЙ БИБЛИОТЕКИ Окулич, Иван Петрович 1. Депутат законодательного (представительного) органа государственной власти суБъекта Российской Федерации 1.1. Российская государственная Библиотека diss.rsl.ru 2003 Окулич, Иван Петрович Депутат законодательного (представ umeльног о) орг ана г осударств еннои власти субъекта Российской Федерации [Электронный ресурс]: Правовой статус. Природа мандата. Проблемы ответственности Дис.. канд. юрид. наук 12.00.02. -М. РГБ, 2003...»

«Балдин Александр Константинович ПРАВОВЫЕ ВОПРОСЫ ОРГАНИЗАЦИИ ПРОВЕДЕНИЯ АНТИКОРРУПЦИОННОЙ ЭКСПЕРТИЗЫ НОРМАТИВНЫХ ПРАВОВЫХ АКТОВ ОРГАНАМИ МИНЮСТА РОССИИ Специальность: 12.00.14 – административное право; административный процесс ДИССЕРТАЦИЯ на соискание ученой степени кандидата юридических наук Научный...»

«Андреева Анна Викторовна Динамическая модель управления клиентской базой компании на основе марковских цепей 08.00.13 - Математические и инструментальные методы экономики Диссертация на соискание ученой степени кандидата экономических наук Научный руководитель к.э.н., доцент Богданова Татьяна Кирилловна Москва – 2013...»

«Артемьев Тимур Мурманович Интуиция и рефлексия в понимании Специальность 09.00.01 – онтология и теория познания Диссертация на соискание ученой степени кандидата философских наук Научный руководитель : доктор философских наук, профессор Ю. М. Романенко Санкт-Петербург 2014 2 ОГЛАВЛЕНИЕ Введение.. ГЛАВА 1. Генезис понятий интуиция, рефлексия и понимание. § 1. Обзор представлений об интуиции § 2. Трактовки рефлексии в философии...»

«Данилова Ольга Витальевна НОВЫЕ МЕТАНОТРОФЫ И ФИЛОГЕНЕТИЧЕСКИ РОДСТВЕННЫЕ ИМ БАКТЕРИИ БОЛОТНЫХ ЭКОСИСТЕМ Специальность 03.02.03 – микробиология ДИССЕРТАЦИЯ на соискание ученой степени кандидата биологических наук Научный руководитель : Д.б.н. С.Н. Дедыш Москва - 2014 ОГЛАВЛЕНИЕ Часть 1. ВВЕДЕНИЕ Актуальность проблемы.. Цель и задачи работы.....»

«Назарова Нигина Саидумаровна СТРУКТУРНО-СЕМАНТИЧЕСКИЙ АНАЛИЗ ТЕРМИНОВ МЕЖДУНАРОДНОГО ПРАВА В АНГЛИЙСКОМ И ТАДЖИКСКОМ ЯЗЫКАХ Специальность: 10.02.20 – Сравнительно – историческое, типологическое и сопоставительное языкознание Диссертация на соискание учёной степени кандидата филологических наук ДУШАНБЕ – 2014 СОДЕРЖАНИЕ ВВЕДЕНИЕ..4 ГЛАВА I. СТРУКТУРНЫЙ АНАЛИЗ МЕЖДУНАРОДНО-ПРАВОВОЙ ТЕРМИНОЛОГИИ ТАДЖИКСКОГО ЯЗЫКА. 1.1 Общая...»

«БАРЫШНИКОВ АЛЕКСАНДР АЛЕКСАНДРОВИЧ ИССЛЕДОВАНИЕ И РАЗРАБОТКА ТЕХНОЛОГИИ УВЕЛИЧЕНИЯ НЕФТЕОТДАЧИ ЗА СЧЕТ ВЫТЕСНЕНИЯ С ПРИМЕНЕНИЕМ ЭЛЕКТРОМАГНИТНОГО ПОЛЯ Специальность 25.00.17 – Разработка и эксплуатация нефтяных и газовых месторождений...»

«ИЗ ФОНДОВ РОССИЙСКОЙ ГОСУДАРСТВЕННОЙ БИБЛИОТЕКИ Корчагина, Юлия Владимировна Личность и установка детей и подростков на употребление алкоголя Москва Российская государственная библиотека diss.rsl.ru 2006 Корчагина, Юлия Владимировна Личность и установка детей и подростков на употребление алкоголя : [Электронный ресурс] : Дис. . канд. психол. наук  : 19.00.01. ­ М.: РГБ, 2006 (Из фондов Российской Государственной Библиотеки) Психология ­­ Социальная психология ­­...»

«Федченко Ярослав Олегович ПРИМЕНЕНИЕ МЕТОДОВ РЕНТГЕНОХИРУРГИИ В ЛЕЧЕНИИ ТЭЛА И ПРОФИЛАКТИКЕ РАЗВИТИЯ ПОСТЭМБОЛИЧЕСКОЙ ЛЁГОЧНОЙ ГИПЕРТЕНЗИИ ДИССЕРТАЦИЯ на соискание учной степени кандидата медицинских наук (14.01.13 – лучевая диагностик, лучевая терапия) (14.01.26 –...»

«Т.Ю. Репкина mailto:[email protected] МОРФОЛИТОДИНАМИКА ПОБЕРЕЖЬЯ И ШЕЛЬФА ЮГО-ВОСТОЧНОЙ ЧАСТИ БАРЕНЦЕВА МОРЯ 25.00.25. - Геоморфология и эволюционная география Диссертация на соискание ученой степени кандидата географических наук Научный руководитель : кандидат географических наук В.И. Мысливец МОСКВА, Введение Список сокращений Глава 1. Физико-географические условия развития...»






 
2014 www.av.disus.ru - «Бесплатная электронная библиотека - Авторефераты, Диссертации, Монографии, Программы»

Материалы этого сайта размещены для ознакомления, все права принадлежат их авторам.
Если Вы не согласны с тем, что Ваш материал размещён на этом сайте, пожалуйста, напишите нам, мы в течении 1-2 рабочих дней удалим его.