Тема: Разработка фаззера для языков C/C++ на основе универсальной фаззинг платформы
Закажите новую по вашим требованиям
Представленный материал является образцом учебного исследования, примером структуры и содержания учебного исследования по заявленной теме. Размещён исключительно в информационных и ознакомительных целях.
Workspay.ru оказывает информационные услуги по сбору, обработке и структурированию материалов в соответствии с требованиями заказчика.
Размещение материала не означает публикацию произведения впервые и не предполагает передачу исключительных авторских прав третьим лицам.
Материал не предназначен для дословной сдачи в образовательные организации и требует самостоятельной переработки с соблюдением законодательства Российской Федерации об авторском праве и принципов академической добросовестности.
Авторские права на исходные материалы принадлежат их законным правообладателям. В случае возникновения вопросов, связанных с размещённым материалом, просим направить обращение через форму обратной связи.
📋 Содержание
Постановка задачи 5
1. Обзорный раздел по предметной области 6
1.1. Фаззинг 6
1.2. LLVM 7
1.3. Универсальная фаззинг платформа 7
1.4. Аналоги 8
1.5. Обзор литературы 10
1.5.1 PolyFuzz: Holistic Greybox Fuzzing of Multi-Language
Systems 10
1.6. Вывод 11
2. Программная реализация 12
2.1. Основные компоненты 12
2.2. Реализация предобработчика исходного кода 12
2.2.1 Реализация LLVM Pass 13
2.2.2 Встраивание LLVM Pass в систему сборки CMake . . . 14
2.3. Реализация протокола обмена данными 17
2.4. Реализация исполнителя C++ 18
2.5. Реализация исполнителя Java 19
2.6. Пример использования 19
3. Тестирование 22
3.1. Функция isPalindrome 22
3.2. Выводы 24
3.3. Дальнейшей развитие 24
Заключение 26
Список литературы 27
📖 Введение
Почти всегда необходимо не только установить факт того, что программа выдаёт неправильный результат, не завершает исполнение или завершается аварийно, но так же и определить набор входных данных, на которых это произошло. Для этого часто используют фаззинг.
Фаззинг - метод тестирования программного обеспечения, который основан на генерации входных данных для тестируемого программного обеспечения. Фаззеры стараются генерировать такие данные, которые скорее всего выявят проблемы в программе: заведомо некорректные данные, данные неверного формата, краевые случаи данных.
Для генерации новых данных часто используется уже готовый корпус тестовых случаев. Его загружают перед стартом фаззинга и в дальнейшем к нему применяют различные мутации, комбинируют тестовые данные друг с другом, чтобы получить новые входные данные. Для мутаций часто используют случайные величины, эвристики, но нередко и машинное обучение.
После генерации данные передаются на вход тестируемой программе. Поведение программы анализируется: собирается информация о том, по какому пути пошло исполнение программы, завершилась ли программа аварийно, каков результат выполнения программы. Эти данные передаются фаззеру и на их основе принимается решение о том, как продолжать фаззинг и генерировать новые тестовые случаи.
Таким образом, фаззер состоит из двух независимых частей. В первой части происходит генерация и обработка данных об исполнении программы. Во второй части происходит непосредственно запуск программы на переданных входных данных.
Часто обе части разрабатываются вместе для фаззинга программ на одном из языков программирования:
1. LibFuzzer [1] — фаззер для C/C++.
2. Jsfuzz [3] — фаззер для JavaScript.
Разработка общей фаззинг платформы позволила бы не реализовывать алгоритм фаззинга для каждого языка. Чтобы применить платформу к новому языку программирования, достаточно было бы реализовать вторую часть фаззера для этого языка, которая запускает программу и собирает информацию об исполнении.
✅ Заключение
1. Проведён обзор уже существующих решений для фаззинга программ на C/C++. Были изучены аналоги, позволяющие проводить фаззинг программ на нескольких языках программирования.
2. Разработан исполнитель C++ — программный аппарат для запуска программ, написанных на C/C++. Реализована возможность собирать данные об исполнении программы.
3. Разработан протокол для обмена данными между исполнителем Java и исполнителем C++.
4. Разработан исполнитель Java — программный аппарат для запуска универсальной фаззинг платформы и передачи ей данных об исполнении программы.
5. Разработанный фаззер был сравнён с аналогами.



