Электронная библиотека диссертаций и авторефератов России
dslib.net
Библиотека диссертаций
Навигация
Каталог диссертаций России
Англоязычные диссертации
Диссертации бесплатно
Предстоящие защиты
Рецензии на автореферат
Отчисления авторам
Мой кабинет
Заказы: забрать, оплатить
Мой личный счет
Мой профиль
Мой авторский профиль
Подписки на рассылки



расширенный поиск

Модель, алгоритмы и программный комплекс для автоматизированного поиска уязвимостей в исполняемом коде Шудрак Максим Олегович

Модель, алгоритмы и программный комплекс для автоматизированного поиска уязвимостей в исполняемом коде
<
Модель, алгоритмы и программный комплекс для автоматизированного поиска уязвимостей в исполняемом коде Модель, алгоритмы и программный комплекс для автоматизированного поиска уязвимостей в исполняемом коде Модель, алгоритмы и программный комплекс для автоматизированного поиска уязвимостей в исполняемом коде Модель, алгоритмы и программный комплекс для автоматизированного поиска уязвимостей в исполняемом коде Модель, алгоритмы и программный комплекс для автоматизированного поиска уязвимостей в исполняемом коде Модель, алгоритмы и программный комплекс для автоматизированного поиска уязвимостей в исполняемом коде Модель, алгоритмы и программный комплекс для автоматизированного поиска уязвимостей в исполняемом коде Модель, алгоритмы и программный комплекс для автоматизированного поиска уязвимостей в исполняемом коде Модель, алгоритмы и программный комплекс для автоматизированного поиска уязвимостей в исполняемом коде Модель, алгоритмы и программный комплекс для автоматизированного поиска уязвимостей в исполняемом коде Модель, алгоритмы и программный комплекс для автоматизированного поиска уязвимостей в исполняемом коде Модель, алгоритмы и программный комплекс для автоматизированного поиска уязвимостей в исполняемом коде Модель, алгоритмы и программный комплекс для автоматизированного поиска уязвимостей в исполняемом коде Модель, алгоритмы и программный комплекс для автоматизированного поиска уязвимостей в исполняемом коде Модель, алгоритмы и программный комплекс для автоматизированного поиска уязвимостей в исполняемом коде
>

Диссертация - 480 руб., доставка 10 минут, круглосуточно, без выходных и праздников

Автореферат - бесплатно, доставка 10 минут, круглосуточно, без выходных и праздников

Шудрак Максим Олегович. Модель, алгоритмы и программный комплекс для автоматизированного поиска уязвимостей в исполняемом коде: диссертация ... кандидата технических наук: 05.13.19 / Шудрак Максим Олегович;[Место защиты: Томский государственный университет систем управления и радиоэлектроники].- Томск, 2016.- 183 с.

Содержание к диссертации

Введение

Глава 1. Проблемы и анализ существующих подходов к поиску уязвимостей в исполняемом коде 14

1.1. Введение в проблематику, основные термины и определения 14

1.2. Классификация уязвимостей и ошибок программного обеспечения 19

1.3. Модели и алгоритмы для поиска уязвимостей в исполняемом коде 27

1.4. Обзор и сравнение существующих инструментальных средств для автоматизированного поиска уязвимостей в исполняемом коде 42

1.5. Выводы 45

Глава 2. Модель и алгоритмы автоматизированного поиска уязвимостей в трассе программы с оценкой эффективности 47

2.1. Модель поиска уязвимостей в трассе программы 47

2.1.1. Алгоритм автоматизированного поиска уязвимостей в трассе 50

2.2. Методика трансляции исполняемого кода 54

2.2.1. Общий алгоритм частичной декомпиляции 54

2.2.2. Алгоритм интерпретации исполняемого кода 55

2.2.3. Алгоритм сборки 57

2.3. Алгоритм анализа помеченных данных 59

2.4. Метрики программного кода и их применение к задаче расчета эффективности тестирования 61

2.4.1. Алгоритм преобразования процедуры в граф 61

2.4.2. Описание метрик оценки сложности кода

2.5. Алгоритм расчета полноты и повышения эффективности тестирования 74

2.5.1. Алгоритм расчёта количества достижимых вершин в программе 77

2.6. Выводы 79

Глава 3. Элементы системы автоматизированного поиска уязвимостей и повышения эффективности 81

3.1. Описание подсистемы расчета полноты и повышения эффективности систем тестирования 81

3.2. Модуль расчета сложности покрытия 86

3.3. Описание подсистемы автоматизированного поиска уязвимостей в трассе программы

3.3.1. Описание модуля частичной декомпиляции 89

3.3.2. Описание модуля анализа помеченных данных 91

3.3.3. Описание модуля детектирования уязвимостей 93

3.4. Выводы 100

Глава 4. Экспериментальная оценка эффективности комплекса 102

4.1. Общая схема взаимодействия подсистем в программном комплексе 102

4.2. Экспериментальная оценка эффективности метрик расчета сложности покрытия 104

4.3. Экспериментальная оценка эффективности подсистем и программного комплекса

4.4. Описание внедрений результатов диссертационной работы 112

4.5. Выводы 119

Заключение 121

Список сокращений и условных обозначений 123

Словарь терминов 125

Список литературы 129

Введение к работе

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

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

Степень проработки темы исследования

Проблемой поиска уязвимостей в бинарном коде активно занимаются в следующих университетах: Беркли (Д. Сон, Л. Тао Вей, М. Пэйер, Ч. Хьёнсанг), Карнеги-Меллона (Д. Брумли, С. К. Ча, Т. Авгеринос, А. Реберт, Э. Шварц), Техаса (Р. Вартел, В. Мохан, К. Гамлен, Ж. Лин), Калифорнии (М. Кова, В. Фельмештейгер), Колумбийском университете (А. Керомтис), а также в научно-исследовательских лабораториях корпораций: Microsoft Research (П. Годефронд, М. Левин), IBM Research (Е.Р. Гарольд), Google (Д. Браунинг, Ж. Квин).

В РФ этой проблемой активно занимается Институт системного

программирования РАН (Аветисян А.И., Падарян В.А). Проблема

отказоустойчивости и безопасности программного обеспечения активно изучается на

базе ФГУП НТЦ «Атлас» (Чижухин Г.Н., Ю.Г. Бочкарева и др.), на базе Сибирского государственного аэрокосмического университета им. М.Ф. Решетнева (Ковалев И.В., Антамошкин А.Н., Царев Р.Ю.). Также проблема изучалась в рамках кандидатских диссертационных работ на базе Санкт-Петербургского политехнического университета (Печенкин А.И.) и Южного федерального университета (Благодаренко А.В.).

На сегодняшний день авторы выделяют следующие базовые критерии для оценки эффективности систем поиска уязвимостей в исполняемом коде:

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

количество ошибок первого и второго рода;

покрытие кода (отношение количества выполненных инструкций к их общему количеству в программе).

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

Целью данной работы является повышение эффективности автоматизированного поиска уязвимостей в исполняемом коде.

Для достижения указанной цели необходимо решить следующие задачи:

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

2. Разработать формальную модель автоматизированного поиска уязвимостей в
трассе программы.

3. Разработать алгоритм автоматизированного поиска уязвимостей в трассе
программы.

4. Разработать алгоритм расчета полноты и повышения эффективности
тестирования.

5. Провести сравнительный анализ эффективности разработанного алгоритма
автоматизированного поиска уязвимостей в трассе программы с аналогами.

  1. Провести сравнительный анализ разработанного алгоритма расчета полноты и повышения эффективности тестирования с аналогами.

  2. Реализовать предложенные алгоритмы в виде программного комплекса для экспериментальной оценки возможности детектирования ранее неизвестных уязвимостей в актуальных версиях программных продуктов.

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

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

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

Достоверность работы подтверждается результатами, полученными с

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

подтверждены Internet System Consortium и Национальным институтом стандартов и технологий США.

Научная новизна

В диссертационной работе были разработаны:

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

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

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

Практическая значимость работы

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

Результаты работы по повышению эффективности поиска уязвимостей в программных продуктах были внедрены в рабочий процесс ООО «ГуардНет», ООО «ИнфоТраст», а также в образовательный процесс ФГБОУ ВО СибГАУ им М.Ф. Решетнева для студентов кафедры безопасности информационных технологий. Элементы подсистемы декомпиляции бинарного кода были внедрены в проект по анализу бинарного кода в IBM Research Israel в 2014 г., а элементы подсистемы анализа ошибок были разработаны и внедрены в систему тестирования внутренних

разработок компании Google в рамках программы поддержки проектов с открытым исходным кодом Google Summer of Code 2014.

Помимо этого в ходе экспериментального тестирования системы были найдены две ранее неизвестные критические уязвимости в видеофильтре LAV и в DNS – сервере BIND9, за что получена официальная благодарность от международной организации Internet System Consortium с присвоением идентификатора в международной базе уязвимостей CVE-2013-4854.

Положения, выносимые на защиту:

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

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

Соответствует пункту 7 паспорта специальности 05.13.19. Анализ рисков нарушения информационной безопасности и уязвимости процессов переработки информации в информационных системах любого вида и области применения.

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

Соответствует пункту 10 паспорта специальности 05.13.19. Модели и методы оценки эффективности систем (комплексов) обеспечения информационной безопасности объектов защиты.

Апробация результатов работы

Основные положения и результаты работы были опубликованы в 14 научных
статьях и тезисах докладов. Из них 5 публикаций в журналах, входящих в перечень
рецензируемых научных журналов и изданий, рекомендованных ВАК, 2
зарубежные статьи
проиндексированы в международной базе Scopus. Результаты
работы докладывались на семинарах кафедры БИТ СибГАУ им. М.Ф. Решетнева в
2013 и 2015 г., на семинаре кафедры КИБЭВС Томского государственного
университета систем управления и радиоэлектроники в 2015 г., на научно-
техническом семинаре группы Emerging Quality Technologies научно-
исследовательского подразделения IBM Research Израиль в 2014 г., а также на
следующих конференциях:

1. Третья международная научная конференция «High performance computing HPC-UA 2013». Киев, Украина 04 - 08 октября 2013.

  1. Международная научно – практическая конференция «Kaspersky CyberSecurity for the Next Generation 2013». Лондон, Великобритания 25 – 26 июня 2013.

  2. Международная научная конференция «IEEE EuroCon 2013», Загреб, Хорватия 01- 04 июля 2013.

  3. Региональный этап международной научно-практической конференции «Kaspersky CyberSecurity for the Next Generation. CIS round 2013» Ереван, Армения 20 – 22 февраля 2013.

  4. Международный симпозиум «UKSim 6th European Symposium on Computer Modeling and Simulation». Валлетта, Мальта 14-16 ноября 2012.

  5. XVII Всероссийская научно-техническая конференция студентов, аспирантов и молодых ученых «Научная сессия ТУСУР». Томск 16-18 мая 2012.

  6. II Всероссийская молодежная конференция «Перспектива – 2012». Таганрог. 24 - 28 июня 2012.

  7. XVI и XIV Международные научные конференции «Решетневские чтения» Красноярск. 11 – 14 ноября 2012 и 2014 гг.

  8. XI Всероссийский конкурс – конференция студентов и аспирантов по информационной безопасности «SibInfo – 2011». Томск 20 – 22 апреля 2011.

По теме работы было получено 6 свидетельств на регистрацию программы для ЭВМ и БД. Работа по теме диссертации (в качестве основного проекта под руководством автора диссертации) проводилась в рамках следующих грантов и контрактов: грант РФФИ №14-07-31350 мол_а на 2013-2015 гг. «Разработка и апробация методик автоматизированной оценки надежности и безопасности современных программных продуктов в условии отсутствия исходных кодов», грант Минобрнауки РФ №14.132.21.1365 на 2012-2013 гг. «Разработка программного комплекса декомпиляции бинарного кода», контракт № ВГ_2011_6 ЗАО «Лаборатория Касперского» на 2010 - 2011 гг. «Анализ запутывающих преобразований в машинном коде относительно вредоносных объектов».

Личный вклад

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

Объем и структура работы

Модели и алгоритмы для поиска уязвимостей в исполняемом коде

Дадим определения ключевым терминам, которые будут использоваться в настоящей работе (полный перечень приведен в словаре терминов): Бинарный код (машинный код, исполняемый код) – код, исполняемый процессором. Процедура в бинарном коде это группа инструкций для решения конкретной подзадачи, обладающая средствами получения управления из точки вызова задачи более высокого приоритета и возврата управления.

Согласно ГОСТам и другим нормативно – правовым документам РФ отдельного понятия для программной ошибки, программного дефекта или уязвимости в программном коде не существует, однако в [11] дефект или ошибка определяется как каждое отдельное несоответствие продукции установленным к ней требованиям. Помимо этого, этот же документ определяет термин тестирование.

Тестирование - деятельность, направленная на обнаружение дефектов в программном обеспечении [11].

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

В [12] уязвимость информационной системы или брешь определяется как свойство информационной системы, обуславливающее возможность реализации угроз безопасности обрабатываемой в ней информации.

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

Защищаемая информация - информация, являющаяся предметом собственности и подлежащая защите в соответствии с требованиями правовых документов или требованиями, устанавливаемыми собственником информации [13].

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

Безопасность защищаемой информации - состояние защищенности информации, при котором обеспечены ее конфиденциальность, доступность и целостность [13].

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

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

Конфиденциальность обрабатываемой ПО информации – способность ПО обеспечивать состояние информации, при котором доступ к ней осуществляют только субъекты, имеющие на неё право.

Основой для терминов доступности, целостности и конфиденциальности информации, обрабатываемой ПО, послужили рекомендации по стандартизации «Информационные технологии. Основные термины и определения в области технической защиты информации» (Р 50.1.053-2005).

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

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

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

Уязвимости могут быть классифицированы с помощью различных подходов. Dowd и другие в своей работе [14] выделили уязвимости в три базовых класса в зависимости от этапа разработки:

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

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

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

Однако этим классификация не ограничивается, существует множество работ, которые классифицируют уязвимости по их типу, источнику возникновения, потенциальной опасности и т.п. [15 - 17]. Ввиду обширности данной тематики, в рамках данной работы рассматриваются уязвимости, возникающие только при обработке пользовательских данных, передающихся в виде файла или через сетевой протокол в программных продуктах, реализованных на одном из компилируемых языков программирования (С/C++, Delphi, Pascal, Visual Basic и т.п). Приведем классификацию таких уязвимостей ниже.

Алгоритм автоматизированного поиска уязвимостей в трассе

Алгоритм определения границ доступной памяти (ОГДП) На первом шаге производится вход в цикл считывания инструкций и выполняется декомпиляция инструкции по адресу eipt. Затем, если выполняется выделение или освобождение памяти, определяется множество адресов, которые затем добавляются или исключаются из Mi+1. Затем, если размер выделенного участка стека увеличивается или уменьшается, то в множество Mi+1 добавляется или исключается из него множество новых доступных/недоступных адресов. В том случае, если инструкция является вызовом процедуры, производится определение множества передаваемых адресов памяти в качестве аргументов процедуры, а затем производится рекурсивный вызов алгоритма ОГДП с параметром і = і+1. Таким образом, описанный на рисунке 2.3. алгоритм является рекурсивным. Возврат из рекурсии происходит при достижении инструкции retn, для которой определяется множество возвращаемых адресов памяти, которые сохраняются в Mi+1. Переменная j определяет количество проанализированных инструкций в рекурсии и позволяет выполнить переход к последующему после вызова call состоянию.

На следующем этапе согласно алгоритму выполняется последовательное считывание состояний st. Для каждого состояния последовательно выполняются два алгоритма: определение множества указателей Pt (ОМУ) и анализ состояния st (АС) на основе Mt и Pt с помощью выражения 2.1. Рассмотрим детально оба этих алгоритма.

Для описания алгоритма определения множества фактических указателей рассмотрим блок - схему на рисунке 2.4. На первом шаге алгоритма ОМУ выполняется считывание и дизассемблирова ние инструкции по адресу eipt. Затем в том случае, если инструкция работает с памятью, выполняется определение адреса в памяти первого байта, к которому осуществляется доступ (обозначим его как bt), а затем определяется количество считываемых или записываемых байт (обозначим это количество через et). Тогда элементы множества Pt будут определены следующим образом: Pt Є {х \bt х (bt + e AxENol Получив множества Pt и М, алгоритм переходит к анализу состояния (АС). Рассмотрим этот алгоритм на рисунке 2.5.

Алгоритм анализа состояния st (АС) На вход алгоритму поступают множества Mtn Pt. Затем последовательно выполняется проверка принадлежности множества фактических указателей в соответствии с критериями из формулы 2.1. В том случае, если один из критериев определяет факт наличия ошибки или уязвимости, информация об этом сохраняется и анализ продолжается для следующего состояния до тех пор, пока не будут считаны все состояния в трассе. Отметим, что после определения допустимости состояния st выполняется анализ помеченных данных и расчёт Lproti+1 (при і = п не выполняется) для того, чтобы учесть возможные изменения во множестве защищаемых участков памяти при переходе в следующее состояние.

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

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

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

Все операции в рамках декомпиляции должны быть сгруппированы в общий базис, описывающий все множество возможных инструкций из базового набора процессора архитектуры Intel x86 [76 - 78]. Таблица 2.2. Базис операций для инструкций процессора x Операция Описание операции

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

Определение 2.2. Рассматриваемый участок бинарного кода является нелинейным тогда, когда на анализируемом участке присутствуют инструкции передачи управления на другой участок бинарного кода (за исключением вызова процедур).

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

В процессе анализа ГПУ на первом этапе алгоритм производит считывание первой инструкции в блоке и её идентификацию. В том случае, если инструкция линейна, производится её продвижение в стек инструкций с занесением адреса для последующего анализа. Если инструкция относится к нелинейным, то по адресу перехода устанавливается новый линейный блок и производится рекурсивный вызов новой итерации алгоритма со считывания первой инструкции в новом линейном блоке. Одна итерация алгоритма завершается при считывании инструкции ret [79]. Инструкции, являющиеся нелинейными, представлены в таблице 2.3: Таблица 2.3. Описание нелинейных инструкций Безусловные Взаимодействия с процедурами Условные Циклы Jmp Call Jl=Jnge Jc Jnc Loop Ret Jle=Jng Jp Jnp Loope Безусловные Взаимодействия с процедурами Условные Циклы Jg=Jnle Jz Jnz Loopz Int Jge=Jnl Js Jns Loopne Iret Jb=Jnae Jo Jno Loopnz

Jbe=Jna Ja=Jnbe Jcxz Jae=Jnb Jecxz Для интерпретации декомпилированного кода в рамках работы была предложена следующая схема: ресурс, соответствующий регистру, обозначается фигурными скобками, в которые заключён его номер. Ресурс оперативной памяти обозначается квадратными скобками, в которые заключён адрес ресурса. Номер такого ресурса выносится за скобки. Результат отделяется знаком «=». Операции и константы записываются без изменения. Представленная форма записи позволяет представлять инструкции в виде математических формул. Например, инструкции add eax,[ecx] и inc eax запишутся в виде, R2 = R1 +[R0]; R3 = R2 + 1.

Описание подсистемы автоматизированного поиска уязвимостей в трассе программы

Согласно рисунку 3.7 для предварительного анализа программы и генерации дизассемблерного листинга используется дизассемблер IDA PRO, описанный в первой главе. Затем полученный ассемблерный листинг передается генератору графов процедур, который последовательно выполняет итерацию по каждой выполненной процедуре в листинге программы, основываясь на полученной трассе выполненных инструкций. Для каждой процедуры выполняется анализ связей между базовыми блоками, на основе которых строится граф, согласно алгоритму рассмотренному в разделе 2.2.1. Затем на основе полученного графа выполняется расчёт каждой из адаптированных метрик сложности.

Как показано во второй главе, для расчета количественных метрик необходимо получить следующие характеристики исследуемой функции: число инструкций, количество базовых блоков, количество присваиваний, количество управляющих операторов, количество вызовов функций, количество операндов и операторов в программе. Для получения этих характеристик необходимо последовательно проанализировать все инструкции в функции. Множество всех инструкций в функции можно получить при помощи API, предоставляемого дизассемблером IDA. Обозначим этот множество как , обозначим все инструкции условного и без 88 условного переходов из таблицы 2.3 в главе 2 как branchlist, вызов другой процедуры как call. Тогда параметры процедуры будут рассчитываться как: число инструкций := instrlist\ число управляющих операторов := \instrUst П branchUst\ число вызовов функций := \instrlist П саЩ

Для расчета числа базовых блоков необходимо ввести множество ссылок в процедуре. Определение 3.1. Под ссылкой следует понимать условный или безусловный переход по некоторому адресу в коде процедуры. Отметим, что ссылка не учитывается для инструкции call. Каждая инструкция по некоторому адресу может иметь от 0 до п исходящих ссылок. Причем стоит отметить, что безусловный переход всегда имеет 2 ссылки, одну на адрес, по которому ссылается этот переход, а второй ссылкой является адрес, следующий сразу за базовым блоком. Обозначим множество уникальных ссылок в процедуре как refs, тогда число базовых блоков будет определяться как: число базовых блоков := \refs\

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

Тогда общее количество присваиваний будет рассчитываться как: число присваиваний := \instlist П assignlist\ 3.3. Описание подсистемы автоматизированного поиска уязвимостей в трассе программы

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

Таким образом, согласно рисунку 3.8. для описания алгоритмов инструкций, используется определенный набор операций из общего базиса. Поля opcode, op-code2 и modrm описывают инструкцию, чьи операции записываются в следующих четырех полях, хранящих одну основную операцию и три дополнительных. Такая структура базы данных позволяет эффективно хранить и описывать инструкции процессора x86 (для одной записи требуется всего 7 байт без учета счетчика).

Следует отметить, что в результате проведенного в ходе работы статистического анализа частоты появления той или иной инструкции с помощью специально разработанной программы было установлено, что современные компиляторы используют не всё множество инструкций, описанных в спецификации x86 (рису 90 нок 3.9). Объем выборки составил 21 757 940 инструкций из 104 свободно распространяемых программ скомпилированных различными компиляторами (список программ и подробная статистика находится в приложении 1 и 2 соответственно).

Рисунок 3.9. Результаты статистического анализа частоты использования x86 инструкций современными компиляторами

В результате проведенного анализа было получено 342 уникальных инструкции, однако для наглядности на графике представлены лишь 24 наиболее популярные из них, вклад которых в общую статистику превышает или равен 1% (суммарный вклад 48 представленных на слайде инструкций составляет 99,9%) [98]. На основании полученной статистики можно сделать вывод, что для интерпретации нет необходимости описывать всё множество инструкций, существующих в спецификации процессора. Достаточно описать лишь те из них, которые чаще всего используются компиляторами.

Экспериментальная оценка эффективности подсистем и программного комплекса

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

Для решения этой задачи было принято решение осуществить внедрение комплекса в цикл разработки ПО на этапе тестирования новой функциональности, каждую ночь в период отсутствия новых задач на серверах компании. Для выполнения анализа было описано 5 тестовых сценариев, включающих в себя анализ следующих протоколов обмена информации: XML, HTTP, FTP, SMTP и DNS.

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

ООО ГуардНет в рамках своей коммерческой деятельности предоставляет услуги по независимому внешнему аудиту безопасности программного кода и тестированию на проникновения. Компания выполняет аудит безопасности различ 117 ного кода, в том числе разработанного на компилируемых языках программирования без предоставления исходного кода. В рамках внедрения требовалось повысить эффективность динамического тестирования безопасности программных продуктов методом фаззинга, который используется в компании в таких ситуациях. Для этого было принято решение внедрить разработанный в рамках данной работы программный комплекс и предоставить графический интерфейс для его использования. Пример разработанного в рамках внедрения графического интерфейса и поиска уязвимостей в FTP сервере представлен на рисунке 4.8.:

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

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

езультаты диссертационной работы были внедрены в учебный процесс для студентов кафедры безопасности информационных технологий СибГАУ им. М.Ф. Решетнева в рамках курса: «Программно–аппаратные средства защиты информации». Программный комплекс позволяет на практике познакомить студентов с современными подходами в области промышленной разработки программного обеспечения в части тестирования и выявления уязвимостей.

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

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

Кроме того, разработанные в работе алгоритмы использовались для проведения соревнований по практическим аспектам информационной безопасности для школьников и студентов в 2014-2015 (KrasCTF 2014, Spring CTF SibSAU 2015).

В первом разделе настоящей главы приводится описание общей схемы взаимодействия всех модулей и подсистем в виде единого программного комплекса. Для повышения гибкости и масштабируемости вся система была построена по модульной архитектуре так, чтобы каждый модуль мог работать отдельно. Такой подход позволяет использовать систему независимо от источника тестовых данных, таким образом может использоваться любой из доступных на сегодняшний день инструментов или подходов к их получению. При этом стоит отметить, что все компоненты системы (за исключением декомпилятора) могут использоваться как в Windows, так и в ОС семейства Linux.

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

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

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

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

В заключительном разделе приводится описание внедрения результатов работы в рамках поддержки проектов с открытым исходным кодом Google, элементов модуля декомпиляции в проект по анализу бинарного кода IBM Research Israel, программного комплекса в процесс разработки ООО ИнфоТраст и процесс аудита безопасности ПО ООО ГуардНет. Кроме того программный комплекс используется в учебном процессе на кафедре безопасности информационных технологий СибГАУ им М.Ф. Решетнева.