Работа с предупреждениями, выявляющими критические ошибки согласно ГОСТ Р 71207-2024
- Типы критических ошибок согласно ГОСТ Р 71207-2024
- Уточнение (расширение) типа критических ошибок
- Идентификаторы критических ошибок в PVS-Studio
- Включение отображения критических ошибок в PVS-Studio
- Фильтрация критических ошибок в PVS-Studio
ГОСТ Р 71207-2024 "Статический анализ кода" выделят класс дефектов в коде, называемых критическими ошибками. При разработке безопасного программного обеспечения (РБПО) такие дефекты должны в обязательном порядке выявляться и исправляться в приоритетном режиме. Статический анализатор PVS-Studio разрабатывается с учётом этого стандарта и позволяет выявлять все типы критических ошибок в коде программ, написанных на языках C, C++, C#, Java. Рассмотрим эти типы предупреждений и как их можно выделить среди других предупреждений, выдаваемых анализатором.
Типы критических ошибок согласно ГОСТ Р 71207-2024
ГОСТ Р 71207-2024 вводит понятие критические ошибки. Это дефекты программного кода, которые в сравнении с другими ошибками могут быть с большей вероятностью использованы злоумышленником для влияния на процесс работы программы. Если найден способ использования такого дефекта, он становится уязвимостью (vulnerability).
В стандарте приводится следующая формулировка (п. 3.1.13): "Критическая ошибка в программе — ошибка, которая может привести к нарушению безопасности обрабатываемой информации".
Выявление критических ошибок является обязательной составляющей статического анализа кода при построении процесса РБПО.
В ходе конфигурации должны быть выполнены выбор и включение типов предупреждений анализатора, соответствующих списку критических ошибок, приведённых в 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++. Для них перечислено большое количество типов критических ошибок по сравнению с другими языками.
PVS-Studio придерживается расширенной классификации на основании обсуждений по доработке стандарта в рамках мероприятия "Испытания статических анализаторов исходных кодов компилируемых и динамических языков программирования под руководством ФСТЭК России". На испытаниях эти виды ошибок входили в "Дополнительный набор тестов", поэтому было принято решение заранее разметить их как критические ошибки.
Подробнее о мероприятии "Испытания статических анализаторов исходных кодов компилируемых и динамических языков программирования под руководством ФСТЭК России":
- ФСТЭК России объявила о начале масштабных испытаний статических анализаторов;
- Испытания статических анализаторов.
Следующие типы диагностических правил дополнительно размечены в анализаторе PVS-Studio как выявляющие критические ошибки.
Для Java, Go и C#:
- ошибки разыменования нулевой ссылки;
- ошибки деления на ноль;
- ошибки управления динамической памятью;
- ошибки утечек памяти и ресурсов.
Для Python:
- ошибки деления на ноль.
Идентификаторы критических ошибок в PVS-Studio
Статический анализатор PVS-Studio добавляет специальные идентификаторы (флаги) к предупреждениям, которые относятся к критическим типам ошибок. Они относятся к столбцу SAST и начинаются с префикса 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. Использование такого метода фильтрации оставляет в итоговом отчёте только сообщения, имеющие маркировку по ГОСТ. Подробнее в документации.




