ГОСТ Р 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++:

  1. SEC-TAINT — ошибки непроверенного использования чувствительных данных (ввода пользователя, файлов, сети и пр.).

  2. SEC-OVERFLOW-OR-INT-UINT — ошибки целочисленного переполнения и некорректного совместного использования знаковых и беззнаковых чисел.

  3. SEC-BUF-OVERFLOW — ошибки переполнения буфера (записи или чтения за пределами выделенной для буфера памяти).

  4. SEC-SECURITY — ошибки некорректного использования системных процедур и интерфейсов, связанных с обеспечением информационной безопасности (шифрования, разграничения доступа и пр.).

  5. SEC-SYNCHRONIZATION — ошибки при работе с многопоточными примитивами (интерфейсами запуска потоков на выполнение, синхронизации и обмена данными между потоками и пр.).

  6. SEC-NULL — ошибки разыменования нулевого указателя.

  7. SEC-DIV-0 — ошибки деления на ноль.

  8. SEC-MEMORY — ошибки управления динамической памятью (выделения, освобождения, использования освобождённой памяти).

  9. SEC-STR-FORMAT — ошибки использования форматной строки.

  10. SEC-UNINITIALIZED — ошибки использования неинициализированных переменных.

  11. SEC-LEAKS — ошибки утечек памяти, незакрытых файловых дескрипторов и дескрипторов сетевых соединений.

Все идентификаторы критических ошибок для языка C# и Java:

  1. SEC-TAINT — ошибки непроверенного использования чувствительных данных (ввода пользователя, файлов, сети и пр.).

  2. SEC-OVERFLOW-OR-INT-UINT — ошибки целочисленного переполнения и некорректного совместного использования знаковых и беззнаковых чисел.

  3. SEC-BUF-OVERFLOW — ошибки переполнения буфера (записи или чтения за пределами выделенной для буфера памяти).

  4. SEC-SECURITY — ошибки некорректного использования системных процедур и интерфейсов, связанных с обеспечением информационной безопасности (шифрования, разграничения доступа и пр.).

  5. SEC-SYNCHRONIZATION — ошибки при работе с многопоточными примитивами (интерфейсами запуска потоков на выполнение, синхронизации и обмена данными между потоками и пр.).

  6. SEC-NULL — ошибки разыменования нулевой ссылки [расширение: см. предыдущую главу].

  7. SEC-DIV-0 — ошибки деления на ноль [расширение: см. предыдущую главу].

  8. SEC-MEMORY — ошибки управления динамической памятью (выделения, освобождения, использования освобождённой памяти) [расширение: см. предыдущую главу].

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

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

  1. Андрей Карпов. PVS-Studio соответствует требованиям ГОСТ Р 71207—2024 (статический анализ программного обеспечения).

  2. Запись доклада Андрей Карпов на GigaConf-2024. Использование статического анализатора в разработке безопасного программного обеспечения (ГОСТ Р 71207-2024) на примере PVS-Studio.

  3. Андрей Карпов. ГОСТ Р 71207–2024 глазами разработчика статических анализаторов кода.

  4. Подкаст Ever Secure. Статический анализ по-серьезному.

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