

ИСП РАН уже более пятнадцати лет проводит фундаментальные и прикладные исследования, связанные с разработкой и применением технологий анализа программ для обеспечения кибербезопасности. Результаты исследований реализованы в виде комплекса инструментов, обеспечивающих разработку безопасного ПО. Наряду с широко известными инструментами статического анализа программ, такими как Svace [1] и Svacer [2], в ИСП РАН разработан ряд решений по динамическому анализу (ДА) ПО.
Одним из передовых способов ДА на текущий момент является гибридный фаззинг. Это сочетание классического фаззинг-тестирования с методами динамического символьного исполнения (ДСИ). ДСИ выполняет анализ программы, опираясь на ее логику и внутреннюю структуру. Для этого реальные входные данные заменяются на символьные переменные, с использованием которых происходит интерпретация бинарного кода и построение математической модели исполнения программы. На основе данной модели генерируются новые входные данные, которые приводят к увеличению тестового покрытия или воспроизведению ошибок.
Гибридный фаззинг зарекомендовал себя как наиболее эффективный метод тестирования. Он объединяет в себе скорость классического фаззинга и способность к открытию труднодостижимых участков кода ДСИ. Тем самым быстрее достигает большего покрытия и обнаруживает больше ошибок, чем оба метода по отдельности.
Комплекс Sydr-Fuzz [3], разрабатываемый в ИСП РАН, позволяет организовывать гибридный фаззинг бинарных программ с помощью открытых инструментов фаззинга (libFuzzer, AFL++, Honggfuzz) и инструмента ДСИ Sydr. Sydr-Fuzz одновременно запускает заданное число процессов фаззинга и символьного исполнения и по ходу работы синхронизирует корпуса данных между ними: отсеивает лучшие пути для анализа методом ДСИ и отбирает полезные входные данные для фаззера. Sydr-Fuzz также контролирует работу инструментов, отслеживает статистику их работы и условия для завершения фаззинга.
Инструмент ДСИ Sydr, для увеличения покрытия генерирует новые входные данные для анализируемой программы путем инвертирования условных переходов, зависящих от входных данных. Также Sydr осуществляет целенаправленный поиск ошибок с помощью символьных предикатов безопасности. Sydr определяет потенциально опасные участки в бинарном коде и пытается подобрать входные данные для воспроизведения ошибки. В Sydr поддерживаются предикаты безопасности для обнаружения разыменования нулевого указателя, деления на ноль, переполнения буфера, целочисленного переполнения и усечения, инъекции форматной и командной строки.
Sydr-Fuzz поддерживает гибридный фаззинг для компилируемых программ на языках C/C++/Rust/Go и С# (при использовании компиляции Native AOT) на ОС семейства Linux. Также, в нем реализована поддержка анализа на архитектурах x86/x86-64, ARM64 (в т. ч. Байкал) и RISC-V.
Sydr-Fuzz поддерживает пайплайн ДА для компилируемого кода, включая следующие этапы: анализ, минимизация итогового корпуса входных данных, сбор покрытия и анализ аварийных завершений. Также реализована поддержка программ на Python/Java/JavaScript/Lua. Вместо гибридного фаззинга на этапе анализа для таких проектов выполняется обычное фаззинг-тестирование с использованием открытых инструментов Atheris, Jazzer, Jazzer.js, Sharpfuzz, luzer. Sydr-Fuzz реализует процедуры запуска фаззинга, минимизации корпуса, сбора покрытия и анализа аварийных завершений для каждого тулчейна, что сильно облегчает процесс автоматизации ДА.
Для автоматического анализа аварийных завершений Sydr-Fuzz использует инструмент CASR [4]. Он позволяет генерировать отчеты о каждой обнаруженной в процессе анализа ошибке, удалять дубликаты и кластеризовать оставшиеся ошибки по степени похожести стека вызовов. Отчеты об ошибках генерируются на основе информации от санитайзеров или gdb и содержат всю необходимую информацию для аналитика, в т. ч. стек вызовов и участок исходного кода с ошибкой. CASR является мощным инструментом, позволяющий существенно облегчить разбор результатов фаззинга, где зачастую могут находиться сотни различных аварийных завершений.
Все инструменты ДА программы позволяют анализировать только тот код, который был реально выполнен. Поэтому важно выбрать такой набор тестов или сценариев работы, который покрывал бы все важные функции.
Для сбора сведений о выполнении программы, ее прерывают, обеспечив работу инструментального кода. Для этого анализатор заведомо замедляет целевую программу. Инструментальный код встраивается в код программы на этапе компиляции или предобработки бинарного файла перед запуском (статическое инструментирование). Другой подход — это добавление инструментального кода непосредственно во время выполнения фрагментов целевой программы (динамическое инструментирование).
В ИСП РАН разработан инструмент Natch [5], предназначенный для определения поверхности атаки (ПА) приложений. Он построен на основе виртуальной машины QEMU и использует динамическое инструментирование.
ПА ПО — это те интерфейсы или программные компоненты (функции, модули, программы, библиотеки), которые получают данные из недоверенных источников. Так как при отправке модифицированных данных на интерфейсы или в программные компоненты возможно нарушить работу программы.
Разработчики определяют поверхность атаки своего ПО для тестирования (в том числе с помощью фаззинга) этих функций. Также поиск поверхности атаки необходим для того, чтобы найти зависимости от лишних или устаревших библиотек и пр.
Для определения ПА можно применить статический анализ (построение зависимостей функций, просмотр кода через IDE) или ДА (поиск покрытия кода набором тестов). При этом, статический анализ не способен в принципе находить некоторые типы зависимостей, к примеру, из-за динамического связывания, с чем может помочь Natch. А ДА (при достаточно хорошем наборе тестов) находит именно тот код, который выполнялся. Но сведения о выполненных функциях (и строках кода) недостаточно точно отражают характер этих функций. Такой метод не создает ясности зависят ли функции от входных данных. Например, код инициализации выполняется всегда, но злоумышленник редко может на него повлиять. Поэтому этот код не должен быть включён в ПА. Для определения более точной ПА необходимо отследить те программные модули, которые взаимодействовали со входными данными из недоверенных источников, в чем полезен Natch.
Чтобы выделить из множества выполненных функций только те, что относятся к ПА (то есть обрабатывающие небезопасные данные), Natch помечает входные данные из недоверенных источников, специфицированных пользователем, а затем средствами эмулятора отслеживает их распространение по памяти виртуальной машины. Каждая процессорная инструкция, копирующая помеченные данные, копирует также и пометку. Что позволяет узнать, куда передавались и где обрабатывались входные данные и получить поверхность атаки, интересующую аналитика.
Natch анализирует не отдельные приложения, а виртуальную машину целиком, что позволяет проследить работу с данными, перетекающими между сервисами. При этом необходимо: помещать исследуемую программу в контролируемое окружение (виртуальную машину), а также разделять выполняемый в виртуальной машине код между высокоуровневыми сущностями (процессами, модулями) для представления пользователю.
В базовой версии QEMU включен только эмулятор gdb-сервера для подключения отладчика и логирование выполняющихся инструкций. Для того, какие именно приложения выполняются в гостевой системе, этого недостаточно. Поэтому Natch загружает в QEMU плагины, которые инструментируют выполняемый код. С помощью этого в гостевой системе определяются обращения к файлам, переключение между процессами. Восстанавливается стек вызовов всех приложений, собирается информация о покрытии кода. Также Natch умеет распознавать выполнение функций из программ на Python и JavaScript и даже скомпилированного байт-кода Java.
Natch может анализировать виртуальные машины под управлением Linux, Windows или FreeBSD для архитектур x86_64 и AArch64. Генерация ПА и стека вызовов работает для компилируемых языков типа C/C++, а также Go, Python, Java, C# и JavaScript.
ИСП РАН продолжает исследования безопасности ПО и развитие технологий ДА, в том числе ИСП Crush [6], Блесна [7] и пр. О новых подходах и развитии технологий исследований безопасности ПО можно узнать на официальном сайте ИСП РАН [8].
[1] https://www.ispras.ru/technologies/svace/
[2] https://www.ispras.ru/technologies/svacer/
[3] https://www.ispras.ru/technologies/sydr/
[4] https://www.ispras.ru/technologies/casr/
[5] Описание: https://www.ispras.ru/technologies/natch/
Запись доклада на ТБ Форум 25: https://vkvideo.ru/video-227780688_456240675?t=3h20m40s
Слайды доклада на ТБ Форум 25: https://www.tbforum.ru/hubfs/Digital/SS/SS_ADAPT/TBF_13-02-25_MK_RBPO_Dovgalyuk.pdf?hsLang=ru
[6] https://www.ispras.ru/technologies/crusher/
[7] https://www.ispras.ru/technologies/blesna/?ysclid=me90e88xk9679128314
Отправляя данную форму вы соглашаетесь с политикой конфиденциальности персональных данных
Отправляя данную форму вы соглашаетесь с политикой конфиденциальности персональных данных