ГОСТ Р 71207-2024 "Статический анализ кода" выделят класс дефектов в коде, называемых критическими ошибками. При разработке безопасного программного обеспечения (РБПО) такие дефекты должны в обязательном порядке выявляться и исправляться в приоритетном режиме. Статический анализатор PVS-Studio разрабатывается с учётом этого стандарта и позволяет выявлять все типы критических ошибок в коде программ, написанных на языках C, C++, C#, Java. Рассмотрим эти типы предупреждений и как их можно выделить среди других предупреждений, выдаваемых анализатором.

Одним из процессов разработки безопасного программного обеспечения (ГОСТ Р 56939-2024, п. 5.10.) является статический анализ кода. Он применяется с целью предотвращения внесения потенциально опасных конструкций и ошибок в ПО, а также использования опасных конструкций и уязвимостей из заимствованного кода (ГОСТ Р 56939-2024, п. 5.10.1.1.)
ГОСТ Р 56939-2024. Терминология. Статический анализ (п. 3.18).
Статический анализ исходного кода программы. Вид работ по инструментальному исследованию программы, основанный на анализе исходных текстов программы с использованием специализированных инструментальных средств (статических анализаторов) в режиме, не предусматривающем исполнения кода, и выполняемый для определения свойств программы; в частности, статический анализ применяется для выявления потенциальных ошибок в программе.
Детальнее методология статического анализа кода разбирается в отдельном ГОСТ Р 71207-2024.
ГОСТ Р 71207-2024 — РАЗРАБОТКА БЕЗОПАСНОГО ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ. Статический анализ программного обеспечения. Общие требования. Разработан ФСТЭК России и ИСП РАН. Впервые введён в действие 01.04.2024.
Входит в комплекс стандартов, направленных на предотвращение уязвимостей в программах, и применяется совместно с ГОСТ Р 56939-2016/2024.
Типы критических ошибок согласно ГОСТ Р 71207-2024
ГОСТ Р 71207-2024 вводит важное понятие — критические ошибки. Это дефекты программного кода, которые в сравнении с другими ошибками могут быть с большей вероятностью использованы злоумышленником для влияния на процесс работы программы. Если найден способ использования такого дефекта, он становится уязвимостью (vulnerability).
В стандарте приводится следующая формулировка (п. 3.1.13): "Критическая ошибка в программе — ошибка, которая может привести к нарушению безопасности обрабатываемой информации".
Выявление критических ошибок является обязательной составляющей статического анализа кода при построении процесса РБПО.
Выдержка из ГОСТ Р 71207-2024 (п. 5.4).
В ходе конфигурации должны быть выполнены выбор и включение типов предупреждений анализатора, соответствующих списку критических ошибок, приведённых в 6.3. В ходе конфигурации могут быть также включены другие типы предупреждений анализатора, соответствующих другим потенциальным ошибкам, специфичным для анализируемого ПО (дефекты кодирования для языка программирования ПО, принятые стили кодирования и пр.).
...
После анализа результатов первичной разметки конфигурация статического анализатора может быть доработана, в частности могут быть включены дополнительные типы предупреждений, выполнена настройка анализатора на используемые в заданном ПО заимствованные компоненты, доработаны и настроены алгоритмы выдачи конкретных типов предупреждений и пр. Кроме того, статический анализатор может быть по-разному настроен для различных компонентов анализируемого ПО, например для тестов искать только критические ошибки.
Типы критических ошибок, которые должны выявлять статические анализаторы, рассматриваются в 6 главе ГОСТ Р 71207-2024. Для компилируемых языков это:
6.3.а. Ошибки непроверенного использования чувствительных данных (ввода пользователя, файлов, сети и пр.);
6.3.б. Ошибки целочисленного переполнения и некорректного совместного использования знаковых и беззнаковых чисел;
6.3.в. Ошибки переполнения буфера (записи или чтения за пределами выделенной для буфера памяти);
6.3.г. Ошибки некорректного использования системных процедур и интерфейсов, связанных с обеспечением информационной безопасности (шифрования, разграничения доступа и пр.);
6.3.д. Ошибки при работе с многопоточными примитивами (интерфейсами запуска потоков на выполнение, синхронизации и обмена данными между потоками и пр.). Примечание: единственный тип из перечисленных, для которого реализация детекторов в анализаторах является необязательной (опциональной) (п.7.3).
Для интерпретируемых языков это:
6.4.а. Ошибки непроверенного использования чувствительных данных (ввода пользователя, файлов, сети и пр.);
6.4.б. Ошибки некорректного использования системных процедур и интерфейсов, связанных с обеспечением информационной безопасности (шифрования, разграничения доступа и пр.);
6.4.в. Ошибки при работе с многопоточными примитивами. Примечание: единственный тип из перечисленных, для которого реализация детекторов в анализаторах является необязательной (опциональной) (п.7.3).
Дополнительные типы критических ошибок, для C и C++:
6.5.а. Ошибки разыменования нулевого указателя;
6.5.б. Ошибки деления на ноль;
6.5.в. Ошибки управления динамической памятью (выделения, освобождения, использования освобождённой памяти);
6.5.г. Ошибки использования форматной строки;
6.5.д. Ошибки использования неинициализированных переменных;
6.5.е. Ошибки утечек памяти, незакрытых файловых дескрипторов и дескрипторов сетевых соединений.
Уточнение (расширение) типа критических ошибок
Стандарт ГОСТ Р 71207-2024 наиболее проработан для языков C и C++. Для них перечислено большое количество типов критических ошибок по сравнению с другими языками.
Надо понимать, что первая версия стандарта задала отправную точку, и в дальнейшем список критических ошибок планируется расширить. Уже сейчас в ходе разработки методики испытаний статических анализаторов на соответствие ГОСТ Р 71207-2024 стало понятно, что для некоторых языков список типов слишком мал, чтобы дать обоснованную оценку.
Подробнее о мероприятии "Испытания статических анализаторов исходных кодов компилируемых и динамических языков программирования под руководством ФСТЭК России":
На этапе подготовки к "домашнему заданию", где анализаторы будут оцениваться на синтетических тестах, рабочая группа приняла решение о целесообразности расширения типов критических ошибок.
Было предложено создать расширенный набор тестов, проверяющих, что анализаторы выявляют перечисленные далее типы ошибок. Для Java, Go и C#:
ошибки разыменования нулевой ссылки;
ошибки деления на ноль;
ошибки управления динамической памятью;
ошибки утечек памяти и ресурсов.
Для Python:
ошибки деления на ноль.
Возможно и дальнейшее расширение списка типов критических ошибок, по способности выявлять которые и будут оцениваться статические анализаторы кода.
PVS-Studio: расширенный список критический ошибок
Учитывая озвученные выше тенденции, в анализаторе PVS-Studio мы уже заранее разметили некоторые детекторы как выявляющие критические ошибки. Хотя формально, согласно ГОСТ Р 71207–2024, они не критические, но являются такими де-факто, и их полезно выявлять с точки зрения безопасности.
Идентификаторы критических ошибок в PVS-Studio
Статический анализатор PVS-Studio добавляет специальные идентификаторы (флаги) к предупреждениям, которые относятся к критическим типам ошибок. Они относятся к столбцу SAST и начинаются с префикса SEC-
.
Префикс SEC-
является сокращением от SECURITY
и означает, что эти предупреждения выявляют ошибки, наиболее связанные с разработкой безопасного программного обеспечения.

Некоторые детекторы анализатора могут выдавать предупреждения, имеющие сразу два идентификатора. Причина в том, что одна и та-же ошибка может быть интерпретирована как дефект разного типа. Например, пользователь вводит число, которое без предварительной проверки используется как индекс массива, что может привести к выходу за границу массива. В этом случае, предупреждение будет одновременно помечено двумя идентификаторами:
SEC-TAINT
— ошибка непроверенного использования чувствительных данных;SEC-BUF-OVERFLOW
— ошибка переполнения буфера.
Все идентификаторы критических ошибок для языков C и C++:
SEC-TAINT
— ошибки непроверенного использования чувствительных данных (ввода пользователя, файлов, сети и пр.).SEC-OVERFLOW-OR-INT-UINT
— ошибки целочисленного переполнения и некорректного совместного использования знаковых и беззнаковых чисел.SEC-BUF-OVERFLOW
— ошибки переполнения буфера (записи или чтения за пределами выделенной для буфера памяти).SEC-SECURITY
— ошибки некорректного использования системных процедур и интерфейсов, связанных с обеспечением информационной безопасности (шифрования, разграничения доступа и пр.).SEC-SYNCHRONIZATION
— ошибки при работе с многопоточными примитивами (интерфейсами запуска потоков на выполнение, синхронизации и обмена данными между потоками и пр.).SEC-NULL
— ошибки разыменования нулевого указателя.SEC-DIV-0
— ошибки деления на ноль.SEC-MEMORY
— ошибки управления динамической памятью (выделения, освобождения, использования освобождённой памяти).SEC-STR-FORMAT
— ошибки использования форматной строки.SEC-UNINITIALIZED
— ошибки использования неинициализированных переменных.SEC-LEAKS
— ошибки утечек памяти, незакрытых файловых дескрипторов и дескрипторов сетевых соединений.
Все идентификаторы критических ошибок для языка C# и Java:
SEC-TAINT
— ошибки непроверенного использования чувствительных данных (ввода пользователя, файлов, сети и пр.).SEC-OVERFLOW-OR-INT-UINT
— ошибки целочисленного переполнения и некорректного совместного использования знаковых и беззнаковых чисел.SEC-BUF-OVERFLOW
— ошибки переполнения буфера (записи или чтения за пределами выделенной для буфера памяти).SEC-SECURITY
— ошибки некорректного использования системных процедур и интерфейсов, связанных с обеспечением информационной безопасности (шифрования, разграничения доступа и пр.).SEC-SYNCHRONIZATION
— ошибки при работе с многопоточными примитивами (интерфейсами запуска потоков на выполнение, синхронизации и обмена данными между потоками и пр.).SEC-NULL
— ошибки разыменования нулевой ссылки [расширение: см. предыдущую главу].SEC-DIV-0
— ошибки деления на ноль [расширение: см. предыдущую главу].SEC-MEMORY
— ошибки управления динамической памятью (выделения, освобождения, использования освобождённой памяти) [расширение: см. предыдущую главу].SEC-LEAKS
— ошибки утечек памяти, незакрытых файловых дескрипторов и дескрипторов сетевых соединений [расширение: см. предыдущую главу].
Включение отображения критических ошибок в PVS-Studio
Начиная с версии 7.37, в PVS-Studio появилась возможность разметить предупреждения, связанные с безопасностью. Отображение SEC
-идентификаторов осуществляется следующим образом.
Включение советующих настроек в интегрированных средах разработки:
Visual Studio: Options > PVS-Studio > Specific Analyzer Settings > Analysis > SecurityRelatedIssues.

VS Code: PVS-Studio Settings > Other > Security Related Issues.

Настройка анализатора в сборочных системах через специальный параметр:
Gradle:
securityRelatedIssues
. Подробнее в документации.Maven:
<securityRelatedIssues>
. Подробнее в документации.
Запуск анализатора через командную строку с использованием специального флага:
C и C++ анализатор (
pvs-studio-analyzer
):--security-related-issues
. Подробнее в документации.C, C++ и C# анализатор (
PVS-Studio_Cmd
):--securityRelatedIssues
. Подробнее в документации.Java анализатор (
pvs-studio.jar
):--security-related-issues
. Подробнее в документации.
Настройка анализатора при помощи файлов конфигурации диагностик (.pvsconfig
) через специальный параметр V_SEC_ID
. Подробнее в документации.
Фильтрация критических ошибок в PVS-Studio
В плагинах PVS-Studio для сред разработки представлен механизм быстрой фильтрации отчёта анализатора по заданным ключевым словам. Например, в Visual Studio можно открыть панель быстрой фильтрации с помощью кнопки Quick Filters на панели инструментов окна PVS-Studio.
Для того, чтобы в отчёте остались только критические ошибки, размеченные стандартом ГОСТ, следует прописать префикс SEC
в поле Filter SAST.

Для отображения одного конкретного типа критических ошибок следует прописать соответствующий идентификатор.

Механизм фильтрации отчёта через конвертер (plog-converter
, PlogConverter.exe
) осуществляется с помощью флага filterSecurityRelatedIssues
. Использование такого метода фильтрации оставляет в итоговом отчёте только сообщения, имеющие маркировку по ГОСТ. Подробнее в документации.
Заключение
Тема РБПО активно развивается, поэтому нет ничего удивительного, что постепенно будут меняться и уточнятся требования к анализаторам кода и другим инструментам. Наша команда следит за изменениями и оперативно адаптирует анализатор PVS-Studio и сопутствующие инструменты под новые требования.
Если у вас есть какие-то вопросы касательно статического анализа кода, ГОСТов, сертификации ФСТЭК или РБПО, то предлагаем обратиться к нам в поддержку или позвонить по телефону +7(903)844-02-22.
Дополнительные ссылки
Андрей Карпов. PVS-Studio соответствует требованиям ГОСТ Р 71207—2024 (статический анализ программного обеспечения).
Запись доклада Андрей Карпов на GigaConf-2024. Использование статического анализатора в разработке безопасного программного обеспечения (ГОСТ Р 71207-2024) на примере PVS-Studio.
Андрей Карпов. ГОСТ Р 71207–2024 глазами разработчика статических анализаторов кода.
Подкаст Ever Secure. Статический анализ по-серьезному.