

В условиях развития технологий и возрастания угроз в сфере кибербезопасности обеспечение безопасности программного обеспечения становится приоритетной задачей для многих организаций. Одним из эффективных способов выявления потенциальных уязвимостей является использование инструментов статического и динамического анализа кода. Эти методы анализа играют ключевую роль в раннем обнаружении дефектов и уязвимостей, что позволяет значительно повысить безопасность разрабатываемых программных продуктов.
Статистика
АК-ВС 3 активно используется в различных сферах, включая государственные учреждения, коммерческие организации и высшие учебные заведения. Решение успешно интегрировано в процессы безопасности множества организаций, что подтверждается растущей статистикой его внедрения. Университеты применяют АК-ВС 3 для обучения специалистов в области информационной безопасности, а государственные структуры используют его для анализа критически важных программных решений.
С 2024 года по настоящее время 118 организаций, включая государственные учреждения, высшие учебные заведения и испытательные лаборатории, успешно приобрели продукт АК-ВС 3. Из данного числа 110 организаций представляют коммерческий сектор, что свидетельствует о растущем интересе бизнеса к современным технологиям анализа кода. С начала 2025 года около 10–15 организаций воспользовались возможностью протестировать демоверсию АК-ВС 3.
Архитектура АК-ВС 3:
1. Модуль «Клиент» — IDE «Эшелониум»: осуществляет работу с проектами, предоставляет возможность для просмотра, анализа и разметки срабатываний.
2. Модуль «Сервер»: обеспечивает выполнение статического анализа кода, динамического анализа кода, полносистемного динамического анализа (Код2), фаззинг-тестирования, а также предоставляет веб-интерфейс для удобной работы.
3. Модуль сборки: включает утилиту для подготовки исходных текстов, необходимых для выполнения статического анализа в рамках проведения подконтрольной сборки исследуемого программного обеспечения.
4. Модуль фаззера: менеджер фаззеров, который выполняет фаззинг-тестирование.
5. Модуль «Код2»: отвечает за реализацию полносистемного динамического анализа и подготовку полносистемных трасс для последующего анализа (рис. 1).
Рисунок 1. Состав и структура АК-ВС 3
ИСПОЛЬЗУЕМЫЕ МЕТОДЫ АНАЛИЗА
Статический анализ исходного кода программы (SAST)
Статический анализ представляет собой процесс анализа исходного кода программы с целью выявления дефектов кода, в частности потенциально опасных конструкций. В соответствии с актуальной нормативной базой данный анализ также следует проводить в отношении компонентов, заимствованных у сторонних разработчиков, при условии доступности их исходного кода.
Первые версии статических анализаторов были схожи с линтерами — утилитами, которые выполняют анализ кода, ищут совпадения с заданными шаблонами и формируют выводы о наличии или отсутствии определённых конструкций в исходном коде. Например, это может касаться жёстко заданных паролей или использования небезопасных функций. Изначально линтеры разрабатывались с целью содействия разработчикам в написании качественного кода и не имели непосредственного отношения к вопросам безопасности.
Цели статического анализа кода программы:
— поиск дефектов кода;
— подсчёт метрик;
— рекомендации по оформлению кода;
— внедрение в рамках цикла безопасной разработки (SSDLC);
— обеспечение выполнения нормативных требований заказчика и регуляторов.
Основные применяемые методы статического анализа кода программы:
1. Синтаксический анализ: включает использование базы данных сигнатур, где ошибки выявляются путём поиска заранее известных антипаттернов в исходном коде.
2. Межпроцедурный анализ: позволяет выявлять сложные ошибки, возникающие из-за взаимодействия различных функций и методов. В этом случае анализируется не только отдельная строка кода, но и совокупность всех файлов и функций с учётом контекста и взаимосвязей.
3. Контекстно-чувствительный анализ: сохраняет контекст переходов между функциями и их состояниями. Например, если для входа в определённую функцию необходимо, чтобы переменная имела значение 0, статический анализатор будет отслеживать, что в дальнейшем эта переменная не может принимать иное значение.
Дополнительно могут быть использованы межмодульный анализ, анализ потока управления, анализ потока данных и ряд других методов. Для более детального ознакомления с различными видами статического анализа рекомендуется обратиться к статье, в которой представлен сравнительный анализ работы статических анализаторов в соответствии с требованиями ФСТЭК России, Министерства обороны Российской Федерации, а также зарубежных стандартов, таких как NIST SP 500-268 и SATEC [1].
В ходе статического анализа кода акцент делается на выявление дефектов, однако уязвимости могут быть обнаружены исключительно в процессе динамического анализа. Значительная часть проблем, связанных с безопасностью программного обеспечения, проявляется лишь во время выполнения программы. Таким образом, динамический анализ играет ключевую роль в обеспечении безопасности программных продуктов, позволяя выявить риски, которые невозможно обнаружить, работая лишь с исходными текстами программы.
Динамический анализ кода (DAST)
Динамический анализ кода представляет собой процесс выявления уязвимостей в режиме выполнения (run-time) программного обеспечения. Основные методы динамического анализа включают общую сборку путей выполнения, полносистемный анализ и фаззинг-тестирование.
Общая сборка путей выполнения включает проведение сборки исходных текстов, в которые будут интегрированы специальные датчики. Эти датчики отслеживают проходящие через них вызовы функций и осуществляют запись логов в файл, на основе которых впоследствии осуществляется анализ и формируется трасса выполнения. Это позволяет определить, какие блоки кода были вызваны, а какие остались неиспользованными, а также проследить за прохождением по веткам выполнения (рис. 2).
Таким образом, этапы динамического анализа выглядят следующим образом:
1. Сбор логов по динамическому выполнению проекта.
2. Обнаружение путей ветвления и исполнения проекта на основе реального выполнения.
3. Определение модулей и функций, через которые проходило выполнение.
4. Выявление мест возникновения ошибок и сбоев (рис. 3).
Рисунок 2. Построение блок-схемы для конкретного функционального объекта
Рисунок 3. Анализ отработавших функциональных объектов, которые были проинструментированы датчиками при динамическом анализе
Полносистемный динамический анализ (Код2)
Полносистемный анализ представляет собой анализ с полной трассировкой выполнения программы, что позволяет отслеживать помеченные данные, а также выполнение и пересечение различных элементов. Этот метод основан на использовании QEMU, в рамках которого осуществляется функциональное тестирование, трассировка и непосредственный анализ.
Этапы полносистемного анализа:
— полносистемный анализ трассы выполнения кода;
— запись данных всей системы с отслеживанием каждого элемента;
— поиск утечек данных и критической информации.
Фаззинг-тестирование (FAST)
Фаззинг-тестирование представляет собой методику, при которой на вход программы подаются сгенерированные или мутационные данные. В рамках фаззинга с обратной связью (feedback-based fuzzing) осуществляется сбор логов о том, как обработанные данные влияют на систему. Входные данные генерируются с использованием как мутационных, так и словарных (генерационных) методов.
— Мутационный фаззинг: данные могут принимать любые формы, включая изображения, видео, байты и произвольные наборы данных.
— Генерационный фаззинг: этот метод, хотя и имеет частичное совпадение с мутационным, позволяет генерировать входные данные, которые являются валидными для первого фильтра при взаимодействии с интерфейсом системы.
Фаззинг-тестирование в АК-ВС 3 реализовано на основе AFL++ с учётом оригинальной технологии разработки.
Вывод
Инструменты статического и динамического анализа кода играют важнейшую роль в обеспечении безопасности программного обеспечения, позволяя выявить уязвимости на разных этапах разработки. Статический анализ помогает обнаружить дефекты на уровне исходного кода, прежде чем они могут быть использованы злоумышленниками. Динамический анализ, в свою очередь, позволяет выявить проблемы, которые могут проявиться лишь во время выполнения программы, такие как утечки памяти или переполнения буфера. Оба метода являются неотъемлемой частью процесса безопасной разработки и позволяют предотвратить угрозы безопасности на ранних стадиях.
[1] Марков А. С., Антипов И. С., Арустамян С. С., Магакелова Н. А. Сравнительный анализ статических анализаторов кода. Современная методология // Вопросы кибербезопасности. 2024. № 5 (63). С. 79–88.
Отправляя данную форму вы соглашаетесь с политикой конфиденциальности персональных данных
Отправляя данную форму вы соглашаетесь с политикой конфиденциальности персональных данных