Фаззинг на пальцах. Часть 1: идея, техника и мера
О чем вы думаете, когда слышите слово «фаззинг»? Одни вспоминают о приказе ФСТЭК России № 239, другие — об утилитах с пугающими отчетами, а кто-то и вовсе озадаченно пожимает плечами. Рассказываем, для чего нужен фаззинг, зачем его применять и каким он бывает.
Навигация по статье:
• Ввод понятия
• Подходы к тестированию (White/Black/Grey Box)
• Необходимость проведения
• Ограничения в выборе
• Международные практики
• Вместо заключения
• Для статистики
Ввод понятия
В ГОСТ 58142 «Информационная технология. Методы и средства обеспечения безопасности. Детализация анализа уязвимостей программного обеспечения в соответствии с ГОСТ Р ИСО/МЭК 15408 и ГОСТ Р ИСО/МЭК 18045. Часть 2. Тестирование проникновения» есть следующее определение: «фаззинг — это тестирование, использующее как корректные, так и случайные (включая некорректные) входные данные для проверки, устанавливающей, обрабатываются ли должным образом интерфейсом случайные входные данные или возникает ошибочная ситуация (ошибочное условие), указывающая (указывающее) на наличие недостатков при разработке (ошибки исходного кода) или при эксплуатации».
Если проще, то фаззинг — это проверка на то, могут ли при обработке случайных, в том числе некорректных, входных данных некоторыми частями софта возникнуть «странности» в поведении ПО, которые разработчики не закладывали в его функционал.
Из определений ясно, что фаззинг позволяет обнаружить ошибки сразу на нескольких стадиях жизненного цикла программного средства: разработки и применения. Неужели этот метод настолько универсален?
Подходы к тестированию (White/Black/Grey Box)
В общем случае фаззинг представляет из себя не конкретную технику, а идею проверки объекта, заключающуюся в передаче ему некоторых данных. В зависимости от того, насколько доступны сведения о проверяемом объекте, выделяют три подхода к тестированию: Black-box, Gray-box и White-box. В случае с White-box фаззингом специалист понимает, как устроена и реализована его цель. Он проводит тестирование на уровне исходного кода. При использовании Black-box подхода проверяющий не обладает сведениями о внутреннем устройстве исследуемого объекта и взаимодействует только с его внешними интерфейсами с позиции пользователя. При реализации Gray-box специалист имеет доступ к скомпилированной программе, но не к ее исходникам. Обладая неполным представлением о внутреннем устройстве цели, он пытается получить недостающую информацию о ней в процессе анализа.
Фаззинг-тестирование можно провести в отношении исходного кода, бинарного файла или приложения. При проверке исходного кода в качестве интерфейсов выступают функции программы, а в качестве изменяемых данных — их параметры. Фаззинг на этом уровне подходит для исследования парсеров и валидаторов. Он позволяет найти такие ошибки, как попадание в некорректные условия, бесконечные циклы, обход регулярных выражений и корректности валидированных значений, переполнение буфера. В случае с приложением объектом исследования служит его внешний интерфейс, с бинарным файлом — его содержимое.
Описанные подходы к проведению фаззинга направлены на решение разных задач. Black-box эффективен при тестировании работающих удаленно приложений или встроенного ПО. Gray-box применим там же, где и Black-box, в случаях, когда необходима более точная проверка. Кроме того, он полезен для исследования локальных приложений и когда в исходном коде программы слишком много строк, из-за чего White-box фаззинг требует неоправданно много времени.
Ниже приведена сравнительная таблица описанных подходов.
Таблица 1 — Сравнение подходов к проведению фаззинга
Подход | Знания о тестируемом объекте | Доступные данные | Применимость |
White-box | полные | Исходный код | Приложения, осуществляющие парсинг, валидацию данных Приложения, в исходном коде которых мало строк |
Grey-box | неполные | Скомпилированная программа | Локальные приложения Приложения, в исходном коде которых много строк |
Black-box | минимальные | Внешний интерфейс | Работающие удаленно приложения Встроенное ПО |
Необходимость проведения
Зачем проводить фаззинг? Прежде всего, это нужно разработчику ПО, если он хочет избежать материального или репутационного ущерба, который может возникнуть из-за эксплуатации уязвимостей в его продукте. Такие инциденты происходят регулярно. Например, в 2023 году неизвестные хакеры использовали связанную с path traversal уязвимость CVE-2022–41328 операционной системы FortiOSот компании Fortinet в таргетированной атаке на правительственную организацию. Действия злоумышленников привели к отключению межсетевых экранов FortiGate. За несколько месяцев до инцидента произошла другая атака на оборудование от Fortinet, применяемое организацией авиационного сектора. В этот раз хакеры использовали уязвимость переполнения буфера (CVE-2022–42475) в FortiOS SSL-VPN. В результате атаки взломанные устройства оказались заражены вредоносным ПО, которое повреждало данные в журналах FortiOS и нарушало функциональность системы предотвращения вторжений (IPS). Фаззинг позволяет предотвратить подобные инциденты.
Нельзя забывать и о букве закона. В нашей стране фаззинг-тестирование обязательно для защиты значимых объектов критической информационной инфраструктуры (КИИ). Согласно пункту 29.3.2 приказа ФСТЭК России от 25.12.2017 №239 «Об утверждении требований по обеспечению безопасности значимых объектов критической информационной инфраструктуры Российской Федерации» субъект КИИ должен реализовать «проведение фаззинг-тестирования программы, направленного на выявление в ней уязвимостей».
Кроме того, в приказе обозначена необходимость наличия в организации руководства по безопасной разработке программного обеспечения. Этот документ можно составить на основе ГОСТ Р 56939–2016 «Защита информации. Разработка безопасного программного обеспечения. Общие требования». В стандарте фаззинг-тестирование фигурирует в качестве меры, которую следует прописать в руководстве.
По решению заказчика или разработчика для реализации фаззинга как меры по разработке безопасного программного обеспечения может применяться «Методика выявления уязвимостей и недекларированных возможностей в программном обеспечении», утвержденная ФСТЭК России. Этот документ имеет пометку ограничения доступа.
Ограничения в выборе
Как проводить проверку субъекта КИИ, которому нужно выполнить требования из приказа ФСТЭК России №239? Достаточно ли для этого использовать любую доступную утилиту и профаззить то, что хочется? Нет, всё не так просто. На официальном сайте регулятора опубликованы видеоматериалы для специалистов в области информационной безопасности. В частности, в лекции «Инструментальная и технологическая поддержка проведения фаззинг-тестирования программного обеспечения» Шамиль Курмангалеев, руководитель направления аудита бинарного кода в ИСП РАН, рассказывает о фаззере, тестовом покрытии и дополнительных средствах выявления ошибок в исследуемом объекте. Давайте разберемся, что означают некоторые термины, употребляемые лектором.
Основная программа, необходимая для проведения рассматриваемого вида тестирования — фаззер. Он может быть мутационным и генерационным (порождающим, grammar-based). Первый тип инструмента создает отправляемые данные на основе эталона. Обрабатывая ответ от исследуемого объекта, программа делает выводы об успешности тех или иных «мутаций» и в следующей итерации формирует новые последовательности. Фаззер второго типа сам генерирует исходные данные случайным образом или по заданным правилам.
Первый способ проще в реализации, но поскольку утилита работает только с эталоном, некоторые виды ошибок можно упустить. Второй способ сложнее, ведь для него необходимо описание формата входных данных, однако он обеспечивает лучшее покрытие кода исследуемого приложения. Обе разновидности инструмента позволяют сформировать последовательность, которая приведет к реализации непредусмотренной функции объекта или к ошибке в его работе. Все это указывает на наличие в программе дефекта безопасности.
Однако некорректные входные данные позволяют обнаружить не все недостатки безопасности. Так, опасные дефекты, связанные с утечкой памяти и переполнением буфера, могут остаться незамеченными. Их хорошо искать при помощи другого инструмента — санитайзера. Он может быть встроен в фаззер или компилятор. Санитайзер анализирует состояние областей памяти, выделяемых во время работы программы. В случае обнаружения проблем санитайзер генерирует исключение, которое фаззер перехватывает и фиксирует как ошибку.
Тестовое покрытие подразумевает под собой получение сведений об участках кода программы, которые были выполнены при обработке тех или иных входных данных. Сбор покрытия реализуется посредством фиксирования пройденных участков кода самой исследуемой программой или инструментом тестирования.
Международные практики
А используют ли фаззинг в других странах? Да. Например, в США, где регулятором в сфере информационной безопасности выступает Cybersecurity and Infrastructure Security Agency (CISA), он необходим. CISA в соответствии с приказом об улучшении национальной кибербезопасности взаимодействует с Национальным институтом стандартов и технологий США (NIST) по вопросам разработки и внедрения регламентирующих документов. NIST уже выпустил Special Publication 800–53 «Security and Privacy Controls for Federal Information Systems and Organizations», где представил меры безопасности для федеральных информационных систем и организаций. Фаззинг присутствует в публикации в качестве дополнительной меры на этапе тестирования разрабатываемого приложения.
Помимо этого, сообщество экспертов в области информационной безопасности из США разработало методологию BSIMM, которую теперь используют специалисты по всему миру. Она предоставляет организациям структурированный набор практик и активностей, направленных на обеспечение безопасности при разработке, внедрении и поддержке программного обеспечения. В число таких активностей входит фаззинг на уровне приложения.
Другое международное сообщество OWASP, исследующее вопросы обеспечения безопасности веб-приложений, разработало документ Web Security Testing Guide. В нём описаны приёмы, методики, инструменты и ресурсы для тестирования наиболее распространённых уязвимостей web-приложений. В данном руководстве рассматривается и фаззинг, рекомендуются конкретные утилиты.
Вместо заключения
Фаззинг-тестирование— полезный метод проверки программы, используемый по всему миру в качестве практики безопасной разработки (DevSecOps). Существует несколько подходов к реализации этой техники, которые применяются в зависимости от особенностей исследуемого объекта. В следующей статье мы остановимся на практических аспектах проведения фаззинга, расскажем про доступные утилиты.
Автор: Нинель Шницарь, аналитик по безопасной разработке программного обеспечения в Центре кибербезопасности УЦСБ.