﻿# Диагностические правила группы OWASP в PVS\-Studio

Статический анализатор PVS\-Studio позволяет автоматически находить в исходном коде различные проблемы\. Среди его возможностей есть и поиск несоответствий стандарту OWASP Application Security Verification Standard\. По умолчанию данный функционал отключен в силу специфичности некоторых диагностических правил\. Тем не менее, его можно без труда включить и использовать для проверки своего кода\. В этой заметке описаны различные способы проверки кода на соответствие OWASP ASVS с помощью PVS\-Studio\.

![0874_PVS-Studio_OWASP_ru/image1.png](https://import.viva64.com/docx/blog/0874_PVS-Studio_OWASP_ru/image1.png)

## Включение правил из группы OWASP

Все существующие диагностические правила описаны на странице "[Сообщения PVS\-Studio](https://pvs-studio.ru/ru/docs/warnings/)"\. Если вас интересуют именно правила из группы OWASP, то вам также могут быть полезны соответствия предупреждений PVS\-Studio согласно:

* [OWASP Application Security Verification Standard \(ASVS\)](https://pvs-studio.ru/ru/pvs-studio/sast/owasp/)
* [OWASP Top 10 Web Application Security Risks](https://pvs-studio.ru/ru/pvs-studio/sast/owasptopten/)

Как было отмечено выше, правила, связанные с OWASP, по умолчанию отключены\. Далее представлены различные возможности их включения и настройки\.

### Использование плагина для IDE

Если вы запускаете анализ PVS\-Studio при помощи плагина для Visual Studio или какой\-либо другой IDE, то активировать правила из группы OWASP можно через графический интерфейс\.

Для этого необходимо перейти в настройки анализатора\. К примеру, в Visual Studio 2019 нужно перейти в Extensions \-\> PVS\-Studio \-\> Options:

![0874_PVS-Studio_OWASP_ru/image2.png](https://import.viva64.com/docx/blog/0874_PVS-Studio_OWASP_ru/image2.png)

Для других IDE способы их открытия могут немного отличаться\. Более подробную информацию, включая информацию о способах открытия настроек в других IDE, можно найти в разделе "[Знакомство со статическим анализатором кода PVS\-Studio на Windows](https://pvs-studio.ru/ru/docs/manual/0007/)"\.

В настройках необходимо перейти на вкладку "Detectable Errors" для интересующего вас языка\. Здесь нужно изменить значение для группы OWASP:

![0874_PVS-Studio_OWASP_ru/image4.png](https://import.viva64.com/docx/blog/0874_PVS-Studio_OWASP_ru/image4.png)

По умолчанию для группы OWASP выбрано значение 'Disabled'\. Оно приводит к полному отключению соответствующих диагностик для данного языка\. Чтобы включить их, нужно выбрать 'Custom', 'Show All' или 'Hide All' в зависимости от ваших целей\. Подробнее об этих и других настройках можно прочитать в [документации](https://pvs-studio.ru/ru/docs/)\. Например, описание вкладки "Detectable Errors" представлено в разделе "[Настройки: Detectable Errors](https://pvs-studio.ru/ru/docs/manual/0013/)"\.

Если было выбрано значение 'Show All', то все правила из группы будут включены и соответствующие предупреждения будут отображаться в окне вывода PVS\-Studio\. При этом в верхней части окна появится кнопка, отвечающая за отображение или скрытие предупреждений из соответствующей группы:

![0874_PVS-Studio_OWASP_ru/image6.png](https://import.viva64.com/docx/blog/0874_PVS-Studio_OWASP_ru/image6.png)

Здесь можно обратить внимание, что для предупреждений из группы OWASP указан соответствующий SAST\-идентификатор\. Кроме того, почти для всех предупреждений указывается подходящий им CWE\. Подробно о способах настройки окна вывода предупреждений можно прочесть в разделе "[Работа со списком диагностических сообщений в Visual Studio](https://pvs-studio.ru/ru/docs/manual/0021/)"\. Работа с окном в других IDE производится схожим образом\.

### Использование анализатора из командной строки

Если анализ запускается через интерфейс командной строки, то скорее всего файл настроек будет нужно отредактировать вручную \(то есть не через графический интерфейс\)\.

В некоторых случаях настройка анализатора для разных языков отличается; также может отличаться работа под разными ОС\. Ниже представлены краткие описания способов включения OWASP\-правил в различных ситуациях\.

#### Включение OWASP в C\# анализаторе

Главным образом настройка C\#\-анализатора под любой ОС состоит в редактировании файла Settings\.xml\. Стоит заметить, что это тот же самый файл, который используется плагинами для Visual Studio, CLion и Rider\.

По умолчанию файл лежит по пути:

* "%APPDATA%\\PVS\-Studio\\Settings\.xml" на Windows;
* "\~/\.config/PVS\-Studio/Settings\.xml" на Linux/macOS\.

Также путь к настройкам может быть передан в качестве аргумента командной строки при запуске анализа\. Подробнее об этом можно прочитать в разделе "[Проверка проектов Visual Studio/MSBuild/\.NET из командной строки с помощью PVS\-Studio](https://pvs-studio.ru/ru/docs/manual/0035/)"\.

Настройки анализатора хранятся в формате XML\. Для включения правил из группы OWASP необходимо обратить внимание на следующие узлы:

* DisableOWASPAnalysisCs – если _false_, то правила из группы OWASP для C\# анализатора будут **включены**, если _true_, то наоборот \- **отключены**;
* DisableDetectableErrors – узел, содержащий список кодов правил, разделяемых **пробелом** \(примеры кодов диагностик: [V3163](https://pvs-studio.ru/ru/docs/warnings/v3163/), [V5608](https://pvs-studio.ru/ru/docs/warnings/v5608/), [V3022](https://pvs-studio.ru/ru/docs/warnings/v3022/)\)\. Отображение этих правил будет отключено\.

Соответственно, для включения проверки соответствия кода стандарту OWASP необходимо записать в 'DisableOWASPAnalysis' и 'DisableOWASPAnalysisCs' соответствующие значения, а также убедиться, что интересующие вас правила не записаны в узле 'DisableDetectableErrors'\.

#### Включение OWASP в C\+\+ анализаторе

**Windows**

Для настройки C\+\+ анализатора на Windows также может быть использован файл Settings\.xml \(описание выше\)\. Это возможно, если для анализа используется:

* плагин для Visual Studio, Rider или CLion;
* консольная утилита PVS\-Studio\_Cmd;
* C and C\+\+ Compiler Monitoring UI\.

Для включения правил из группы OWASP необходимо установить подходящие значения для узлов 'DisableOWASPAnalysis' \(аналог 'DisableOWASPAnalysisCs' для C\+\+\) и 'DisableDetectableErrors'\.

Иногда может возникать необходимость в запуске C\+\+ анализатора напрямую \(через PVS\-Studio\.exe\)\. Задание настроек в таком случае будет производиться с помощью файла '\*\.cfg'\. Путь к нему должен передаваться в качестве значения параметра '\-\-cfg':

```cpp
PVS-Studio.exe --cfg "myConfig.cfg"
```

Подробно про запуск анализа таким образом можно прочитать в разделе "[Прямая интеграция анализатора в системы автоматизации сборки \(C/C\+\+\)](https://pvs-studio.ru/ru/docs/manual/0006/)"\. Для включения же правил группы OWASP в конфигурационном файле необходимо проверить значение параметра 'analysis\-mode'\. Оно позволяет управлять включёнными группами диагностик\. Оно должно быть суммой чисел, соответствующих включённым группам\. К примеру, '4' соответствует анализу общего назначения, а '128' – анализу с использованием правил группы OWASP\. Для того, чтобы использовать только эти 2 группы, в 'analysis\-mode' нужно передать '132'\. Если данный параметр не задан \(или значение 0\), то при анализе будут использоваться все доступные группы, в том числе и OWASP\.

Кроме того, аналогичный параметр можно задавать в качестве аргумента командной строки:

```cpp
PVS-Studio.exe --analysis-mode 132 ....
```

**Linux**

Задание настроек под Linux производится примерно так же, как и при использовании 'PVS\-Studio\.exe'\. Анализ производится с помощью команды 'pvs\-studio\-analyzer analyze'\. Среди её параметров стоит отметить 'analysis\-mode' и 'cfg'\.

'\-\-analysis\-mode' \(или '\-a'\) устанавливает группы предупреждений, которые будут включены при анализе\. Для включения правил из группы OWASP необходимо, чтобы в списке групп, разделяемых ';', присутствовало значение 'OWASP'\. Например:

```cpp
pvs-studio-analyzer analyze .... -a GA;MISRA;OWASP
```

'\-\-cfg' \(или '\-c'\) позволяет задать путь к специальному файлу конфигурации '\*\.cfg', который аналогичен тому, что используется для работы 'PVS\-Studio\.exe' \(описание приведено чуть выше\)\.

Подробную информацию можно найти в разделе "[Как запустить PVS\-Studio в Linux и macOS](https://pvs-studio.ru/ru/docs/manual/0036/)"\.

#### Включение OWASP в Java анализаторе

Работе с Java анализатором посвящён раздел "[Как запустить PVS\-Studio Java](https://pvs-studio.ru/ru/docs/manual/6703/)"\. В нём представлена вся информация, необходимая для запуска анализа, включения диагностик группы OWASP и т\. д\. Ниже записаны краткие сведения о настройках, которые нужно задать для активации OWASP\.

В зависимости от того, каким именно образом вы производите анализ проектов, меняется и способ включения правил группы OWASP\.

К примеру, если вы используете плагин для Maven \('pvsstudio\-maven\-plugin'\), то в его конфигурации \(в файле 'pom\.xml'\) необходимо добавить в узел <analysisMode\> значение 'OWASP', а также проверить значения в узлах <enabledWarnings\> и <disabledWarnings\>\. Пример:

```cpp
<build>
  <plugins>
    <plugin>
      <groupId>com.pvsstudio</groupId>
      <artifactId>pvsstudio-maven-plugin</artifactId>
      <version>7.14.50353</version>
      <configuration>
        <analyzer>
          <outputType>text</outputType>
          <outputFile>path/to/output.txt</outputFile>
          <analysisMode>GA,OWASP</analysisMode>
        </analyzer>
      </configuration>
    </plugin>
  </plugins>
</build>
```

Если для анализа используется плагин для Gradle, необходимо открыть файл 'build\.gradle' и отредактировать в блоке 'pvsstudio' значение 'analysisMode', а также проверить 'enabledWarnings' и 'disabledWarnings'\. Пример:

```cpp
apply plugin: com.pvsstudio.PvsStudioGradlePlugin
pvsstudio {
  outputType = 'text'
  outputFile = 'path/to/output.txt'
  analysisMode = ["GA", "OWASP"]
}
```

Для обоих плагинов существует и возможность конфигурирования через командную строку \(подробнее [тут](https://pvs-studio.ru/ru/docs/manual/6703/)\)\.

## Отключение и настройка отдельных диагностических правил

После включения правил из группы OWASP может оказаться, что срабатывания некоторых из них на вашем проекте неактуальны\. Например, [V5606](https://pvs-studio.ru/ru/docs/warnings/v5606/) отвечает за проверку соответствия кода позиции 7\.4\.2 из [OWASP ASVS](https://raw.githubusercontent.com/OWASP/ASVS/v4.0.2/4.0/OWASP%20Application%20Security%20Verification%20Standard%204.0.2-en.pdf):

_Verify that exception handling \(or a functional equivalent\) is used across the codebase to account for expected and unexpected error conditions\._

В соответствии с указанным требованием, правило [V5606](https://pvs-studio.ru/ru/docs/warnings/v5606/) генерирует сообщение в случае, если обнаруживает пустой блок _catch_ или _finally_\.

Вполне возможно, что в вашем проекте наличие пустых блоков обработки исключений является приемлемым\. В этом случае сообщения [V5606](https://pvs-studio.ru/ru/docs/warnings/v5606/) вам совершенно не интересны и для удобства их стоит убрать из вывода анализатора, использовав один из описанных далее способов\.

### Использование общих настроек

Одним из вариантов в описанной ситуации является скрытие сообщений некоторых правил с помощью общих настроек анализатора\. Для этого можно либо вручную отредактировать настройки \(этот момент описан выше\), либо сделать это с помощью плагина для IDE:

![0874_PVS-Studio_OWASP_ru/image8.png](https://import.viva64.com/docx/blog/0874_PVS-Studio_OWASP_ru/image8.png)

### Использование файлов pvsconfig

#### Преимущества использования pvsconfig

Стоит отметить, что при использовании настроек в плагине для IDE или редактировании 'Settings\.xml' **отдельные диагностики нельзя по\-настоящему отключить** \(только группы целиком\)\. Вместо этого генерируемые сообщения просто будут скрыты при просмотре лога в IDE\. В некоторых случаях такое поведение может быть удобным, однако в других логичнее будет полностью отключить диагностику\.

Кроме того, бывают ситуации, когда необходимо отключить срабатывания определённых уровней\. 

К примеру, некоторые правила, реализующие [taint\-анализ](https://pvs-studio.ru/ru/blog/terms/6496/), считают параметры публично доступных методов источниками потенциально заражённых данных\. Пояснение такого поведения можно найти в заметке "[Почему важно проверять значения параметров общедоступных методов](https://pvs-studio.ru/ru/blog/posts/csharp/0835/)"\. Предупреждение, в котором источником заражения является параметр метода, выдаётся с низким уровнем\.

Вполне возможно, что для вашего проекта предупреждения о необходимости валидации параметров неактуальны, однако полностью отключать правило или скрывать его предупреждения тоже не хочется\. Было бы куда удобнее отключить предупреждения с конкретным уровнем\.

Такую возможность, а также полное отключение диагностики, переопределение уровня и т\.д\. предоставляют файлы pvsconfig\.

#### Создание pvsconfig

Файлы с расширением pvsconfig позволяют обеспечить дополнительную настройку анализа\. На данный момент они могут быть использованы при анализе проектов на C\+\+ и C\#\.

На странице "[Подавление ложных предупреждений](https://pvs-studio.ru/ru/docs/manual/0017/)" описаны как возможности отключения диагностик с помощью pvsconfig, так и другие способы исключения нежелательных срабатываний\. Прочие возможности, такие как изменение уровней предупреждений или замена подстрок в сообщениях, описаны в разделе "[Дополнительная настройка диагностик](https://pvs-studio.ru/ru/docs/manual/0040/)"\.

В общем для использования функционала достаточно просто добавить файл с расширением pvsconfig в проект или решение\. 

Удобнее всего pvsconfig создавать через IDE, используя специальный шаблон:

![0874_PVS-Studio_OWASP_ru/image10.png](https://import.viva64.com/docx/blog/0874_PVS-Studio_OWASP_ru/image10.png)

В этом случае созданный файл будет заполнен различными закомментированными примерами, что серьёзно упростит написание собственных инструкций:

```cpp
# Example of PVS-Studio rules configuration file. 
# Full documentation is available at
# https://pvs-studio.com/en/docs/manual/full/
# https://pvs-studio.com/en/docs/manual/0040/
#
# Filtering out messages by specifying a fragment from source code:
# //-V:textFromSourceCode:3001,3002,3003
#
# Turning off specific analyzer rules:
# //-V::3021,3022
#
# Changing in analyzer's output message:
# //+V3022:RENAME:{oldText0:newText0},{oldText1:newText1}
#
# Appends message to analyzer's message:
# //+V3023:ADD:{Message}
#
# Excluding directories from the analysis:
# //V_EXCLUDE_PATH \thirdParty\
# //V_EXCLUDE_PATH C:\TheBestProject\thirdParty
# //V_EXCLUDE_PATH *\UE4\Engine\*
#
# Redefining levels:
# //V_LEVEL_1::501,502
# //V_LEVEL_2::522,783,579
# //V_LEVEL_3::773
#
# Disabling groups of diagnostics:
# //-V::GA
# //-V::GA,OWASP
#
# Disabling messages with specified warning levels:
# //-V::3002:3
# //-V::3002,3008:3
# //-V::3002,3008:2,3
#
# Rule filters should be written without '#' character.
```

Несложно заметить, что pvsconfig предоставляет достаточно большое количество различных способов настройки анализа – от изменения уровня до изменения самих выводимых сообщений или полного отключения диагностик\. Далее представлены примеры использования некоторых возможностей pvsconfig\.

**Примечание\.** Некоторые функции могут быть доступны только для конкретных анализаторов – подробнее об этом в разделах "[Подавление ложных предупреждений](https://pvs-studio.ru/ru/docs/manual/0017/)" и "[Дополнительная настройка диагностик](https://pvs-studio.ru/ru/docs/manual/0040/)"\.

#### Пример отключения правила

Для отключения, к примеру, правила [V5606](https://pvs-studio.ru/ru/docs/warnings/v5606/) \(о пустых _catch_ и _finally_\), необходимо добавить в файл следующую строку:

```cpp
//-V::5606
```

#### Пример отключения предупреждений заданного уровня

Также можно и отключить выдачу диагностикой предупреждений конкретного уровня\. Ранее мы рассматривали пример с taint\-диагностиками, выдающими предупреждения на 3 уровне, если источником заражения является параметр\. Если вам нужно, к примеру, убрать предупреждения о потенциальных SQL\-инъекциях, где источником заражения будет являться параметр, то в pvsconfig нужно добавить строку

```cpp
//-V::5608:3
```

В результате предупреждения 3 уровня диагностики [V5608](https://pvs-studio.ru/ru/docs/warnings/v5608/) будут исключены из результатов анализа\.

#### Пример переопределения уровня

Ещё одной удобной возможностью pvsconfig является переопределение уровня выдаваемых диагностикой предупреждений\. К примеру, можно переопределить уровень всех срабатываний [V5609](https://pvs-studio.ru/ru/docs/warnings/v5609/):

```cpp
//V_LEVEL_2::5609
```

Данная строка проинструктирует анализатор формировать предупреждения правила [V5609](https://pvs-studio.ru/ru/docs/warnings/v5609/) со 2 \(средним\) уровнем достоверности\.

## Заключение

Если у вас возникли какие\-то сложности при работе с анализатором или вы столкнулись с проблемами \- пожалуйста, [напишите нам в поддержку](https://pvs-studio.ru/ru/about-feedback/)\.

С другими статьями на тему безопасности вы можете ознакомиться в блоге PVS\-Studio по тегу [\#Security](https://pvs-studio.ru/ru/blog/posts/?tag=Security)\.