﻿# Работа с предупреждениями, выявляющими критические ошибки согласно ГОСТ Р 71207\-2024

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

## Типы критических ошибок согласно ГОСТ Р 71207\-2024

ГОСТ Р 71207\-2024 вводит понятие [**критические ошибки**](https://pvs-studio.ru/ru/blog/terms/6441/)\. Это дефекты программного кода, которые в сравнении с другими ошибками могут быть с большей вероятностью использованы злоумышленником для влияния на процесс работы программы\. Если найден способ использования такого дефекта, он становится уязвимостью \(vulnerability\)\.

В стандарте приводится следующая формулировка \(п\. 3\.1\.13\): "Критическая ошибка в программе — ошибка, которая может привести к нарушению безопасности обрабатываемой информации"\.

Выявление критических ошибок является обязательной составляющей статического анализа кода при построении процесса РБПО\.

<details>
   <summary>Выдержка из ГОСТ Р 71207\\\-2024 \\\(п\\\. 5\\\.4\\\)</summary>

В ходе конфигурации должны быть выполнены выбор и включение типов предупреждений анализатора, соответствующих списку **критических ошибок**, приведённых в 6\.3\. В ходе конфигурации могут быть также включены другие типы предупреждений анализатора, соответствующих другим потенциальным ошибкам, специфичным для анализируемого ПО \(дефекты кодирования для языка программирования ПО, принятые стили кодирования и пр\.\)\.

\.\.\.

После анализа результатов первичной разметки конфигурация статического анализатора может быть доработана, в частности могут быть включены дополнительные типы предупреждений, выполнена настройка анализатора на используемые в заданном ПО заимствованные компоненты, доработаны и настроены алгоритмы выдачи конкретных типов предупреждений и пр\. Кроме того, статический анализатор может быть по\-разному настроен для различных компонентов анализируемого ПО, например для тестов **искать только критические ошибки**\.


</details>
Типы критических ошибок, которые должны выявлять статические анализаторы, рассматриваются в 6\-м [разделе ГОСТ Р 71207\-2024](https://protect.gost.ru/v.aspx?control=8&baseC=6&page=3&month=2&year=2024&search=&RegNum=1&DocOnPageCount=15&id=246347)\. **Для компилируемых языков это:**

* 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 придерживается расширенной классификации на основании обсуждений по доработке стандарта в рамках мероприятия "Испытания статических анализаторов исходных кодов компилируемых и динамических языков программирования под руководством ФСТЭК России"\. На испытаниях эти виды ошибок входили в "Дополнительный набор тестов", поэтому было принято решение заранее разметить их как критические ошибки\.

Подробнее о мероприятии "Испытания статических анализаторов исходных кодов компилируемых и динамических языков программирования под руководством ФСТЭК России":

* [ФСТЭК России объявила о начале масштабных испытаний статических анализаторов](https://ib-bank.ru/bisjournal/news/21667);
* [Испытания статических анализаторов](https://ib-bank.ru/bisjournal/post/2388)\.

Следующие типы диагностических правил дополнительно размечены в анализаторе PVS\-Studio как выявляющие критические ошибки\.

**Для Java, Go и C\#**:

* ошибки разыменования нулевой ссылки;
* ошибки деления на ноль;
* ошибки управления динамической памятью;
* ошибки утечек памяти и ресурсов\.

**Для Python**: 

* ошибки деления на ноль\.

## Идентификаторы критических ошибок в PVS\-Studio

Статический анализатор PVS\-Studio добавляет специальные идентификаторы \(флаги\) к предупреждениям, которые относятся к критическим типам ошибок\. Они относятся к столбцу SAST и начинаются с префикса `SEC-` \(сокращение от `SECURITY`\)\.

Он означает, что эти предупреждения выявляют ошибки, наиболее связанные с разработкой безопасного программного обеспечения\.

![SecurityRelatedIssues_GOST_ru/image2.png](https://import.viva64.com/docx/blog/SecurityRelatedIssues_GOST_ru/image2.png)

Некоторые детекторы анализатора могут выдавать предупреждения, имеющие сразу два идентификатора\. Причина в том, что одна и та же ошибка может быть интерпретирована как дефект разного типа\. Например, пользователь вводит число, которое без предварительной проверки используется как индекс массива, что может привести к выходу за границу массива\. В этом случае предупреждение будет одновременно помечено двумя идентификаторами:

* `SEC-TAINT` — ошибка непроверенного использования чувствительных данных;
* `SEC-BUF-OVERFLOW` — ошибка переполнения буфера\.

**Все идентификаторы критических ошибок для языков C и C\+\+:**

1. `SEC-TAINT` — ошибки непроверенного использования чувствительных данных \(ввода пользователя, файлов, сети и пр\.\);
1. `SEC-OVERFLOW-OR-INT-UINT` — ошибки целочисленного переполнения и некорректного совместного использования знаковых и беззнаковых чисел;
1. `SEC-BUF-OVERFLOW` — ошибки переполнения буфера \(записи или чтения за пределами выделенной для буфера памяти\);
1. `SEC-SECURITY` — ошибки некорректного использования системных процедур и интерфейсов, связанных с обеспечением информационной безопасности \(шифрования, разграничения доступа и пр\.\);
1. `SEC-SYNCHRONIZATION` — ошибки при работе с многопоточными примитивами \(интерфейсами запуска потоков на выполнение, синхронизации и обмена данными между потоками и пр\.\);
1. `SEC-NULL` — ошибки разыменования нулевого указателя;
1. `SEC-DIV-0` — ошибки деления на ноль;
1. `SEC-MEMORY` — ошибки управления динамической памятью \(выделения, освобождения, использования освобождённой памяти\);
1. `SEC-STR-FORMAT` — ошибки использования форматной строки;
1. `SEC-UNINITIALIZED` — ошибки использования неинициализированных переменных;
1. `SEC-LEAKS` — ошибки утечек памяти, незакрытых файловых дескрипторов и дескрипторов сетевых соединений\.

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

1. `SEC-TAINT` — ошибки непроверенного использования чувствительных данных \(ввода пользователя, файлов, сети и пр\.\);
1. `SEC-OVERFLOW-OR-INT-UINT` — ошибки целочисленного переполнения и некорректного совместного использования знаковых и беззнаковых чисел;
1. `SEC-BUF-OVERFLOW` — ошибки переполнения буфера \(записи или чтения за пределами выделенной для буфера памяти\);
1. `SEC-SECURITY` — ошибки некорректного использования системных процедур и интерфейсов, связанных с обеспечением информационной безопасности \(шифрования, разграничения доступа и пр\.\);
1. `SEC-SYNCHRONIZATION` — ошибки при работе с многопоточными примитивами \(интерфейсами запуска потоков на выполнение, синхронизации и обмена данными между потоками и пр\.\);
1. `SEC-NULL` — ошибки разыменования нулевой ссылки \[расширение: см\. предыдущую главу\];
1. `SEC-DIV-0` — ошибки деления на ноль \[расширение: см\. предыдущую главу\];
1. `SEC-MEMORY` — ошибки управления динамической памятью \(выделения, освобождения, использования освобождённой памяти\) \[расширение: см\. предыдущую главу\];
1. `SEC-LEAKS` — ошибки утечек памяти, незакрытых файловых дескрипторов и дескрипторов сетевых соединений \[расширение: см\. предыдущую главу\]\.

## Включение отображения критических ошибок в PVS\-Studio

Начиная с версии 7\.37, в PVS\-Studio появилась возможность размечать предупреждения, связанные с безопасностью\. Отображение `SEC`\-идентификаторов осуществляется следующим образом\. 

Включение советующих настроек в интегрированных средах разработки:

### Visual Studio

**Options \> PVS\-Studio \> Specific Analyzer Settings \> Analysis \> SecurityRelatedIssues**\.

![SecurityRelatedIssues_GOST_ru/image4.png](https://import.viva64.com/docx/blog/SecurityRelatedIssues_GOST_ru/image4.png)

### VS Code

**PVS\-Studio Settings \> Other \> Security Related Issues**\. 

![SecurityRelatedIssues_GOST_ru/image6.png](https://import.viva64.com/docx/blog/SecurityRelatedIssues_GOST_ru/image6.png)

### Сборочные системы, командные строки

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

* Gradle: `securityRelatedIssues`\. Подробнее в [документации](https://pvs-studio.ru/ru/docs/manual/6706/)\.
* Maven: `<securityRelatedIssues>`\. Подробнее в [документации](https://pvs-studio.ru/ru/docs/manual/6705/)\.

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

* C и C\+\+ анализатор \(`pvs-studio-analyzer`\): `--security-related-issues`\. Подробнее в [документации](https://pvs-studio.ru/ru/docs/manual/6615/)\.
* C, C\+\+ и C\# анализатор \(`PVS-Studio_Cmd`\): `--securityRelatedIssues`\. Подробнее в [документации](https://pvs-studio.ru/ru/docs/manual/0035/)\. 
* Java анализатор \(`pvs-studio.jar`\): `--security-related-issues`\. Подробнее в [документации](https://pvs-studio.ru/ru/docs/manual/6703/)\.

Настройка анализатора при помощи файлов конфигурации диагностик \(`.pvsconfig`\) через специальный параметр `V_SEC_ID`\. Подробнее в [документации](https://pvs-studio.ru/ru/docs/manual/6630/)\.

## Фильтрация критических ошибок в PVS\-Studio

В плагинах PVS\-Studio для сред разработки представлен механизм быстрой фильтрации отчёта анализатора по заданным ключевым словам\. Например, в Visual Studio можно открыть панель быстрой фильтрации с помощью кнопки **Quick Filters** на панели инструментов окна PVS\-Studio\.

Для того, чтобы в отчёте остались только критические ошибки, имеющие маркировку согласно ГОСТ, следует прописать префикс `SEC` в поле **Filter SAST\.**

![SecurityRelatedIssues_GOST_ru/image8.png](https://import.viva64.com/docx/blog/SecurityRelatedIssues_GOST_ru/image8.png)

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

![SecurityRelatedIssues_GOST_ru/image10.png](https://import.viva64.com/docx/blog/SecurityRelatedIssues_GOST_ru/image10.png)

Механизм фильтрации отчёта через конвертер \(`plog-converter`, `PlogConverter.exe`\) осуществляется с помощью флага `filterSecurityRelatedIssues`\. Использование такого метода фильтрации оставляет в итоговом отчёте только сообщения, имеющие маркировку по ГОСТ\. Подробнее в [документации](https://pvs-studio.ru/ru/docs/manual/0038/)\.