Американский Fuzzy Lop (программное обеспечение)
![]() afl-fuzz от American Fuzzy Lop работает в тестовой программе | |
Разработчик(и) | Михал Залевски |
---|---|
Первоначальный выпуск | 12 ноября 2013 г |
Стабильная версия | 2.57б / 30 июня 2020 г [1] |
Репозиторий | |
Написано в | С , сборка |
Операционная система | Кросс-платформенный |
Тип | Фаззер |
Лицензия | Лицензия Апач 2.0 |
Веб-сайт | лкамтуф ![]() |
American Fuzzy Lop ( AFL ), стилизованный строчными буквами под american fuzzy lop , представляет собой бесплатный программный фаззер , который использует генетические алгоритмы для эффективного увеличения покрытия кодом тестовых случаев . На данный момент он обнаружил десятки серьезных ошибок программного обеспечения в крупных проектах бесплатного программного обеспечения, включая X.Org Server , [2] PHP , [3] OpenSSL , [4] [5] PNGCrush , Баш , [6] Фаерфокс , [7] СВЯЗЫВАТЬ , [8] [9] Кт , [10] и SQLite . [11]
В течение многих лет после своего выпуска AFL считался «современным» фаззером. [12] AFL считается «стандартом де-факто фаззинга». [13] а выпуск AFL внес значительный вклад в развитие фаззинга как области исследований. [14] AFL широко используется в научных кругах; Академические фаззеры часто являются ответвлениями AFL, а AFL обычно используется в качестве основы для оценки новых методов. [15] [16]
Исходный код американского fuzzy lop опубликован на GitHub . Его название является отсылкой к породе кроликов American Fuzzy Lop .
Обзор
[ редактировать ]AFL требует от пользователя предоставить пример команды, запускающей тестируемое приложение, и хотя бы один небольшой пример входных данных. Входные данные могут быть переданы в тестируемую программу либо через стандартный ввод, либо в виде входного файла, указанного в командной строке процесса. Фаззинг сетевых программ в настоящее время напрямую не поддерживается, хотя в некоторых случаях существуют возможные решения этой проблемы. [17] Например, в случае аудиоплеера American fuzzy lop можно дать указание открыть с его помощью короткий звуковой файл. Затем фаззер пытается фактически выполнить указанную команду, и если это удается, он пытается уменьшить входной файл до наименьшего размера, вызывающего такое же поведение.
После этого начального этапа AFL начинает фактический процесс фаззинга, применяя различные модификации к входному файлу. Когда тестируемая программа выходит из строя или зависает , это обычно означает обнаружение новой ошибки, возможно, уязвимости безопасности . В этом случае измененный входной файл сохраняется для дальнейшей проверки пользователем.
Чтобы максимизировать производительность фаззинга, American fuzzy lop ожидает, что тестируемая программа будет скомпилирована с помощью служебной программы , которая оснащает код вспомогательными функциями, которые отслеживают поток управления . Это позволяет фаззеру определять, когда поведение цели меняется в ответ на вводимые данные. В случаях, когда это невозможно, тестирование «черного ящика» также поддерживается .
Алгоритм фаззинга
[ редактировать ]
Фаззеры пытаются обнаружить неожиданное поведение (т. е. ошибки ) в целевой программе, многократно выполняя программу на различных входных данных. Как описано выше, AFL представляет собой фаззер серого ящика , то есть он внедряет инструменты для измерения покрытия кода в целевую программу во время компиляции и использует метрику покрытия для управления генерацией новых входных данных. Алгоритм фаззинга AFL повлиял на многие последующие фаззеры серого ящика. [19] [20]
Входными данными для AFL являются инструментированная целевая программа ( тестируемая система ) и корпус , то есть набор входных данных для целевой системы. Входные данные также известны как тестовые примеры . Алгоритм поддерживает очередь входных данных, которая инициализируется для входного корпуса. Общий алгоритм работает следующим образом: [21]
- Загрузите следующий ввод из очереди
- Минимизируйте тестовый пример
- Измените тестовый пример. Если какой-либо мутант приводит к дополнительному покрытию кода, добавьте его в очередь. Если мутант приводит к сбою или зависанию, сохраните его на диск для последующей проверки.
- Перейти к шагу 1
Мутация
[ редактировать ]Для создания новых входных данных AFL применяет различные мутации к существующим входным данным. [22] Эти мутации в основном не зависят от формата ввода целевой программы; они обычно рассматривают входные данные как простой блок двоичных данных.
Сначала AFL применяет детерминированную последовательность мутаций к каждому входу. Они применяются при различных смещениях на входе. Они включают в себя: [23] [24]
- Переворот (т.е. отрицание или инвертирование) 1–32 бита
- Увеличение и уменьшение 8-, 16- и 32-битных целых чисел с прямым, так и с прямым порядком байтов. как в кодировке
- Перезапись частей входных данных «примерно двумя дюжинами «интересных» значений», включая ноль, а также максимальное и минимальное целые числа со знаком и без знака различной ширины, опять же как в кодировке с прямым, так и с прямым порядком байтов .
- Замена частей входных данных данными, взятыми из «словаря» заданных пользователем или автоматически обнаруженных токенов (например, магических байтов или ключевых слов в текстовом формате). [25] [22] [26]
После применения всех доступных детерминированных мутаций AFL переходит к этапу хаоса — стадии, на которой подряд применяется от 2 до 128 мутаций. Эти мутации являются любыми из: [22]
- Детерминированные мутации, описанные выше.
- Перезапись байтов случайными значениями
- Операции над многобайтовыми «блоками»:
- Удаление блоков
- Дублирование блоков
- Установка каждого байта в блоке в одно значение
Если AFL циклически проходит всю очередь, не генерируя никаких входных данных, обеспечивающих новое покрытие кода, он начинает сращивание . Сращивание берет два входных данных из очереди, усекает их в произвольных позициях, объединяет их вместе и применяет к результату стадию хаоса.
Измерение охвата
[ редактировать ]Компания AFL стала пионером в использовании группированного количества обращений для измерения покрытия кода. [27] Автор утверждает, что этот метод смягчает взрыв пути . [28] [29]
Концептуально, AFL подсчитывает количество раз, когда данное выполнение цели пересекает каждое ребро в графе потока управления цели ; в документации эти ребра называются кортежами , а счетчики — счетчиками посещений . В конце выполнения счетчики попаданий в объединяются следующие восемь сегментов: 1, 2, 3, 4–7, 8–15, 16–31, 32–127 и 128 и выше. AFL поддерживает глобальный набор пар (кортеж, количество интервалов), которые были созданы в результате любого выполнения на данный момент. Входные данные считаются «интересными» и добавляются в очередь, если они создают пару (кортеж, количество интервалов), которой еще нет в глобальном наборе.
На практике счетчики посещений собираются и обрабатываются с использованием эффективной схемы, но с потерями . Инструментарий времени компиляции внедряет код, концептуально похожий на следующий, в каждую ветвь графа потока управления целевой программы: [30]
cur_location = <COMPILE_TIME_RANDOM>;shared_mem[cur_location ^ prev_location]++;prev_location = cur_location >> 1;
где <COMPILE_TIME_RANDOM>
является случайным целым числом и shared_mem
размером 64 килобайта, — это область памяти совместно используемая фаззером и целью.
Это представление является более детальным (различает большее количество выполнений), чем простое покрытие блоков или операторов, но все же позволяет проводить проверку «интересности» в линейном времени.
Минимизация
[ редактировать ]Предполагая, что меньшие входные данные требуют меньше времени для выполнения, AFL пытается минимизировать или сократить тестовые примеры в очереди. [22] [31] Обрезка работает путем удаления блоков из ввода; если усеченный ввод по-прежнему дает то же покрытие (см. #Измерение покрытия ), то исходный ввод отбрасывается, а усеченный ввод сохраняется в очереди.
Планирование
[ редактировать ]![]() | Этот раздел нуждается в расширении . Вы можете помочь, добавив к нему . ( февраль 2023 г. ) |
AFL выбирает из очереди подмножество предпочтительных входных данных, неприоритетные входные данные с некоторой вероятностью пропускаются. [32] [27]
Функции
[ редактировать ]Характеристики производительности
[ редактировать ]Одна из проблем, которую пришлось решить американскому нечеткому циклу, заключалась в эффективном запуске сотен процессов в секунду. Помимо оригинального движка, который создавал каждый процесс с нуля, American fuzzy lop предлагает движок по умолчанию, который в значительной степени зависит от fork
системный вызов. [33] [27] Это можно еще ускорить, используя режим отложенного разветвления LLVM или аналогичный постоянный режим, но это происходит за счет необходимости изменения тестируемой программы. [34] Кроме того, американский fuzzy lop поддерживает фаззинг одной и той же программы по сети.
Пользовательский интерфейс
[ редактировать ]American fuzzy lop имеет красочный интерфейс командной строки , который в реальном времени отображает статистику процесса фаззинга. Различные настройки могут быть вызваны либо параметрами командной строки, либо переменными среды . Кроме того, программы могут считывать статистику времени выполнения из файлов в машиночитаемом формате.
Утилиты
[ редактировать ]В дополнение к afl-fuzz
и инструменты, которые можно использовать для двоичного измерения, American fuzzy lop включает служебные программы, предназначенные для мониторинга процесса фаззинга. Помимо этого, существует afl-cmin
и afl-tmin
, который можно использовать для минимизации тестовых примеров и набора тестов. Это может быть полезно, когда тестовые примеры, сгенерированные afl-fuzz
будет использоваться другими фаззерами.
Вилки
[ редактировать ]AFL много раз разветвлялся с целью изучения новых методов фаззинга или применения фаззинга к различным типам программ. Несколько примечательных форков включают в себя:
- АФЛ++
- МОРТ-АФЛ [35]
- МОЩНОСТЬ Быстрая [36]
- АФЛСмарт [37]
- AFLGo [38]
- СимCC-AFL [39]
- WinAFL, «вилка AFL для фаззинга двоичных файлов Windows» [40]
АФЛ++
[ редактировать ]Первоначальный выпуск | 2.52c / 5 июня 2019 г |
---|---|
Стабильная версия | 4.08с / 10 августа 2023 г [41] |
Репозиторий | |
Веб-сайт | афлплюс ![]() |
AFL++ ( AFLplusplus ) [42] это поддерживаемая сообществом версия AFL, созданная из-за относительного бездействия Google в разработке AFL с сентября 2017 года. Она включает в себя новые функции и ускорения. [43]
Инициатива Google OSS-Fuzz, которая предоставляет бесплатные услуги фаззинга для программного обеспечения с открытым исходным кодом, заменила вариант AFL на AFL++ в январе 2021 года. [44] [45]
Ссылки
[ редактировать ]Примечания
[ редактировать ]- ^ «Релизы — google/AFL» . Получено 19 января 2021 г. — через GitHub .
- ^ «Рекомендация-17.03.2015» . х.орг .
- ^ «НВД – Деталь» . nist.gov .
- ^ «НВД – Деталь» . nist.gov .
- ^ «НВД – Деталь» . nist.gov .
- ^ «CVE-CVE-2014-6278» . mitre.org .
- ^ «CVE-CVE-2014-8637» . mitre.org .
- ^ «Как фаззить сервер с помощью American Fuzzy Lop» . Быстро . 21 июля 2015 г.
- ^ «CVE-CVE-2015-5477» . mitre.org .
- ^ «[Объявление] Рекомендации по безопасности проекта Qt — многочисленные уязвимости в обработке формата изображений Qt» . qt-project.org . 13 апреля 2015 г.
- ^ «Как тестируется SQLite # 4.1.1. SQL Fuzz с использованием американского Fuzzy Lop Fuzzer» . sqlite.org .
- ^ Понселе, Клеман; Сагонас, Константинос; Цифтес, Николас (5 января 2023 г.). «Так много фаззеров, так мало времени✱» . Материалы 37-й Международной конференции IEEE/ACM по автоматизированной разработке программного обеспечения . АСЭ '22. Нью-Йорк, штат Нью-Йорк, США: Ассоциация вычислительной техники. стр. 1–12. дои : 10.1145/3551349.3556946 . ISBN 978-1-4503-9475-8 . S2CID 253456740 .
- ^ Фиоральди и др. 2023 , с. 2.
- ^ Фиоральди, Андреа; Майер, Доминик Кристиан; Чжан, Дунцзя; Бальзаротти, Давиде (7 ноября 2022 г.). «ЛибАФЛ» . Материалы конференции ACM SIGSAC 2022 года по компьютерной и коммуникационной безопасности . ККС '22. Нью-Йорк, штат Нью-Йорк, США: Ассоциация вычислительной техники. стр. 1051–1065. дои : 10.1145/3548606.3560602 . ISBN 978-1-4503-9450-5 . S2CID 253410747 . . «Выпуск AFL ознаменовал важную веху в области тестирования безопасности программного обеспечения, возродив фаззинг как основную тему исследований».
- ^ Хазиме, Ахмад; Эррера, Адриан; Пайер, Матиас (15 июня 2021 г.). «Магма: эталон фаззинга на основе истины» . Труды АКМ по измерению и анализу вычислительных систем . 4 (3): 49:1–49:29. arXiv : 2009.01120 . дои : 10.1145/3428334 . S2CID 227230949 .
- ^ Мецман и др. 2021 .
- ^ Технион. «Фаззинг nginx — Охота на уязвимости с помощью afl-fuzz» . lolware.net .
- ^ Залевский, Михал (27 февраля 2015 г.). «Логотип для afl-fuzz» . afl-пользователи | Группы Google . Проверено 25 июля 2019 г.
- ^ Фиоральди и др. 2023 .
- ^ Чен, Пэн; Чен, Хао (май 2018 г.). «Ангора: эффективный фаззинг посредством принципиального поиска» . Симпозиум IEEE по безопасности и конфиденциальности (SP) 2018 года . стр. 711–725. дои : 10.1109/SP.2018.00046 . ISBN 978-1-5386-4353-2 . S2CID 3729194 .
- ^ «Мотивация AFL — документация AFL 2.53b» . afl-1.readthedocs.io . Проверено 26 февраля 2023 г.
- ^ Jump up to: а б с д Фиоральди и др. 2023 , с. 6.
- ^ «Стратегии бинарного фаззинга: что работает, что нет» . lcamtuf.blogspot.com . 8 августа 2014 г.
- ^ «Руководство пользователя AFL — документация AFL 2.53b» . afl-1.readthedocs.io . Проверено 26 февраля 2023 г.
- ^ «Найти ошибки в SQLite: простой способ» . lcamtuf.blogspot.com . 14 апреля 2015 г.
- ^ Манес, Валентин Ж.М.; Хан, ХёнСок; Хан, Чунгу; Ча, Санг Киль; Эгеле, Мануэль; Шварц, Эдвард Дж.; Ву, Маверик (ноябрь 2021 г.). «Искусство, наука и техника фаззинга: обзор» . Транзакции IEEE по разработке программного обеспечения . 47 (11): 2312–2331. arXiv : 1812.00140 . дои : 10.1109/TSE.2019.2946563 . ISSN 1939-3520 . S2CID 102351047 .
- ^ Jump up to: а б с Фиоральди и др. 2023 , с. 5.
- ^ «Технический документ» по afl-fuzz .
- ^ «Подробнее об AFL — документация AFL 2.53b» . afl-1.readthedocs.io . Проверено 27 февраля 2023 г. «Этот подход позволяет проводить очень детальное и долгосрочное исследование состояния программы, не требуя при этом выполнения каких-либо ресурсоемких и хрупких глобальных сравнений сложных трассировок выполнения и избегая при этом проблемы взрыва пути».
- ^ «Подробнее об AFL — документация AFL 2.53b» . afl-1.readthedocs.io . Проверено 27 февраля 2023 г.
- ^ «Подробнее об AFL — документация AFL 2.53b» . afl-1.readthedocs.io . Проверено 27 февраля 2023 г.
- ^ «Подробнее об AFL — документация AFL 2.53b» . afl-1.readthedocs.io . Проверено 27 февраля 2023 г.
- ^ «Фаззинг случайных программ без execve()» . lcamtuf.blogspot.com . 14 октября 2014 г.
- ^ «Новое в AFL: постоянный режим» . Блог lcamtuf . 11 июня 2015 г.
- ^ Хан; Бея, Рахим (2019) : Оптимизированное планирование мутаций для фаззеров , стр. 1949–1966. Лю, Чэньян; Чжан, Чао; Ли, Вэй - 978-1-939133-06-9 .
- ^ Бёме, Марсель; Фам, Ван-Туан; Ройчудри, Абхик (май 2019 г.). «Фаззинг серого ящика на основе покрытия как цепь Маркова» . Транзакции IEEE по разработке программного обеспечения . 45 (5): 489–506. дои : 10.1109/TSE.2017.2785841 . ISSN 1939-3520 .
- ^ Фам, Ван-Туан; Бёме, Марсель; Сантоса, Эндрю Э.; Кэчулеску, Александр Рэзван; Ройчудри, Абхик (сентябрь 2021 г.). «Умный фаззинг Greybox» . Транзакции IEEE по разработке программного обеспечения . 47 (9): 1980–1997. дои : 10.1109/TSE.2019.2941681 . ISSN 1939-3520 . S2CID 53721813 .
- ^ Бёме, Марсель; Фам, Ван-Туан; Нгуен, Мань-Дунг; Ройчудри, Абхик (30 октября 2017 г.). «Направленный фаззинг серого ящика» . Материалы конференции ACM SIGSAC 2017 по компьютерной и коммуникационной безопасности . ККС '17. Нью-Йорк, штат Нью-Йорк, США: Ассоциация вычислительной техники. стр. 2329–2344. дои : 10.1145/3133956.3134020 . ISBN 978-1-4503-4946-8 . S2CID 29430742 .
- ^ Поплау, Себастьян; Франсильон, Орельен (2020). Символическое выполнение с помощью {SymCC}: не интерпретируйте, а компилируйте! . стр. 181–198. ISBN 978-1-939133-17-5 .
- ^ WinAFL , Google Project Zero, 23 февраля 2023 г. , получено 26 февраля 2023 г.
- ^ «Релизы — AFLplusplus/AFLplusplus» . Получено 1 ноября 2023 г. — через GitHub .
- ^ Фиоральди, Андреа; Майер, Доминик; Айсфельдт, Хайко; Хойзе, Марк (август 2020 г.). AFL++: Объединение дополнительных этапов фаззингового исследования . 14-й семинар USENIX по наступательным технологиям (WOOT 20).
- ^ «Среда фаззинга AFL++» . АФЛплюсплюс .
- ^ Мецман, Джонатан. «[afl++] Используйте AFL++ вместо AFL для фаззинга. автор jonathanmetzman · Pull Request #5046 · google/oss-fuzz» . Гитхаб .
- ^ Мецман и др. 2021 , с. 1394.
Источники
[ редактировать ]- Фиоральди, Андреа; Мантовани, Алессандро; Майер, Доминик; Бальзаротти, Давиде (20 января 2023 г.). «Анализ американского Fuzzy Lop – оценка FuzzBench» . Транзакции ACM по программной инженерии и методологии . 32 (2): 1–26. дои : 10.1145/3580596 . ISSN 1049-331X . S2CID 247088398 .
- Мецман, Джонатан; Секереш, Ласло; Саймон, Лоран; Спраберы, Читать; Арья, Абхишек (18 августа 2021 г.). «FuzzBench: открытая платформа и сервис для сравнительного анализа фаззеров» . Материалы 29-го совместного заседания ACM по Европейской конференции по разработке программного обеспечения и симпозиума по основам программной инженерии . ESEC/FSE 2021. Нью-Йорк, штат Нью-Йорк, США: Ассоциация вычислительной техники. стр. 1393–1403. дои : 10.1145/3468264.3473932 . ISBN 978-1-4503-8562-6 . S2CID 237205274 .
Дальнейшее чтение
[ редактировать ]- Технический документ AFL , написанный первоначальным автором Михалом Залевским.
- Пособия по мультисистемной и интернет-безопасности, серия Hors № 11 «Утилиты безопасности», стр. 36, «American Fuzzy Lop», Кевин Денис, июнь 2015 г. [1] Архивировано 6 мая 2016 г., в Wayback Machine.
- «Фузз и струны (lwn.net)»
- «Фаззинг (on) FreeBSD — (в основном) автоматическое обнаружение ошибок с помощью security/afl» — презентация на FOSDEM
- «Тестирование с двумя ракетами, ищущими отказ: фаззинг и тестирование на основе свойств» — презентация на EuroPython 2015.
- «Проект Фаззинг»
- «Фаззинг кода с помощью AFL», Питер Гутманн, ;login, Vol. 41, № 2, Лето 2016, [2]
Внешние ссылки
[ редактировать ]- Официальная документация AFL
- Блог Михала Залевского , автора AFL. В блоге есть несколько статей, посвященных техническим деталям AFL.