

C августа 2024 года проектом OSS-Fuzz зарегистрировано не менее 750 подтверждённых уязвимостей в open-source-компонентах. Не менее 20 исправлений десятков уязвимостей в них за этот же период внесено Центром исследования безопасности системного ПО, сформированным при участии отечественных экспертов.
Эти цифры объединяет одно: данные уязвимости выявлены видом динамического анализа кода под названием «фаззинг». Тестировщики, которые впервые с ним знакомятся, ассоциируют его с анализом граничных значений, оценкой на основе эквивалентных классов, тестированием property-based. Действительно, эти виды тестирования отчасти покрываются в ходе фаззинга, но всплывают и нюансы, которые делают процедуру не такой уж и простой.
ФАЗЗИНГ: ЧТО ЭТО?
Фаззинг — подход к анализу кода во время его исполнения, основанный на оценке работы программы в ответ на подачу на вход множества невалидных значений. Гибкость в его проведении достигается широкими возможностями:
Большой ассортимент существующих инструментов, фаззеров, «даёт разгуляться». Однако такая вариативность создаёт определённую сложность в реализации фаззинг-тестирования.
С ЧЕГО НАЧАТЬ?
Простой фаззинг можно запустить «на коленке», достаточно определить цель. В таком случае проще получить генерационный фаззинг чёрного ящика: входные семплы генерируются случайно, информации о покрытии кода нет, целью выступает конечный исполняемый процесс, который можно запустить и вручную. Такой подход является примитивом к фаззингу веб-приложений: программа-клиент отправляет на сервер запросы, в их содержимое подставляются случайные данные. Результат ожидаемо «сырой»: искать «вредные» семплы необходимо самостоятельно.
К ЧЕМУ СТРЕМИТЬСЯ?
Освоение мутационного фаззинга серого ящика удобно начать с формирования на базе юнит-тестов «фаззинг-обёрток» — программ, вызывающих исследуемый код и подающих на вход данные от фаззера. Интересными целями выступают библиотечные функции: строкочувствительные, утилитарные, с высокой цикломатической сложностью, парсеры, десериализаторы и т. п. Их тест завязан на трёх элементах:
Дополнить процесс можно:
Работа фаззера сводится к увеличению числа уникальных путей исполнения кода. Но следует помнить, что важен не только конечный уровень покрытия, но и общее число запусков цели. А для повышения эффективности поиска дефектов процесс дополняют средствами отлова ошибок — санитайзерами, фиксирующими отклонения от штатного выполнения программы.
ИГРА СТОИТ СВЕЧ
Внедрение фаззинга берёт начало от крупных игроков ИТ-индустрии и вызвано стремлением к повышению качества и безопасности продуктов: фаззинг давно доказал свою эффективность в поиске багов и уязвимостей. Ясна и риторика регулятора: искать ошибки нужно уметь, особенно если речь идёт о том, что действительно важно, и фаззинг — эффективный способ для этого.
Отправляя данную форму вы соглашаетесь с политикой конфиденциальности персональных данных
Отправляя данную форму вы соглашаетесь с политикой конфиденциальности персональных данных