https://habr.com/ru/companies/yadro/articles/981842/
Меня зовут Арина Волошина, я AppSec-инженер в YADRO и занимаюсь тестированием безопасности телеком-продуктов: базовой станции, контроллера базовых станций и системой управления элементами сети. Мы внедрили много разных видов тестирования в эти продукты, но этого оказалось недостаточно. В своих научных исследованиях я занималась генетическими алгоритмами, поэтому решила применить академические знания на практике и реализовать генетику в фаззинге.
...
Применять фаззинг в любой большой системе, как и в телекоме, можно к разным ее компонентам: веб-интерфейсам, конфигурациям и настройкам сети, точечно к коду, разным обвязкам над функциями обработки сигналов и так далее.
Мы выбрали более продуктовый, реалистичный, но сложный подход — фаззинг по сети. В этом сценарии мы поднимаем приложение или эмуляторы, запускаем фаззинг сообщений, которыми общаются устройства, построенные по различным телеком-протоколам, и проверяем, как система реагирует.
...
Особенности реализации
- Для реализации фаззинга мы выбрали язык C как наиболее удобный, потому что большинство инструментов фаззинга написано как раз под него.
- AFLNet используется в качестве основы для поддержания сессии общения между устройствами и отправки сообщений.
- Чтобы минимизировать ручной разбор спецификаций и не тратить лишнее время на детали, мы применяем автоматический протокольный парсинг, для которого в AFLnet была встроена функция поддержки.
- Проект собирается под компилятор afl-gcc, что позволяет считать тестовое покрытие.
- Наконец, нужна аутентификация, чтобы контроллер не отбросил нас на первом же шаге, а воспринял как реальную базовую станцию. Это позволяет полностью воспроизвести корректный сценарий установления связи.
Пост большой, далее в нём идёт конкретика реализации самого фаззинга, поэтому всем кто хочет приобщиться к подробностям рекомендую сходить по ссылке.
Сложности с инфраструктурой и обучаемостью
Все проблемы, которые мы выявили, можно разделить на две части. Первая связана с инфраструктурой — думаю, многие, кто занимался тестированием или фаззингом, с этим сталкивались. Вторая часть касается непосредственно генетического алгоритма.
Инфраструктура
Проблемы с инфраструктурой связаны с тем, что у нас большое приложение со множеством зависимостей. Запуск даже его части оказывается затратным, и постоянный перезапуск приложения для сбора покрытия кода сильно замедляет процесс. Кроме того, нужно поддерживать сессию.
Обучаемость
Обучаемость — вторая часть сложностей. Обратная связь часто оказывается плохо интерпретируемой, и возникает вопрос, как заставить алгоритм корректно понимать наши ожидания. Хорошее решение — максимально усложнить фитнес-функцию: учитывать не только сигнатуры, но и поведенческие признаки, добавлять дополнительные факторы и расширять набор критериев, которые входят в оценку.


