ГОСТ Р 71207-2024 "Статический анализ кода" выделят класс дефектов в коде, называемых критическими ошибками. При разработке безопасного программного обеспечения (РБПО) такие дефекты должны в обязательном порядке выявляться и исправляться в приоритетном режиме. Статический анализатор PVS-Studio разрабатывается с учётом этого стандарта и позволяет выявлять все типы критических ошибок в коде программ, написанных на языках C, C++, C#, Java. Рассмотрим эти типы предупреждений и как их можно выделить среди других предупреждений, выдаваемых анализатором.
ГОСТ Р 71207-2024 вводит понятие критические ошибки. Это дефекты программного кода, которые в сравнении с другими ошибками могут быть с большей вероятностью использованы злоумышленником для влияния на процесс работы программы. Если найден способ использования такого дефекта, он становится уязвимостью (vulnerability).
В стандарте приводится следующая формулировка (п. 3.1.13): "Критическая ошибка в программе — ошибка, которая может привести к нарушению безопасности обрабатываемой информации".
Выявление критических ошибок является обязательной составляющей статического анализа кода при построении процесса РБПО.
В ходе конфигурации должны быть выполнены выбор и включение типов предупреждений анализатора, соответствующих списку критических ошибок, приведённых в 6.3. В ходе конфигурации могут быть также включены другие типы предупреждений анализатора, соответствующих другим потенциальным ошибкам, специфичным для анализируемого ПО (дефекты кодирования для языка программирования ПО, принятые стили кодирования и пр.).
...
После анализа результатов первичной разметки конфигурация статического анализатора может быть доработана, в частности могут быть включены дополнительные типы предупреждений, выполнена настройка анализатора на используемые в заданном ПО заимствованные компоненты, доработаны и настроены алгоритмы выдачи конкретных типов предупреждений и пр. Кроме того, статический анализатор может быть по-разному настроен для различных компонентов анализируемого ПО, например для тестов искать только критические ошибки.
Типы критических ошибок, которые должны выявлять статические анализаторы, рассматриваются в 6-м разделе ГОСТ Р 71207-2024. Для компилируемых языков это:
Для интерпретируемых языков это:
Дополнительные типы критических ошибок, для C и C++:
Стандарт ГОСТ Р 71207-2024 наиболее проработан для языков C и C++. Для них перечислено большое количество типов критических ошибок по сравнению с другими языками.
PVS-Studio придерживается расширенной классификации на основании обсуждений по доработке стандарта в рамках мероприятия "Испытания статических анализаторов исходных кодов компилируемых и динамических языков программирования под руководством ФСТЭК России". На испытаниях эти виды ошибок входили в "Дополнительный набор тестов", поэтому было принято решение заранее разметить их как критические ошибки.
Подробнее о мероприятии "Испытания статических анализаторов исходных кодов компилируемых и динамических языков программирования под руководством ФСТЭК России":
Следующие типы диагностических правил дополнительно размечены в анализаторе PVS-Studio как выявляющие критические ошибки.
Для Java, Go и C#:
Для Python:
Статический анализатор 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 — ошибки утечек памяти, незакрытых файловых дескрипторов и дескрипторов сетевых соединений [расширение: см. предыдущую главу].Начиная с версии 7.37, в PVS-Studio появилась возможность размечать предупреждения, связанные с безопасностью. Отображение SEC-идентификаторов осуществляется следующим образом.
Включение советующих настроек в интегрированных средах разработки:
Options > PVS-Studio > Specific Analyzer Settings > Analysis > SecurityRelatedIssues.
PVS-Studio Settings > Other > Security Related Issues.
Настройка анализатора в сборочных системах через специальный параметр:
securityRelatedIssues. Подробнее в документации.<securityRelatedIssues>. Подробнее в документации.Запуск анализатора через командную строку с использованием специального флага:
pvs-studio-analyzer): --security-related-issues. Подробнее в документации.PVS-Studio_Cmd): --securityRelatedIssues. Подробнее в документации. pvs-studio.jar): --security-related-issues. Подробнее в документации.Настройка анализатора при помощи файлов конфигурации диагностик (.pvsconfig) через специальный параметр V_SEC_ID. Подробнее в документации.
В плагинах PVS-Studio для сред разработки представлен механизм быстрой фильтрации отчёта анализатора по заданным ключевым словам. Например, в Visual Studio можно открыть панель быстрой фильтрации с помощью кнопки Quick Filters на панели инструментов окна PVS-Studio.
Для того, чтобы в отчёте остались только критические ошибки, имеющие маркировку согласно ГОСТ, следует прописать префикс SEC в поле Filter SAST.
Для отображения одного конкретного типа критических ошибок следует прописать соответствующий идентификатор.
Механизм фильтрации отчёта через конвертер (plog-converter, PlogConverter.exe) осуществляется с помощью флага filterSecurityRelatedIssues. Использование такого метода фильтрации оставляет в итоговом отчёте только сообщения, имеющие маркировку по ГОСТ. Подробнее в документации.