РБПО для СПО в действии — статический анализ и опыт его применения (OSSDEVCONF-2025)
Материал из 0x1.tv
- Докладчик
Доклад посвящён вопросам применения статического анализа программного обеспечения (СПО) в обеспечении безопасности и качества разрабатываемых систем. Рассматриваются ключевые понятия и цели статического анализа, его роль в процессе разработки безопасного программного обеспечения (РБПО), а также современные стандарты, включая ГОСТ Р 71207–2024.
Особое внимание уделено испытаниям статических анализаторов под патронажем ФСТЭК России, целям и задачам этих испытаний, а также роли компании «Базальт СПО» в их проведении. Представлены результаты этапа «Домашнее задание», обсуждаются инструменты CodeChecker и CodeChecker-alt-suite, а также практические этапы их применения.
Доклад также затрагивает перспективы развития статического анализа, ожидания от инструментов, их эффективность и возможности внедрения в процесс обеспечения безопасности СПО.
Содержание
Видео[править вики-текст]
Презентация[править вики-текст]
Thesis[править | править вики-текст]
Ключевые слова: статический анализ, инструменты, ГОСТ Р 71207–2024.
Статический анализ: понятие, роль и практические примеры[править | править вики-текст]
Статический анализ является одной из ключевых практик разработки безопасного программного обеспечения (РБПО) наряду с фаззингом и композиционным анализом. Совместное применение этих методов обеспечивает комплексный подход к анализу исходного кода и способствует повышению доверия к создаваемому ПО.
Статический анализ — это метод исследования программного обеспечения, при котором исходный код проверяется без запуска программы с помощью специальных инструментов — статических анализаторов. Они автоматически проверяют логику условий, использование переменных, корректность типов и другие аспекты программы.
Существуют свободные инструменты, которые показывают хорошие результаты для С/C++: от простого Cppcheck[1] для быстрого анализа кода до более сложного Clang Static Analyzer[2], поддерживающего почти все виды анализа, включая межмодульный и контекстно-чувствительный. В ходе небольшого исследования было выявлено, что различные анализаторы хорошо обнаруживают разные типы ошибок, поэтому возникла необходимость объединить их результаты. В настоящий момент мы используем для этого платформу CodeChecker[3].
CodeChecker — это платформа для обработки результатов статического анализа кода, которая объединяет отчёты нескольких анализаторов, хранит их и визуализирует.
CodeChecker-alt-suite[4] представляет собой пакет, включающий набор свободных инструментов с их настройкой в соответствии с требованиями ГОСТ Р 71207–2024[5], а также методику запуска анализа.
Практические примеры исправления ошибок, найденных с помощью статического анализа:
- Запускается исследование с помощью инструмента статического анализа.
- Получаем срабатывание статического анализатора и проверяем её на ложноположительность:
389-ds-base(v3.1.3):
ldap/servers/slapd/tools/ldclt/parser.c:
141. if (variant[1] != '=')
142. field->var = -1;
143. else {
144. if ((variant[0] < VAR_MIN) || (variant[0] > VAR_MAX)) {
145. fprintf(stderr, "Error: bad variable in %s : \"%s\"\n", fname, line);
146. fprintf(stderr, "Error: must be in [%c-%c]\n", VAR_MIN, VAR_MAX);
147. return (-1);
148. }
149. field->var = variant[0] - VAR_MIN;
150. variant++; /* Skip variable name */
151. variant++; /* Skip '=' */
OVERFLOW_UNDER_CHECK: Accessing an element of array 'obj->var' of size 7 at parser.c:156 can lead to a buffer overflow, since the index 'field->var' can have an out of range value 7, as indicated by a preceding conditional expression at parser.c:144.
156. if (obj->var[field->var] == NULL)
157. //OVERFLOW_UNDER_CHECK
158. obj->var[field->var] = (char *)malloc(MAX_FILTER);
159. }
ldap/servers/slapd/tools/ldclt/ldclt.h:
323. #define VAR_MIN 'A'
324. #define VAR_MAX 'H'
325. typedef struct vers_object
326. {
327. vers_attribute attribs[MAX_ATTRIBS];
328. int attribsNb;
329. vers_attribute *rdn;
330. char *rdnName;
331. char *var[VAR_MAX - VAR_MIN];
332. char *fname;
333. } vers_object;
- Создаём PR с исправлением в upstream
Испытания статических анализаторов и их оценка[править | править вики-текст]
Для оценки достаточности и полноты анализа используется ГОСТ Р 71207–2024 «Статический анализ программного обеспечения», который описывает порядок проведения анализа, виды выявляемых ошибок и типы методик анализа. Поэтому для проверки применимости ГОСТ Р 71207–2024 на практике ФСТЭК России организовала испытания статических анализаторов[6]. Эти испытания стали уникальным событием, демонстрирующим востребованность статического анализа для обеспечения безопасности программного обеспечения. Основное внимание уделялось технологическим возможностям инструментов, определяемым стандартом.
Цели и задачи испытаний включают:
- оценку технологических возможностей статических анализаторов исходного кода;
- формирование публичных методик оценки и критериев применимости анализаторов в различных видах исследований.
Компания «Базальт СПО» участвует в испытаниях не только как член жюри, но и в качестве активного участника, исследуя возможности свободных статических анализаторов по методике, подготовленной рабочей группой.
В ходе испытаний был создан набор открытых тестов, который позволяет получить первоначальную оценку возможностей различных решений статического анализа.
Для CodeChecker-alt-suite эти результаты выглядят следующим образом: FN — 14.7 %, FP — 35.4 % по всему набору открытых тестов, что соответствует пункту 8.4 ГОСТ Р 71207–2024 (долю ошибок первого рода — не более 50 %; долю ошибок второго рода — не более 50 %).
Перспективы развития[править | править вики-текст]
В планах — синхронизация выработанных методик с ГОСТ Р 71207–2024 с учётом реальных условий, оценка возможностей различных анализаторов для повышения эффективности статического анализа, выявление их недостатков и определение направлений дальнейшего развития.
Существует также потенциал для расширения и на другие языки программирования. Уже проведено первичное исследование, которое позволило выявить возможные инструменты для их интеграции.
Примечания и ссылки[править вики-текст]
- ↑ Cppcheck // cppcheck.net. URL: http://cppcheck.net/manual.html (дата обращения: 10.09.2025).
- ↑ Clang Static Analyzer // clang.llvm.org. URL: https://clang.llvm.org/docs/ClangStaticAnalyzer.html (дата обращения: 10.09.2025).
- ↑ CodeChecker // CodeChecker. URL: https://codechecker.readthedocs.io/en/latest/ (дата обращения: 10.09.2025).
- ↑ Пакет CodeChecker-alt-suite // packages.altlinux.org. URL: https://packages.altlinux.org/ru/sisyphus/srpms/CodeChecker-alt-suite/ (дата обращения: 10.09.2025).
- ↑ ГОСТ Р 71207–2024 // protect.gost.ru. URL: https://protect.gost.ru/v.aspx?control=8&id=246347 (дата обращения: 10.09.2025).
- ↑ Испытания статических анализаторов // ib-bank.ru. URL: https://ib-bank.ru/bisjournal/post/2388 (дата обращения: 10.09.2025).

