автореферат диссертации по информатике, вычислительной технике и управлению, 05.13.19, диссертация на тему:Разработка метода, алгоритмов и программ для автоматического поиска уязвимостей программного обеспечения в условиях отсутствия исходного кода

кандидата технических наук
Благодаренко, Артем Васильевич
город
Таганрог
год
2011
специальность ВАК РФ
05.13.19
цена
450 рублей
Диссертация по информатике, вычислительной технике и управлению на тему «Разработка метода, алгоритмов и программ для автоматического поиска уязвимостей программного обеспечения в условиях отсутствия исходного кода»

Автореферат диссертации по теме "Разработка метода, алгоритмов и программ для автоматического поиска уязвимостей программного обеспечения в условиях отсутствия исходного кода"

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

Благодаренко Артем Васильевич

РАЗРАБОТКА МЕТОДА, АЛГОРИТМОВ И ПРОГРАММ ДЛЯ АВТОМАТИЧЕСКОГО ПОИСКА УЯЗВИМОСТЕЙ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ В УСЛОВИЯХ ОТСУТСТВИЯ ИСХОДНОГО КОДА

05.13.19 - Методы и системы защиты информации, информационная безопасность

АВТОРЕФЕРАТ 1 7 НО Я 2 011

диссертации на соискание ученой степени кандидата технических наук

Таганрог-2011

005002347

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

НАУЧНЫЙ РУКОВОДИТЕЛЬ:

Доктор технических наук, профессор Макаревич Олег Борисович

ОФИЦИАЛЬНЫЕ ОППОНЕНТЫ:

Доктор технических наук, профессор Кравченко Павел Павлович

ВЕДУЩАЯ ОРГАНИЗАЦИЯ:

ФГУП «Концерн «Системпром», г. Москва

Защита диссертации состоится « 1 » декабря 2011 г. в 14.20 на заседании диссертационного совета Д 212.208.25 Южного федерального университета по адресу:

347928, Ростовская область, г. Таганрог, ул. Чехова, 2, ауд. И-409

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

347928, Ростовская область, г. Таганрог, пер. Некрасовский, 44, Технологический институт Южного федерального университета в г. Таганроге, Ученому секретарю диссертационного совета Д 212.208.25 Брюхомицкому Юрию Анатольевичу.

С диссертацией можно ознакомиться в Зональной научной библиотеке ЮФУ по адресу: 344007, Ростовская обл., г. Ростов-на-Дону, ул. Пушкинская, 148.

Автореферат разослан «27» октября 2011 г.

Кандидат технических наук, доцент Хади Роман Ахмедович

Ученый секретарь диссертационного совета

Ю.А. Брюхомицкий

ОБЩАЯ ХАРАКТЕРИСТИКА РАБОТЫ

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

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

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

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

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

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

Исходя из основной цели данной работы, определяется перечень решаемых задач:

1. Разработка алгоритма оценки покрытия программного обеспечения тестами, позволяющего оценить степень завершенности процесса тестирования.

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

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

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

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

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

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

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

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

количеству таких участков.

Практическая значимость и внедрение результатов работы Практическая значимость результатов диссертации заключается в следующем:

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

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

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

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

Использование результатов Основные результаты исследований были использованы на кафедре Безопасности информационных технологий ТТИ ЮФУ при проведении следующих научно-исследовательских и опытно-конструкторских работ: «Исследование методов моделирования и противодействия компьютерным атакам, осуществляемым системами несанкционированного управления», «Разработка и развитие технологий и методов использования уязвимостей систем в открытых сетях», «Исследование возможностей построения транспортной подсистемы на основе узлов сети интернет»; научных исследований, поддержанных грантом РФФИ №07-0700138 в учебном процессе на кафедре БИТ ТТИ ЮФУ при проведении лабораторных работ по курсу «Низкоуровневое программирование в задачах защиты информации», в ФГНУ «НИИ «Спецвузавтоматика» при выполнении составной части опытно-конструкторской работы «Фокстрот-Р».

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

Апробация работы. По теме диссертации опубликовано 12 научных статей и тезисов докладов. Основные результаты, полученные в ходе работы над диссертацией, были представлены на:

1. VIII Всероссийской научной конференции студентов и аспирантов «Техническая кибернетика, радиоэлектроника и системы управления», Таганрог (2006 г.).

2. XIV всероссийской научной конференции «Проблемы информационной безопасности в системе высшей школы: труды XIV всероссийской научной конференции», Москва (2007 г.).

3. XIV общероссийская научно-техническая конференция «Методы и технические средства обеспечения безопасности информации». Санкт-Петербург (2007 г.).

4. LIII научно-технической конференции профессорско-преподавательского состава, аспирантов и сотрудников ТТИ ЮФУ. Таганрог (2008 г.).

5. Первой всероссийской молодежной конференции по проблемам информационной безопасности "ПЕРСПЕКТИВА - 2009". Таганрог (2009 г.).

6. Конференции «Молодежь и современные информационные технологии». Томск (2010 г.). Таганрог (2009 г.).

7. VI Ежегодная научная конференция студентов и аспирантов базовых кафедр Южного научного центра РАН, Ростов-на-Дону (2010 г.).

8. XI Международной научно-практической конференции «Информационная безопасность». Таганрог (2010 г.)

9. Тринадцатой международной конференции «РусКрипто'2011». Москва

(2011).

Публикации

По теме диссертации опубликовано 12 научных статей (из них 2 в изданиях, рекомендованных ВАК) и тезисов докладов. Имеются 2 свидетельства об официальной регистрации программ для ЭВМ (№2010614872 и N»2010614871).

Объем и структура диссертации. Диссертация состоит из введения, пяти глав, заключения, списка литературы. Основной текст диссертации изложен на 129 страницах, включая 38 рисунков и 18 таблиц.

ОСНОВНЫЕ ПОЛОЖЕНИЯ РАБОТЫ

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

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

Для понимания методов поиска уязвимостей требуется определить само понятие уязвимости. Уязвимое место (или уязвимость) — это недостаток программного обеспечения, которым может воспользоваться злоумышленник в

своих корыстных целях.

Уязвимости программного обеспечения — распространенный способ компрометации компьютерных систем, которым пользуются злоумышленники. Критическая уязвимость в сетевом приложении может привести к удаленному запуску произвольного кода. Однако, далеко не все уязвимости настолько опасны. Сбором и классификацией уязвимостей занимаются государственные и общественные организации, такие как СБЫТ, СУЕ, \VASC. Общепринятой является классификация уязвимостей СУЕ по типам. Причиной большинства типов уязвимости может быть ошибка в исполняемом бинарном файле. Таким образом, задача поиска уязвимостей в бинарных исполняемых файлах в

настоящий момент актуальна.

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

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

того, насколько доступно исследуемое ПО. Для проведения статического и динамического анализа необходим доступ к исполняемому коду, а для некоторых методов и исходному коду. Тестирование методом «черного ящика» может проводиться удаленно, без доступа к коду.

По данным Web Application Security Consortium (WASC)[20] «Около 49% Web-приложений содержат уязвимости высокой степеней риска (Urgent и Critical)», обнаруженные при автоматическом сканировании систем. Однако при детальной ручной и автоматизированной оценке методом «белого ящика» вероятность обнаружения таких уязвимостей высокой степени риска достигает 80-96%. На рисунке 1 показаны количество найденных уязвимостей при использовании различных техник. Столбец «Scans» описывает уязвимости, найденные с помощью автоматических средств со стандартными настройками. Статистика из столбца «BlackBox» достигнута с помощью детального анализа, но без доступа к кодам ПО. Столбец «WhiteBox» - уязвимости, найденные с помощью статического и динамического анализа исполняемых и исходных кодов ПО серверов. Следует учесть, что методы из ряда «WhiteBox» могут содержать элементы методов «черного ящика».

140

112.07

Рис. 1 - Распределение уязвимостей на один сервис при использовании различных методов их поиска

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

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

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

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

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

сигнатурный анализ.

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

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

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

время приобретает популярность разновидность метода тестирования «серого ящика», которая получило название фаззинг.

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

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

Автоматическая система поиска уязвимостей в ПО без исходных кодов должна реализовывать следующие возможности:

• внедрение данных в произвольные функции программы;

• генерация данных, обеспечивающих наибольшее покрытие кода, но с учетом спецификации входных данных исследуемого ПО;

• отслеживание реакции на внедренные данные;

• оценка покрытия кода тестами;

• внедрение ошибок.

Для создания системы обнаружения уязвимостей в ПО в условиях отсутствия исходного кода необходимо решение следующих основных задач:

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

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

3. разработать принцип обеспечения покрытия, на основе методологии модульного тестирования и фаззинга в памяти;

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

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

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

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

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

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

структуры программы.

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

Ориентированный граф G(V,A), вершинами которого являются линеиные блоки кода V(V1(...Vm), а ребрами - возможные пути передачи управления А(А1(..., Ап), называется управляющим графом программы.

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

Vi-

Ветвь - в терминологии, использованной в работе, синоним понятия линейного блока.

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

Тестирование программы Р по выбранному критерию С означает

покрытие всех компонентов программы Р М = {пн.....mn} по элементам или

по связям. Выше был выбран структурный критерий с компонентами ветвей.

Пусть имеется кортеж неизбыточных тестов Т = {tu..., tn}.

Тест tt является неизбыточным, если существует покрытый им компонент тпг из М(Р,С), который не был покрыт ни одним из предыдущих тестов t^.ti-i-

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

Остаточная сложность тестирования программы Р по критерию С ОУ=(Р,С,Т) измеряется максимальным числом неизбыточных тестов, покрывающих элементы множества М(Р,С), оставшихся непокрытыми после прогона набора тестов Т. Так же может быть использовано количество непокрытых ветвей кода. Величина ЭУ строго и монотонно убывает от V до 0.

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

Критерий окончания тестирования ТУ(Р,С,Т)>Ь, где ( 0 < < 1). Параметр Ь - уровень оттестированости,

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

заданный в требованиях к программному продукту.

Структурный критерий покрытия кода данными опирается на информацию о количестве выполненных в ходе исполнения ветвей кода. Для отслеживания выполнения ветвей, или иными словами «покрытия ветвей данными», при тестировании ПО с исходными кодами эффективно применяются датчики исполнения.

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

Таким образом, линейный блок заканчивается там, где:

• встречается инструкция условной передачи управления;

• встречается инструкция безусловной передачи управления;

• на следующую инструкцию за текущей инструкцией передается управление;

• происходит возврат управления из подпрограммы;

• завершается память, помеченная как исполняемая.

Началом блока служит:

• инструкция, следующая за инструкцией условной передачи управления;

• инструкция, на которую передается управление;

• точка входа в подпрограмму.

Рисунок 2 иллюстрирует расстановку маркеров начала и конца линейного блока для всех типов команд.

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

ее

Для платформы IA-32 существуют следующие типы операторов передачи управления: JCC, LMP, IRET/IRETD, LOOP/LOOPcc, RET, SUSEXIT. Операторы вызова подпрограммы отличаются от операторов передачи управления тем, что вызываемая функция возвращает управление на команду, следующую за вызовом. По этой причине операторы вызова подпрограммы могут находиться в середине линейного блока.

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

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

модульного теста.

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

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

В третьей главе рассмотрен вопрос ввод Щг Тест обеспечения покрытия кода. Решен вопрос ПР°ГРЭММЫ универсального принципа внедрения данных -

использование аналога модульных тестов для ^ 4 Прии11ип „одального исполняемого кода. Для возможности реализации тестирования модульных тестов разработан алгоритм генерации интерфейса произвольной внутренней функции программы, а также способ исполнения модульного теста в контексте изучаемой программы. Разработан алгоритм для выбора оптимальной точки внедрения данных для обеспечения максимального покрытия.

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

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

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

12

Модуль Модуль 1

у

2 il 1 !

11

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

Изолирование тестируемого участка кода - это одна из техник модульного тестирования. На рисунке 4 изображена ситуация, когда программа (изображена как залитый прямоугольник) состоит из двух модулей: модуль 1 и модуль 2. При этом интерфейсным является модуль 2. Функции модуля 1 достижимы через ввод программы, обрабатываемый модулем 2. Тестировать модуль 1 можно, передавая данные модулю 2, однако более эффективным будет передавать данные непосредственно модулю 1.

Применение схемы на этапе верификации, однако, требует решения

некоторых технических проблем:

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

• организация интерфейсов для выбранной точки внедрения данных;

• динамическое связывание тестирующего модуля с тестируемым.

Помимо данных о степени оттестированности программы важно также

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

Для простоты будем считать, что все участки всех функции программы могут быть достигнуты через ее точку входа. Тогда, можно построить граф С=(У Е), где V - множество функций программы Р (вершины графа), а Е -множество связей между функциями (ребра графа). Ребра представляют отношение «функция А вызывает функцию В».

Граф С(У,Е), построенный на основе динамического анализа программы Р, ориентированный и связный. Связный по той причине, что все вошедшие функции хотя бы раз были вызваны во время анализа. Ориентированный из-за описываемого ребрами отношения.

Предложенное представление программы Р удобно для анализа достижимости функций на основе теории графов. Достижимость вершин графа принято описывать матрицей достижимости. Матрица достижимости простого ориентированного графа G = (V,E) — бинарная матрица замыкания по транзитивности отношения Е (оно задаётся матрицей смежности графа). Таким образом, в матрице достижимости хранится информация о существовании путей между вершинами ориентированного графа.

Как упоминалось ранее, матрица смежности графа, описывающего программу Р, может быть получена во время динамического анализа. Пусть п -размерность матрицы смежности. Матрица достижимости получается путем сложения матриц смежности со степенями от 1 до п.

Пусть есть простой ориентированный граф G(V,E). Матрица смежности Е = (eij)nxn, где e,j = 1 «=> (i,j) е Е. Матрица Е дает информацию обо всех путях длины 1 в графе G(V,E). Для получения информации о путях длины 2 необходимо найти композицию отношений Е самой с собой.

Е°Е = {(а, с): 3b е V: (а, Ь), ф, с) е Е]

По определению матрица композиции отношения Е°Е есть Е2=(е2и) = (2k=0 eikekj) = C(ew Л e0J) V (еп А е1;) V. .V (ein A enj))

Ео...°Е,

Таким образом, можно найти к матриц I описывающих существование маршрутов длинной от 1 до к. Искомая матрица достижимости: Я* = Я1 V Е2 v. .V Еп = (ey)n х n = (еи v efj v. .V

Ускорить вычисление матрицы достижимости позволит использование алгоритма Флойда-Уоршела. Сложность алгоритма 0(n3 / log п).

Для восстановления прототипа необходимы следующие данные о функции:

• Способ освобождения стека (вызывающая функция или вызываемая);

• Количество параметров, передаваемых через стек;

• Регистры, задействованные для передачи параметров.

Бинарный код для платформы х86 позволяет с абсолютной точностью выявить способ освобождения стека. В условиях отсутствия какой-либо

дополнительной информации об используемых компилятором

регистрах имеет смысл считать параметром каждый регистр,

значение которого было Рис.5. с«и, В1Мярв1|М тесТовы1 дайн-.*

использовано без инициализации входным параметром.

Сформулируем предложенный критерий для регистра-параметра. Зададим массивы А = ( аы ) и В = ( Ьк , ), где аи=1 в случае, если в блоке I регистр к был инициализирован (изменен), а ЬкЛ = 1 в случает, если в блоке

I регистр к был использован без инициализации.

Пусть схему отношений линейных блоков функции описывает граф С(У,Е). Зададим матрицу смежности Е = (еи)пхп, для всех п линейных блоков

функции, где вц = 1 <=> О',/) £ Е-

Регистр к является параметром в том случае, если верен следующий

предикат р:

Рк = \/

I

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

Для внедрения воздействий на изучаемую программу применяется следующая схема (рисунок 5). Предложенный алгоритм внедрения данных позволяет выполнять произвольные воздействия в произвольную точку исследуемой программы. Это дает возможность реализовать высокоэффективные методы обеспечения покрытия кода.

Для обеспечения наибольшего покрытия кода необходим массивный

набор входных данных.

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

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

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

• среди полученных образцов могут оказаться специально подготовленные данные для «атаки через содержимое».

Возможность получать образцы из сети предоставляют провайдеры спутникового Интернет. Файлы, которые скачивают пользователи спутникового интернет (в зависимости от выбора провайдера, можно ограничить аудиторию, например, территориально), могут быть использованы как образцы для тестирования методом «черного ящика».

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

Алгоритм последовательного внедрения ошибки, предлагаемый в данной работе, применяется в сочетании с методологией модульного тестирования.

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

1. запустить тест в режиме сбора данных (количество выделений памяти);

2. номер текущего прогона равен 0;

3. пока номер прогона меньше количества выделений, выполняем пункты 4-7;

4. номер текущего выделения памяти равен 0;

5. запустить на выполнение тест. Пока номер текущего выделения памяти меньше номера текущего прогона, выполнять пункт 6, иначе пункт 7;

6. выделять память в штатном режиме;

7. инициировать ошибку; перейти к пункту 3;

8. проверить на утечки памяти.

Запущенный на выполнение тест должен возвращать успешное выполнение в пункте 1 и код ошибки для всех остальных случаев.

Таким образом, решены все поставленные задачи обеспечения покрытия кода программы.

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

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

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

• оценка количества исполняемого кода;

• перечисление подгружаемых программой модулей;

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

• определение прототипов функций;

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

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

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

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

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

• вызов внутренних функций с заданными параметрами;

• динамическая оценка покрытия;

• последовательное внедрение ошибок;

• любые другие возможности, применимые к динамическим библиотекам (такие как стандартная библиотека языка Си или STL).

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

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

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

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

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

• адрес в адресном пространстве исследуемого процесса, где возникло исключение;

• список загруженных модулей и адреса загрузки;

• содержимое регистров;

• содержимое стека;

• инструкция, которая привела к исключению.

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

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

• удаленно выполнить код;

• инициировать отказ обслуживания;

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

Вопрос автоматической классификации сбоев по рискам безопасности выходит за пределы данной работы.

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

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

Система реализует метод, описанный в разделе 4 данной работы. Система имеет архитектуру, представленную на рисунке 6.

Рисунок 6 - Архитектура системы Dataflow

Тестирование проводилось на рабочей станции следующей конфигурации:

• процессор Intel i3 ЗЗОМ (два физических ядра/четыре логических) с тактовой частотой 2.13 Ггц;

• 4 Гбайт оперативной памяти;

• 320 Гбайт жесткий диск;

• DVB карта SkyStar2;

• операционная система Windows ХР SP3;

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

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

Таблица 1 - Сравнение скорости работы алгоритма с эталонным

Приложен Исследуемые Объем Объем Время Время

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

емого ного кода на под управление

кода этапе управлени м

(байт) загрузки ем разработанн

(байт) эталонног ого

0 алгоритма

алгоритма (м С)

(мС)

Evince evince.exe 189540 11580 1028469 5998

Chrome chrome.exe 456339 87951 1295352 9564

Таким образом, опытное испытание показывает, что разработанный алгоритм работает в среднем в 153,5 раз быстрее и рекомендуется в качестве основного алгоритма оценки покрытия.

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

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

• уменьшение накладных расходов: меньше кода повторно исполняется (за счет исключения интерфейсного кода);

• увеличение скорости тестирования за счет уменьшения накладных расходов.

В настоящее время известна только одна общедоступная реализация фаззера в памяти - corelan in memory fuzzer. Сравним качественные характеристики данной реализации тестирования «черного ящика» с предложенным в данной работе. Характеристики сведены в таблицу 2.

Таблица 2 - Сравнение характеристик разных алгоритмов тестирования

Соге1ап Данная работа

Определение целевого модуля ручной анализ ручной анализ

Выбор целевой функции на основе значений параметров (по заданному значению) автоматиечески на основе рейтинга функций и значений параметров

Определение адреса точки входа в целевую функцию автоматизировано автоматически

Определение адреса точки выхода из целевой функции автоматизировано автоматически

Определение параметров Параметры, передаваемые через стек Восстановление прототипа функции по используем источникам входных данных Сстек. регистры)

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

Внедряемые данные Заданный набор данных, мутация исходного буфера Набор данных, мутация исходного буфера, внедрение ошибок, генерация

i arvklM uuptuv/m, ^lAj^wwv/i.b***»*»'*'» ~t-------------

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

внедрять не только данные, но и ошибки.

Сравним разработанный алгоритм последовательного внедрения ошибок с аналогичными методами внедрения ошибок - Application Verifier(a так же Driver Verifier для кода режима ядра) компании Microsoft. Для этого поставим задачу покрыть пять ветвей, срабатывающих при ошибке выделения памяти.

В таблице 3 представлены результаты оценки покрытия после каждого запуска. Знак плюс устанавливается для блока (адреса подписаны сверху), если после текущего запуска блок покрыт.

Таблица 2 - Сравнение последовательного алгоритма внедрения ошибок с Driver Verifier

Application Verifier Последовательное внедрение

№ 101d- 1075- Юсб- 111b- 116f- 101d- 1075- 10c6- 111b- 116f-

1044 1099 Юеа 113f 1193 1044 1099 lOea 113f 1193

1 +

2 + +

3 + + + +

4 + + + + + +

5 + + + + + + +

6 + + + + + + +

9 + + + + + + + +

12 + + + + + + + + +

18 + + + + + + + + + +

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

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

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

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

Публикации в ведущих рецензируемых изданиях, рекомендуемых ВАК РФ:

1. Благодаренко A.B. Схема выявления вредоносных данных, поступающих из сети на основе динамического анализа исполняемого кода. // Известия ЮФУ. Технические науки. Тематический выпуск. «Информационная безопасность». - Таганрог: Изд-во ТТИ ЮФУ, 2009. №11 (100). - с. 64-73.

2. Благодаренко A.B. Методика автоматизированного поиска уязвимостей в программном обеспечении без исходных кодов. // Системы высокой доступности. - М: Изд-во «Радиотехника», №2 т 7,2011

Также по теме диссертационной работы опубликованы следующие работы:

1. Благодаренко A.B. Поиск уязвимостей посредством анализа исполняемого кода. Динамический анализ. // Сб. трудов VIII Всероссийской научной конференции студентов и аспирантов «Техническая кибернетика, радиоэлектроника и системы управления»,

Таганрог 2006. с. 333.

2. Благодаренко A.B. Статистический и динамический анализ программного обеспечения без исходных текстов. // Проблемы информационной безопасности в системе высшей школы: труды XIV всероссийской научной конференции.-М.:МИФИ, 2007. с. 33-34.

3. Благодаренко A.B. Полномаршрутное тестирование программного обеспечения без исходных кодов. // Материалы XIV общероссийской научно-технической конференции Спб. «Методы и технические средства обеспечения безопасности информации». 2007. с. 31.

4. Благодаренко A.B. Инструментальное средство для проведения сертификационных испытаний программного обеспечения без исходных кодов. // Известия ЮФУ. Технические науки. Тематический выпуск.

Таганрог 2007, с. 212-215.

5. Благодарекно A.B. Построение маршрутов выполнения ПО без исходных кодов. // Известия ЮФУ. Технические науки. Специальный выпуск. Материалы LUI научно-технической конференции профессорско-преподавательского состава, аспирантов и сотрудников ТТИ ЮФУ. Таганрог: Изд-во ТТИ ЮФУ, 2008. №1.277 с, ), с 111.

6. Благодаренко A.B. Пассивный honeypot на анализе спутникового трафика. // Сборник ЮФУ. Тематический выпуск. Информационная безопасность. Перспектива-2009.2009. с 44-49.

7. Благодаренко A.B. Широковещательное распространение обновлений безопасности для ОС Linux через спутниковый канал. // Сборник ЮФУ. Тематический выпуск. Информационная безопасность. Перспектива-

2009.2009. с 210-214.

8. К.Д. Ольшанов, А.Л. Речков, А.В Благодаренко. Метод последовательного внедрения ошибок для тестирования обработки аварийных ситуаций ПО. // Сборник трудов конференции «Молодежь и современные информационные технологии». Томск, 3-5 марта 2010 г., 4.2. Томск: Изд-во СПБ Графике - 138 - 139 с.

9. Благодаренко A.B. Метод обеспечения и оценки покрытия кода тестовыми данными. // VI Ежегодная научная конференция студентов и аспирантов базовых кафедр Южного научного центра РАН: Тезисы докладов (19-30 апреля 2010 г., г. Ростов-на-дону). - Ростов н/Д: Изд-во ЮНЦ РАН, 2010. - с. 93-94.

10.Е.П. Тумоян, Ю.В.Лисова, А.В. Благодаренко. Исследование безопасности гетерогенных корпоративных сетей на основе методологии ОББТММ. II Материалы XI Международной научно-практической конференции «Информационная безопасность». 4.2. - Таганрог: Изд-во ТТИ ЮФУ, 2010. - с. 61-64.

11.Свидетельство об официальной регистрации программы для ЭВМ №2010614872 «Программная реализация метода последовательного внедрения ошибок для тестирования обработки аварийных ситуаций ПО».

12. Свидетельство об официальной регистрации программы для ЭВМ №2010614871 «Система внедрения данных и отслеживания реакции для проведения функционального тестирования ПО без исходных кодов».

Личный вклад автора в работах, написанных в соавторстве, состоит в следующем: [8] - разработка метода последовательного внедрения ошибок; [10] - разработка методики тестирования;

ЛР№ 020565 от 23.06.97 г.

Подписано в печать 24.10.11. формат 60x84 1/16 Бумага офсетная. Печать офсетная. Усл. п.л. -1,25 Тираж 120 экз. Заказ №

Издательство Технологического института Южного федерального университета

в г. Таганроге Таганрог, 28, Некрасовский, 44.

Оглавление автор диссертации — кандидата технических наук Благодаренко, Артем Васильевич

ВВЕДЕНИЕ.

1. АНАЛИЗ МЕТОДОВ АВТОМАТИЧЕСКОГО ПОИСКА УЯЗВИМОСТЕЙ ПО БЕЗ ИСХОДНОГО КОДА.

1.1. Основные понятия.

1.1.1 Проблема уязвимости ПО.

1.1.2 Задача поиска уязвимостей.

1.2. ' Обзор методов, используемых при тестировании ПО.

1.2.1 Профилактика уязвимостей.

1.2.2 Модульное и интеграционное тестирование.

1.2.3 Внедрение ошибок и отслеживание утечки ресурсов.

1.3. Обзор методов, используемых при верификации ПО.

1.3.1 Ручной поиск уязвимостей.

1.3.2 Поиск шаблонов уязвимостей.

1.3.3 Тестирование методом ««серого ящика»».

1.3.4 Фаззинг в памяти.

1.4. Цель и задачи работы.

1.5. Выводы.

2. РАЗРАБОТКА АЛГОРИТМА ОЦЕНКИ ПОКРЫТИЯ КОДА ТЕСТАМИ

2.1. Выбор критерия оценки покрытия кода тестами.

2.1.1 Классы критериев.

2.1.2 Интегральная структурная оценка степени завершенности тестирования ПО.

2.2. Алгоритм оценки покрытия кода.

2.2.1 Оценка покрытия с использованием датчиков исполнения.

2.2.2 Расстановка датчиков исполнения на основе статического анализа.

2.2.3 Расстановка датчиков исполнения на основе динамического анализа.

2.3. Отслеживание реакции ПО на входные данные.

2.3.1 Динамическая оценка покрытия.

2.3.2 Сохранение значений параметров функций.

2.4. Оценка покрытия с использованием аппаратных средств процессора.

2.4.1 Аппаратные средства отладки процессоров Intel.

2.4.2 Разработка средства оценки покрытия кода на основе аппаратных возможностей

2.5. Выводы.

3. РАЗРАБОТКА АЛГОРИТМОВ ОБЕСПЕЧЕНИЯ И УЛУЧШЕНИЯ ПОКРЫТИЯ КОДА ТЕСТАМИ.

3.1. Алгоритм обеспечения кода тестами.

3.1.1 Аналог модульного тестирования для ПО в условиях отсутствия исходного кода.

3.1.2 Критерий оценки охвата тестирования.

3.1.3 Оценка охвата тестирования.

3.1.4 Алгоритм внедрения данных. Генерация интерфейсов.

3.1.5 Алгоритм внедрения данных. Динамическая компоновка.

3.2. Генерация тестовых данных.

3.2.1 Использование данных, поступающих из спутникового канала.

3.3. Алгоритм улучшения покрытия тестами.

3.3.1 Алгоритм последовательного внедрения ошибок.

3.3.2 Последовательное внедрение ошибок в бинарный код.

3.4. ВЫВОДЫ.

4. РАЗРАБОТКА МЕТОДА АВТОМАТИЧЕСКОГО ПОИСКА УЯЗВИМОСТЕЙ ПО В УСЛОВИЯХ ОТСУТСТВИЯ ИСХОДНОГО КОДА

4.1. Описание.

4.1.1 Входные данные.

4.1.2 Выходные данные.

4.1.3 Ограничения.

4.1.4 Последовательность шагов.

4.1.5 Выбор точки внедрения данных.

4.1.6 Выбор цели.

4.1.7 Предварительный анализ.

4.1.8 Выбор точки внедрения данных.

4.2. Внедрение данных и отслеживание реакции.

4.2.1 Подготовка тестов.

4.2.2 Пример создания теста.

4.2.3 Исполнение теста.

4.2.4 Оценка результатов.

4.3. Анализ уязвимости на основе данных о сбое.

4.4. Выводы.

5. ЭКСПЕРИМЕНТАЛЬНОЕ ИССЛЕДОВАНИЕ МЕТОДА,

АЛГОРИТМОВ И ПРОГРАММ.

5.1. Описание системы.

5.2. Сравнение предложенного алгоритма оценки покрытия с аналогами.

5.2.1 Сравнение с алгоритмом, использующим аппаратные средства.

5.3. Сравнение предложенного алгоритма внедрения данных с аналогами.

5.3.1 Сравнение с тестированием «черного ящика» в памяти.

5.4. Сравнение предложенного алгоритма увеличения покрытия с аналогами.

5.4.1 Алгоритм последовательного внедрения ошибок в действии.

5.4.2 Сравнение с алгоритмом случайного внедрения ошибок.

5.5. Выводы.

Введение 2011 год, диссертация по информатике, вычислительной технике и управлению, Благодаренко, Артем Васильевич

Актуальность темы

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

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

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

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

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

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

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

1. Разработка алгоритма оценки покрытия программного обеспечения тестами, позволяющего оценить степень завершенности процесса тестирования.

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

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

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

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

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

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

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

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

Практическая значимость и внедрение результатов работы Практическая значимость результатов диссертации заключается в следующем.

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

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

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

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

Использование результатов: Основные результаты исследований были использованы на кафедре Безопасности информационных технологий ТТИ ЮФУ при проведении следующих научно-исследовательских и опытно-конструкторских работ: «Исследование методов моделирования и противодействия компьютерным атакам, осуществляемым системами несанкционированного управления», «Разработка и развитие технологий и методов использования уязвимостей систем в открытых сетях», «Исследование возможностей построения транспортной подсистемы на основе узлов сети интернет»; научных исследований, поддержанных грантом РФФИ №07-07-00138 в учебном процессе на кафедре БИТ ТТИ ЮФУ при проведении лабораторных работ по курсу «Низкоуровневое программирование в задачах защиты информации».

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

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

Ovni Всероссийской научной конференции студентов и аспирантов «Техническая кибернетика, радиоэлектроника и системы управления», Таганрог (2006 г.). всероссийской научной конференции «Проблемы информационной безопасности в системе высшей школы: труды XIV всероссийской научной конференции», Москва (2007 г.). [□XIV общероссийская научно-техническая конференция «Методы и технические средства обеспечения безопасности информации». Санкт-Петербург (2007 г.).

Иип научно-технической конференции профессорско-преподавательского состава, аспирантов и сотрудников ТТИ ЮФУ. Таганрог (2008 г.).

§~~]Первой всероссийской молодежной конференции по проблемам информационной безопасности "ПЕРСПЕКТИВА - 2009". Таганрог (2009 г.).

Конференции «Молодежь и современные информационные технологии». Томск (2010 г.). Таганрог (2009 г.). □VI Ежегодная научная конференция студентов и аспирантов базовых кафедр Южного научного центра РАН, Ростов-на-Дону (2010 г.). ¡ПД Международной научно-практической конференции

Информационная безопасность». Таганрог (2010 г.) ^Тринадцатой международной конференции «РусКрипто'2011». Москва (2011).

Объем и структура диссертации. Диссертация состоит из введения, пяти глав, заключения, списка литературы, включающего 78 наименование. Основной текст диссертации изложен на 129 страницах, включая 38 рисунка и 18 таблиц.

Заключение диссертация на тему "Разработка метода, алгоритмов и программ для автоматического поиска уязвимостей программного обеспечения в условиях отсутствия исходного кода"

5.5. Выводы

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

Заключение

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

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

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

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

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

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

Библиография Благодаренко, Артем Васильевич, диссертация по теме Методы и системы защиты информации, информационная безопасность

1. Руководящий документ. Защита от несанкционированного доступа к информации. Часть 1. Программное обеспечение средств защиты информации. Классификация по уровню контроля отсутствия недекларированных возможностей. М: Гостехкомиссия России, 1998.

2. Марков, A.C. Выявление уязвимостей в программном коде /A.C. Марков, C.B. Миронов, В Л. Цирлов // Открытые системы-2005.-№12.

3. А. С. Марков, C.B. Миронов, B.JI. Цирлов. Выявление уязвимостей программного обеспечения в процессе сертификации. Таганрог. Известия ТРТУ №7, 2006. С 82-87

4. Грег Хоглунд, Гари Мак-Гроу. Взлом программного обеспечения: анализ и использование кода. Издательство: Вильяме, 2005 г. 400 стр. ISBN 5-8459-0785-3, 0-201-78695-8

5. С. Макконнелл. Ссовершенный код. Издательство: Питер, 2007 г.896 cip.ISBN 5-469-00822-3, 5-7502-0064-7

6. С VE and ССЕ Statistics Query Page Интернет. -peжимдocтyпahttp://web.nvd.nist.gov/view/vuln/statisticscвoбoдный

7. WASC Web Application Security Statistics 2008. Интернет. режим доступа http://www.scribd.c0m/d0c/21324267/WASC-Web-Application-Security-Statistics-2008-Russian, свободный.

8. Джеймс С. Фостер. Защита от взлома. Сокеты, shell-код, эксплойты. Издательство: ДМК Пресс, 2006 г.784 стр. ISBN 5-9706-0019-9, 1597490-05-9

9. Джеймс К. Фостер, Винсент Лю. Разработка средств безопасности и эксплойтов. Издательство: Питер, 2007 г.432 CTp.ISBN 978-5-91180422-0, 978-5-7502-0301-7, 1-59749-997-8

10. Steve Christey, Robert A. Martin. Vulnerability Type Distributions in CVE. Интернет. режим доступа http://cwe.mitre.org/documents/vuln-trends.html

11. П.Кен Ауэр, Рой Миллер. Экстремальное программирование -постановка процесса с первых шагов и до победного конца.Издательство: Питер, 2003 г.368 CTp.ISBN 5-318-00132-7

12. Фредерик Брукс. Мифический человекомесяц или как создаются программные системы.Издательство: Символ-Плюс, 2010 г.304 стр. ISBN 5-93286-005-7, 0-201-83595-9

13. Кент Бек. Экстремальное программирование разработка через тестирование.Издательство: Питер, 2003 r.ISBN 5-8046-0051-6, 0321-14653-0

14. J. Voas, "Fault Injection for the Masses," Computer, vol. 30, pp. 129— 130, 1997.

15. A. Avizienis, J.-C. Laprie, В. Randell, and C. Landwehr, "Basic Concepts and Taxonomy of Dependable and Secure Computing," Dependable and Secure Computing, vol. 1, pp. 11-33, 2004.

16. G. A. Kanawati, N. A. Kanawati, and J. A. Abraham, "FERRARI: A Flexible Software-Based Fault and Error Injection System," IEEE Transactions on Computers, vol. 44, pp. 248, 1995.

17. T. Tsai and R. Iyer, "FTAPE: A Fault Injection Tool to Measure Fault Tolerance," presented at Computing in aerospace, San Antonio; TX, 1995.

18. Корпорация «Майкрософт» и обеспечение безопасности: результаты изменения подхода к разработке продуктов. Интернет. режим доступаhttp://www.microsoft.com/rus/midsizebusiness/security/sdl.mspx, свободный.

19. Майкл Саттон, Адам Грин, ПедрамАмини. Fuzzing. Исследование уязвимостей методом грубой силы. Издательство: Символ-Плюс, 2009 г. 560 стр. ISBN 978-5-93286-147-9

20. Документация к системе ComRider/ Интернет. режим доступа http://labs.idefense.com/files/labs/releases/previews/CQMRaider/ свободный.

21. В.П Котляров., Т.В Коликова. Основы тестирования программного обеспечения. Учебное пособие. М. Интернет-университет информационных технологий, Бином. Лаборатория знаний, 2006 г.

22. Goodenough J.B., Gerhart S.L. Toward a Theory of Test Data Selection. IEEE Transactions on Software Engineering, 1975, SE-1, №2.

23. Борзов Ю.В., УртансГ.Бю, Шимаров B.A. Выбор путей программы для построения тестов // УСиМ. -1989.

24. Документация к системе Holodeck. Интернет. режим доступа http://www.securityinnovation.com/holodeck/index.shtml свободный.

25. Поискуязвимостейпосредствоманализаисполняемогокода. Динамическийанализ. Сб. трудовУШВсероссийской научной конференции студентов и аспирантов «Техническая кибернетика, радиоэлектроника и системы управления», Таганрог 2006. с. 333.

26. Благодаренко А.В. Статистический и динамический анализ программного обеспечения без исходных текстов ( тезисы доклада ).

27. Проблемы информационной безопасности в системе высшей школы: труды XIV всероссийской научной конференции.-М.:МИФИ, 2007. с. 33-34.

28. Благодаренко А.В. Полномаршрутное тестирование программного обеспечения без исходных кодов. Материалы XIV общероссийской научно-технической конференции Спб. «Методы и технические средства обеспечения безопасности информации». 2007. с. 31.

29. Chris Eagle. The IDA Pro Book: The Unofficial Guide to the World's Most Popular Disassembler. No Starch Press. ISBN: 1593271786. 632 p. 2008.

30. PedramAmini. Process Stalking. Run-time Visual Reverse Engineering. 1. // Интернет. peжимдocтyпahttp://dvlabs.tippingpoint.com/pub/pamini/ProcessStalkin gPedramAmini.pdf, свободный

31. А.С.Марков, В.Л.Цирлов. Аудит программного кода по требованиям безопасности / // InformationSecurity 2008 - №№2 и 3.

32. N. Jovanovic, Ch. Kruegel, Е. Kirda, "Pixy: A Static Analysis Tool for .Detecting Web Application Vulnerabilities".

33. V. Livshits, M. Lam, "Finding security errors in Java programs withstatic analysis", In Proceedings of the 14th Usenix Security Symposium, 2005.

34. AboutPREfastforDrivers. Интернет. -режим доступа http ://msdn.microsoft, com/en-us/windows/hardware/gg487345 свободный.

35. Stephen Johnson. Lint, а С program checker. Computer Science Technical Report 65, Bell Laboratories, December 1977.

36. Kolawa, Adam; Huizinga, Dorota. Automated Defect Prevention: Best Practices in Software Management. Wiley-IEEE Computer Society Press, pp. 426. ISBN 0470042125.2007.

37. Krill, Paul. "Coverity buys Solidware to boost code analysis". Интернет. режим доступа http://www.infoworld.com/cl/developer-world/coverity-buys-solidware-boost-code-analysis-596 Дата доступа 29.01.2011.

38. Страница проекта FlawFinder. Интернет. режим jocTynawww.dwheeler.com/flawfinder/ свободный.

39. John Viega, J.T. Bloch, Yoshi Kohno, Gary McGraw. ITS4: A Static Vulnerability Scanner for С and С++ Code. Reliable Software TechnologiesDulles, Virginia. 2000

40. Страница проекта RATS. Интернет. режим доступа https://www.fortify.com/ssa-elements/threat-intelligence/rats.html свободный.

41. PROTOSTest-Suite. Интернет. режим доступа www.ee.oulu.fi/research/ouspg/protos/testing/c05/http-reply/ свободный.

42. Allen Harper. Gray Hat Hacking The Ethical Hackers Handbook, 3rd Edition. McGraw-Hill Osborne Media. ISBN: 0071742557. 721 p.2011

43. Ari Takanen, Jared DeMott, Charlie Miller. Fuzzing for Software Security Testing and Quality Assurance. ARTECH HOUSE. ISBN 13: 978-1-59693-214-2. 312 p. 2008.

44. PedramAmini. PaiMei Reverse Engineering Framework. RECON2006. 2006.

45. Благодаренко A.B. Инструментальное средство для проведения сертификационных испытаний программного обеспечения без исходных кодов(статья). Известия ЮФУ. Технические науки. Тематический выпуск. Таганрог 2007, с. 212-215.

46. Гриффитс ApTyp.GCC. Полное руководство. Пре. с англ./Артур Гриффите. К: 000«ТИД «ДС», 2004. -624 с.

47. Microsoft РЕ and COFF Specification. Интернет. режим доступа http://msdn.microsoft.com/en-us/windows/hardware/gg463119 свободный.

48. Виктор Юров. Assembler. Специальный справочник. Издательство: Питер, ISBN 5-469-00003-6. 416 стр. 2004 г.

49. Intel® 64 and IA-32 Architectures Software Developer's Manual Volume ЗА: System Programming Guide, Part 1. Интернет . режим дocтyпahttp://www.intel.com/Assets/PDF/manual/253668■pdf свободный.

50. Intel® 64 and IA-32 Architectures Software Developer's Manual Volume 3B: System Programming Guide, Part 2. Интернет. -режимдоступаЬЦр ://www. intel .com/Assets/PDF/manual/253669.pdf свободный.

51. Фрэнк Харари. Теория графов. Издательство: Едиториал УРСС. ISBN: 5-354-00301-6. 296 с. 2003.

52. Ope. Теория графов. Издательство: Либроком, ISBN 978-5-39700044-4, 344 с. 2009 г.

53. Ключарев A.A., Матьяш В.А., Щекин C.B. Структуры и алгоритмы обработки данных: Учебное пособие. СПб.: ГУАП, 2003. - 172 с.

54. Е. Н. Долгова, А. В. Чернов. О некоторых задачах обратной инженерии. Труды Института системного программирования, Том 15, Москва 2008, стр. 119-134.

55. Callingconvention. Интернет. режим доступа http.7/ru.wikipedia.org/wiki/Calling convention свободный.

56. Крис Касперски, Ева Рокко. Искусство дизассемблирования. Издательство: БХВ-Петербург,ISBN 978-5-9775-0082-1, 896 с. 2008 г.

57. Джеффри Рихтер. Windows для профессионалов. Создание эффективных Win32-пpилoжeний с учетом специфики 64-разрядной версии Windows. Издательства: Питер, Русская Редакция. ISBN 5272-00384-5, 1-57231-996-8. 752 стр. 2008 г.

58. Greg Hoglund, Jamie Butler. Rootkits: Subverting the Windows Kernel. Addison-Wesley Professional. ISBN-10: 0321294319. 352 p. 2005.

59. Благодаренко A.B. Пассивный honeypot на анализе спутникового трафика( статья ). с 44-49. Сборник ЮФУ. Тематический выпуск. Информационная безопасность. Перспектива-2009. 2009. с 44-49.

60. NielsProvos, Thorsten Holz. Virtual Honeypots: From Botnet Tracking to Intrusion Detection. AddisonWesleyProfessional, 2007. 480 p.

61. Благодаренко A.B. Широковещательное распространение обновлений безопасности для ОС Linux через спутниковый канал( статья ). Сборник ЮФУ. Тематический выпуск. Информационная безопасность. Перспектива-2009. 2009. с 210-214.

62. Digital Video Broadcasting (DVB) Interaction channel for satellite distribution systems. European Standart (Telecommunications series). ETSIEN301 709 v 1.5.1 (2009-5)

63. Экономим трафик (и время) deltup-ом. URL:http://thinkit.ru/blog/viewblog/391/ (дата обращения: 18.05.2009 ).

64. Nicholas Nethercote. Dynamic Binary Analysis and Instrumentation Электронныйресурс. -Режимдоступа: http://valgrind.org/docs/phd2004.pdf, свободный

65. С. Cowan, S. Beattie, J. Johansen, and P. Wagle. Point-Guard: Protecting pointers from buffer overflow vulnerabilities. In 12th USENIX Security Symposium, 2003.

66. C. Cowan, M. Barringer, S. Beattie, and G. Kroah-Hartman. FormatGuard: automatic protection from printf format string vulnerabilities. InProceedingsofthe 10th USENIX SecuritySymposium, August 2001.

67. James Newsome, Dawn Song. Dynamic Taint Analysis for Automatic Detection, Analysis, and Signature Generation of Exploits on Commodity Software. In Proceedings of the Network and Distributed System Security Symposium, 2005

68. Страница проекта Microsoft ¡exploitable, http://msecdbg.codeplex.com.1. Датадоступа 1.05.2011.

69. Abouchaev, Adel; Hasse, Damian; Lambert, Scott; Wroblewski, Greg. Analyze crashes to find security vulnerabilities in your apps.

70. Rodrigo RubiraBranco. Dynamic Program Analysis and Software Exploitation. 2010.

71. In-memory fuzzing. Corelan team. Интернет. -режим доступа http://www.corelan.be/index.php/2010/10/20/in-memory-fuzzing/?output=pdf свободный.