
- •Томский государственный университет систем управления и радиоэлектроники (тусур)
- •Обзор уязвимостей программной части. Способы их обнаружения и устранения
- •Содержание
- •1 Введение
- •2 Классификация уязвимостей
- •3 Методы обнаружения уязвимостей
- •3.1 Ручной поиск
- •3.2 Поиск по шаблонам
- •3.3 Фазинг
- •4 Способы устранения уязвимостей
- •4.1 Корректировка исходных кодов программ
- •4.2 Использование неисполняемых буферов
- •4.3 Применение проверок выхода за границы
- •4.4 Решение проблемы неинициализированных данных
- •4.5 Защита от sql-инъекций
- •4.6 Защита от xss-инъекций
- •4.7 Шифрование паролей
- •Заключение
- •Список использованных источников
3.3 Фазинг
На стыке методов структурного и функционального тестирования находится метод «серого ящика». При тестировании данным методом исследователь не имеет полной спецификации программы и исходных кодов, как это бывает при тестировании методом «белого ящика», однако знаний о системе больше чем при тестировании методом «черного ящика».
Часто подразумевается, что знание о тестируемом ПО получаются в ходе реверсивной инженерии [3]. На основе полученных таким путем знаний планируется и выполняется ряд мероприятий по тестированию ПО – динамический анализ.
В последнее время приобретает популярность разновидность метода тестирования «серого ящика», которое получило название фаззинг (fuzzing). Термин не так давно вошел в обиход и поэтому присутствует далеко не во всех словарях. Самое близкое значение термина «анализ граничных значений» – определение доступных диапазонов входных значений программы и тестирование значений, которые выходят за этот диапазон либо находятся на границе. Фаззинг отличается тем, что не ограничивает свое внимание на граничных значениях, но так же занимается подготовкой входных данных специального вида.
В зависимости от метода генерации данных принято разделять подход к фаззингу на два класса:
Мутация данных. Новые данные получаются за счет незначительных изменений существующих данных.
Генерирование данных. Данные подготавливаются «с нуля» на основе протоколов или в соответствие с заданными правилами.
Следующие типы фаззинга, так или иначе, относятся к одному из вышеперечисленных классов:
Использование заранее подготовленных тестовых данных. Используется для тестирования реализаций протоколов. Вместе с формальным описанием протокола разработчик может подготовить ряд тестовых данных, которые должны соответствующим образом обрабатываться программой, реализующей протокол;
Использование случайных данных. Это наименее эффективный из возможных подходов. Целевой программе передается большое количество случайных данных. При возникновении сбоя очень сложно определить настоящую ее причину.
Ручное изменение данных протокола. Исследователю известен протокол и он пытается добиться аномального поведения исследуемого ПО за счет внесения ошибочных данных. За счет отсутствия автоматизации мало эффективен.
Полный перебор мутаций данных, подготовленных в соответствие с протоколом. Подход уменьшает объем тестов за счет использования знаний о протоколе. Однако в данные вносятся все возможные мутации и за счет этого объем данных велик.
Осознанное внесение изменение в данные подготовленные в соответствие с протоколом. Для проведения данного вида тестирования должны быть проведены дополнительные исследования с целью определения, какие части данных должны оставаться константными, а какие изменяться. Подход является наиболее интеллектуальным, однако увеличивается затрата времени исследователя.
По типу воздействия фазеры можно разделить на несколько классов: локальные, удаленные, в памяти и универсальные.
Локальные фаззеры делятся на следующие типы:
Фаззеры командной строки. Используются для выявления ошибок, связанных с разбором входных параметров программ.
Фаззеры переменных окружения. Используются для выявления ошибок, связанных с обработкой данных, получаемых через переменные окружения.
Фаззеры файлов. Используются для тестирования программного обеспечения, принимающего файлы в качестве входных данных.
Удаленные фаззеры бывают следующих типов:
Фаззеры сетевых протоколов. В зависимости от сложности протокола применяются фазеры соответствующей сложности;
Фазеры web-приложений. Получили особую актуальность с развитием Web 2.0.
Фазеры web-браузеров. Тестируется правильность разбора, как HTML-тэгов, так и других поддерживаемых расширений. Особо стоит выделить фазеры com-объектов поддерживаемых браузерами.
Фаззинг в памяти напрямую воздействует на точки ввода данных в код, минуя средства доставки данных. Методика требует более детального разбора и по этой причине описана в отдельном пункте.
Под универсальными фаззерами здесь понимается инструментарий для быстрой разработки инструментов фаззинга (fuzzing framework). Такой инструментарий должен содержать в себе примитивы для генерации входных данных, а так же для их внедрения. На их основе может быть разработан фаззер необходимой конфигурации.