Мы выпустили новый релиз 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. Для этого нужно:
- установить плагин Sarif Viewer;
- преобразовать лог в формат SARIF;
- загрузить отчёт анализатора.
Подробнее эти шаги мы описали в документации.
Анализ напрямую из Visual Studio Code запускать пока нельзя. Если вас интересует такая возможность – напишите об этом. По фидбеку оценим, насколько функциональность востребована.
Более глубокий анализ C++ кода
Мы обновили систему типов в C++ анализаторе. Теперь PVS-Studio лучше разбирает современный C++: стандартную библиотеку, сложные конструкции, шаблоны. Диагностики стали точнее, а значит, находят больше опасных мест и выдают меньше ложных предупреждений.
Подробнее рассказали об этом в докладе.
Интеграция PVS-Studio с CMake и GitHub Actions
В новых разделах документации мы описали, как можно интегрировать PVS-Studio в GitHub Actions и CMake.
Новые диагностики
C, C++
- V1079. Parameter of 'std::stop_token' type is not used inside function's body.
- V1080. Call of 'std::is_constant_evaluated' function always returns the same value.
- V1081. Argument of abs() function is minimal negative value. Such absolute value can't be represented in two's complement. This leads to undefined behavior.
- V1082. Function marked as 'noreturn' may return control. This will result in undefined behavior.
C#
- V5619. OWASP. Possible log injection. Potentially tainted data is written into logs.
- V5620. OWASP. Possible LDAP injection. Potentially tainted data is used in a search filter.
- V5621. OWASP. Error message contains potentially sensitive data that may be exposed.
Почитать, посмотреть и попробовать
Почитать
С момента прошлого релиза проверили качество кода нескольких Open Source проектов:
- Barotrauma (C#);
- Eto.Forms (C#);
- Ogre3D (C++);
- MuditaOS (C++).
Нашли несколько подтверждений тому, почему статический анализ лучше использовать регулярно. Как? Подробно описали здесь, если вкратце – алгоритм примерно такой:
- разработчики пишут новый код для Open Source проектов;
- мы анализируем его с помощью PVS-Studio;
- смотрим отчёты анализатора и находим ошибки, которые пропустили разработчики;
- пишем об этом.
Некоторые из найденных проблем описали в этих статьях:
- Как PVS-Studio защищает от поспешных правок кода, пример N3
- Как PVS-Studio защищает от поспешных правок кода, пример N4
Кроме того, написали статьи про безопасность. В них рассмотрели дефекты, связанные с обработкой XML-файлов, а именно:
- как уязвимости выглядят в коде;
- как провести атаку на приложение с уязвимостью;
- какими будут последствия.
Описали это в двух статьях:
- Почему моё приложение при открытии SVG-файла отправляет сетевые запросы?
- Уязвимости из-за обработки XML-файлов: XXE в C# приложениях в теории и на практике
Больше статей – в нашем блоге.
Посмотреть
Мы не только пишем статьи, но и снимаем видео. Новые материалы на нашем YouTube-канале:
- Using PVS-Studio with JetBrains Rider
- Mistakes and suspicious code fragments — or how the static analyzer checked .NET 6
- How to make code reliable and secure [The MISRA standard and PVS-Studio]
- 10 C# tips for beginners
Кстати, в феврале мы участвовали в подкасте DotNet & More. Там поговорили о статическом анализе, Roslyn, security и не только. Посмотреть запись можно здесь. Если больше нравится слушать, в описании видео на YouTube есть ссылки на аудиозапись.
Попробовать
Нет лицензионного ключа
Если хотите попробовать PVS-Studio, нужно сделать 3 простых шага:
- запросить триальный ключ;
- загрузить дистрибутив;
- проверить проект.
Пройти по шагам поможет эта страница. Не забудьте поделиться впечатлениями. :)
Лицензионный ключ есть
Последнюю версию PVS-Studio можно загрузить здесь.
Если хотите поделиться этой статьей с англоязычной аудиторией, то прошу использовать ссылку на перевод: Sergey Vasiliev. PVS-Studio 7.18: updates and enhancements.
qw1
Когда в Windows уже 15 лет как есть прекрасные встроенные средства трассировки (ETW), только подписывайся на создание процессов и получай удовольствие — система сама всё буферизует, не надо следить за переполнениями логов или синхронизацией записи в журнал. Легко использовать как из C++ так и из .NET
MrROBUST
Оно не так работает. Хотя на мой взгляд это было бы лучшим решением. Только внедряясь не в каждый процесс системы, а исключительно в процесс сборки.
Сейчас пишется статья, которая подробно описывает работу новой реализации перехвата процессов
и зачем вообще такие танцы с бубном. И почему ETW не подходит.
qw1
Было бы очень интересно почитать, почему ETW не подходит. На первый взгляд, всё есть — PID, Parent PID, Image Name, Command Line. И события не теряются.
MrROBUST
Вот найти кто пишет аргументы командной строки, не получилось. Не подскажете в каком оно провайдере есть? Microsoft-Windows-Kernel-Process не подошёл. А еще желательно собрать все переменные окружения.
При работе чрез систему событий есть и другая проблема. Компилятор может работать не только через аргументы командной строки, но и через временные respose-файлы. В этом случае можно также не успеть прочитать файл, чтобы извлечь из него параметры запуска.
Когда есть возможность перехватить запуск процесса, получится успеть сделать все что потребуется.
qw1
Вот такой провайдер (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
qw1
Понятно, что если надо успеть прочитать временный файлик, то трассировка не подойдёт (разве что перехватывать события чтения файлов из интересующего нас процесса).