Мы используем куки, чтобы пользоваться сайтом было удобно.
Хорошо
to the top
>
>
Фильтрация предупреждений...

Фильтрация предупреждений PVS-Studio, выявляющих критические ошибки (согласно классификации ГОСТ Р 71207-2024)

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

Одним из процессов разработки безопасного программного обеспечения (ГОСТ Р 56939-2024, п. 5.10.) является статический анализ кода. Он применяется с целью предотвращения внесения потенциально опасных конструкций и ошибок в ПО, а также использования опасных конструкций и уязвимостей из заимствованного кода (ГОСТ Р 56939-2024, п. 5.10.1.1.)

Статический анализ исходного кода программы. Вид работ по инструментальному исследованию программы, основанный на анализе исходных текстов программы с использованием специализированных инструментальных средств (статических анализаторов) в режиме, не предусматривающем исполнения кода, и выполняемый для определения свойств программы; в частности, статический анализ применяется для выявления потенциальных ошибок в программе.

Детальнее методология статического анализа кода разбирается в отдельном ГОСТ Р 71207-2024.

ГОСТ Р 71207-2024 — РАЗРАБОТКА БЕЗОПАСНОГО ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ. Статический анализ программного обеспечения. Общие требования. Разработан ФСТЭК России и ИСП РАН. Впервые введён в действие 01.04.2024.

Входит в комплекс стандартов, направленных на предотвращение уязвимостей в программах, и применяется совместно с ГОСТ Р 56939-2016/2024.

Типы критических ошибок согласно ГОСТ Р 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++. Для них перечислено большое количество типов критических ошибок по сравнению с другими языками.

Надо понимать, что первая версия стандарта задала отправную точку, и в дальнейшем список критических ошибок планируется расширить. Уже сейчас в ходе разработки методики испытаний статических анализаторов на соответствие ГОСТ Р 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.

Настройка анализатора в сборочных системах через специальный параметр:

Запуск анализатора через командную строку с использованием специального флага:

  • 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.

Дополнительные ссылки

Последние статьи:

Опрос:

book gost

Дарим
электронную книгу
за подписку!

Популярные статьи по теме


Комментарии (0)

Следующие комментарии next comments
close comment form
close form

Заполните форму в два простых шага ниже:

Ваши контактные данные:

Шаг 1
Поздравляем! У вас есть промокод!

Тип желаемой лицензии:

Шаг 2
Team license
Enterprise license
close form
Запросите информацию о ценах
Новая лицензия
Продление лицензии
--Выберите валюту--
USD
EUR
RUB
close form
Бесплатная лицензия PVS‑Studio для специалистов Microsoft MVP
close form
Для получения лицензии для вашего открытого
проекта заполните, пожалуйста, эту форму
close form
Я хочу принять участие в тестировании
* Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

close form
check circle
Ваше сообщение отправлено.

Мы ответим вам на


Если вы так и не получили ответ, пожалуйста, проверьте, отфильтровано ли письмо в одну из следующих стандартных папок:

  • Промоакции
  • Оповещения
  • Спам