PVS-Studio 7.18: обновления и улучшения

0934_Release_7_18_ru/image1.png


Мы выпустили новый релиз PVS-Studio – 7.18. В этой заметке расскажем, как развиваем security-направление, зачем нужна новая система типов в C++ анализаторе, как улучшили анализ кода для embedded-систем и не только.


Находим ещё больше дефектов безопасности: 9 из 10 категорий OWASP Top 10 2021


Мы продолжаем развивать PVS-Studio как SAST-решение. Это позволяет пользователям находить ещё больше потенциальных уязвимостей.


Одно из основных направлений – разработка security-диагностик для поиска дефектов из списка OWASP Top 10 2021. Теперь PVS-Studio покрывает 9 из 10 категорий этого списка. Посмотреть, как диагностики соотносятся с категориями OWASP Top 10, можно здесь.


Непокрытой осталась одна категория – A06:2021. Один из вариантов покрыть её – научить анализатор искать в проектах компоненты с известными уязвимостями. Другими словами – PVS-Studio должен проводить software composition analysis (SCA).


Для начала мы хотим добавить SCA в C# анализатор. Планируем сделать это в одном из будущих релизов.


Новый режим мониторинга компиляции на Windows: ловит все запуски компилятора


Система мониторинга компиляции на Windows нужна, чтобы анализировать проекты на C и C++. Причём сборочная система неважна. Важно только, чтобы PVS-Studio поддерживал компилятор, который используется в проекте.


Однако у системы мониторинга был недостаток: если процесс компилятора быстро завершался, система могла его не отследить. Из-за этого PVS-Studio не анализировал файлы, компиляцию которых не успевал перехватывать.


Чаще всего с проблемой сталкивались разработчики, которые пишут код под embedded-платформы.


Новый режим анализа решает описанную проблему. В нём PVS-Studio перехватывает все запуски компилятора. Быстро компилируется код или нет – неважно.


Подробнее режим описан в документации.


PVS-Studio и Visual Studio Code


С отчётами PVS-Studio можно работать из Visual Studio Code. Для этого нужно:



Подробнее эти шаги мы описали в документации.


Анализ напрямую из Visual Studio Code запускать пока нельзя. Если вас интересует такая возможность – напишите об этом. По фидбеку оценим, насколько функциональность востребована.


Более глубокий анализ C++ кода


Мы обновили систему типов в C++ анализаторе. Теперь PVS-Studio лучше разбирает современный C++: стандартную библиотеку, сложные конструкции, шаблоны. Диагностики стали точнее, а значит, находят больше опасных мест и выдают меньше ложных предупреждений.


Подробнее рассказали об этом в докладе.


Интеграция PVS-Studio с CMake и GitHub Actions


В новых разделах документации мы описали, как можно интегрировать PVS-Studio в GitHub Actions и CMake.


Новые диагностики


C, C++



C#



Почитать, посмотреть и попробовать


Почитать


С момента прошлого релиза проверили качество кода нескольких Open Source проектов:



Нашли несколько подтверждений тому, почему статический анализ лучше использовать регулярно. Как? Подробно описали здесь, если вкратце – алгоритм примерно такой:



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



Кроме того, написали статьи про безопасность. В них рассмотрели дефекты, связанные с обработкой XML-файлов, а именно:



Описали это в двух статьях:



Больше статей – в нашем блоге.


Посмотреть


Мы не только пишем статьи, но и снимаем видео. Новые материалы на нашем YouTube-канале:



Кстати, в феврале мы участвовали в подкасте DotNet & More. Там поговорили о статическом анализе, Roslyn, security и не только. Посмотреть запись можно здесь. Если больше нравится слушать, в описании видео на YouTube есть ссылки на аудиозапись.


Попробовать


Нет лицензионного ключа


Если хотите попробовать PVS-Studio, нужно сделать 3 простых шага:



Пройти по шагам поможет эта страница. Не забудьте поделиться впечатлениями. :)


Лицензионный ключ есть


Последнюю версию PVS-Studio можно загрузить здесь.


Если хотите поделиться этой статьей с англоязычной аудиторией, то прошу использовать ссылку на перевод: Sergey Vasiliev. PVS-Studio 7.18: updates and enhancements.

@SergVasiliev
13.04.2022 13:22 UTC
Первоисточник

Комментарии

@qw1
13.04.2022 18:28 UTC
+1
Новый режим анализа решает описанную проблему. В нём PVS-Studio перехватывает все запуски компилятора. Быстро компилируется код или нет – неважно.
Не, ну зачем так велосипедить, внедряя свою DLL в каждый процесс системы, на вирус похоже )))

Когда в Windows уже 15 лет как есть прекрасные встроенные средства трассировки (ETW), только подписывайся на создание процессов и получай удовольствие — система сама всё буферизует, не надо следить за переполнениями логов или синхронизацией записи в журнал. Легко использовать как из C++ так и из .NET
@MrROBUST
14.04.2022 06:36 UTC
0
Не, ну зачем так велосипедить, внедряя свою DLL в каждый процесс системы, на вирус похоже )))

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

Сейчас пишется статья, которая подробно описывает работу новой реализации перехвата процессов
спойлер
через Image File Execution Options

и зачем вообще такие танцы с бубном. И почему ETW не подходит.
14.04.2022 07:34 UTC
0
Было бы очень интересно почитать, почему ETW не подходит. На первый взгляд, всё есть — PID, Parent PID, Image Name, Command Line. И события не теряются.
14.04.2022 07:51 UTC
0
Command Line

Вот найти кто пишет аргументы командной строки, не получилось. Не подскажете в каком оно провайдере есть? Microsoft-Windows-Kernel-Process не подошёл. А еще желательно собрать все переменные окружения.

При работе чрез систему событий есть и другая проблема. Компилятор может работать не только через аргументы командной строки, но и через временные respose-файлы. В этом случае можно также не успеть прочитать файл, чтобы извлечь из него параметры запуска.
Когда есть возможность перехватить запуск процесса, получится успеть сделать все что потребуется.
14.04.2022 09:01 UTC
0
Вот такой провайдер (ProcessGuid = 3d6fa8d0-fe05-11d0-9dda-00c04fd7ba7c) даёт события запуска процессов с командными строками. docs.microsoft.com/en-us/windows/win32/etw/nt-kernel-logger-constants

Этот провайдер даёт бинарные данные. XML-провайдеры я не рассматривал, т.к. не хотел терять производительность на конвертацию в XML и обратно.

Разбор бинарника события ProcessStart где-то я встречал в open-source софте, там формат
0x08: PID
0x0C: ParentPID
0x24: SID (владелец процесса, структура переменной длины)
0x24+SidSize: image name
0x24+SidSize+imagenamesize: command line

как считать SidSize, есть тут: github.com/microsoft/perfview/issues/1004
14.04.2022 09:05 UTC
0
Понятно, что если надо успеть прочитать временный файлик, то трассировка не подойдёт (разве что перехватывать события чтения файлов из интересующего нас процесса).