Статические
анализаторы кода как
DevSecOps решение
20 апреля 2019 года
Holiday Inn Moscow Sokolniki
2
Пара слов о себе
• Юрий Минаев
• C++ разработчик в
компании PVS-Studio
• minaev@viva64.com
3
DevSecOps
4
https://www.nist.gov/sites/default/files/documents/director/planning/report02-3.pdf
5
6
Как обнаружить уязвимости
 Code review
 Юнит-тесты и динамический
анализ
 Статический анализ
7
Code Review
8
Code Review
• Плюсы:
– Обмен опытом
– Правки “по горячим следам”
• Минусы:
– Дорого и долго
– Быстро устаешь от просмотра кода
9
Статический анализ кода
• Это как code review, только происходит
автоматически
10
Статический анализ кода
• Плюсы:
– Малозатратно
– Анализатор не устает
– Анализатор знает про ошибочные паттерны, о
которых не догадываются программисты
• Минусы:
– Ложные срабатывания
– Нельзя найти высокоуровневые ошибки
– Сложно с многопоточностью
11
Динамический анализ
• Плюсы:
– Анализ в процессе выполнения
– Нет ложных срабатываний
• Минусы:
– Санитайзеры и профилировщики медленные
– Часто нужны специальные входные данные
– Не все случаи можно покрыть тестами
12
Какой метод лучше?
13
Про подпорченную
репутацию
14
Современные анализаторы
 Интеграция в IDE
 Интеграция в системы сборки и CI
 Инкрементальный анализ
 Механизмы подавления шума
15
Интеграция с CI
 Запуск как шаг
сборки
 Отчеты о
найденных
ошибках
SonarQube
• «Контролируем качество кода с помощью платформы
SonarQube»
http://www.viva64.com/ru/b/0452/ 16
17
Static Application Security Testing
(SAST)
 Автоматизированный поиск багов
в коде
 Выявление уязвимостей, которые
происходят из-за программных
ошибок
 Более 60% уязвимостей – это
программные ошибки © NIST
18
От ошибки до уязвимости
19
Две разновидности SAST
 Поиск известных уязвимостей
 Профилактика новых уязвимостей
20
Немного терминов
• CWE – Common Weakness
Enumeration
• SEI CERT – Software Engineering
Institute Coding Standard
• CVE - Common Vulnerabilities and
Exposures
• MISRA - Motor Industry Software
Reliability Association
21
• CWE™ is a community-developed list
of common software security
weaknesses.
• Это список потенциальных
уязвимостей, которые могут стать
реальными.
• Сайт: https://cwe.mitre.org
• 806 потенциальных уязвимостей.
22
• Стандарт от CERT Coordination
Center, CERT/CC
• Содержит правила для C, C++, Java,
Perl
• Много пересечений с CWE
• Сайт: https://wiki.sei.cmu.edu/
23
Пример CWE
static void
SHA1Final(unsigned char digest[20],
SHA1_CTX *context)
{
u32 i;
unsigned char finalcount[8];
....
memset(context->count, 0, 8);
memset(finalcount, 0, 8);
}
24
Пример CWE
static void
SHA1Final(unsigned char digest[20],
SHA1_CTX *context)
{
....
memset(finalcount, 0, 8);
}
CWE-14 V597 The compiler could delete the 'memset' function
call, which is used to flush 'finalcount' buffer. The memset_s()
function should be used to erase the private data.
25
https://godbolt.org/
CWE-14
26
CWE-14: Compiler Removal of Code to Clear Buffers
https://cwe.mitre.org/data/definitions/14.html
27
• CVE - реальные уязвимости,
найденные в приложениях.
• Сайт: https://cve.mitre.org/
• Total CVE Entries: 114 142
28
static OSStatus
SSLVerifySignedServerKeyExchange(....)
{
....
if ((err = SSLHashSHA1.update(
&hashCtx, &signedParams)) != 0)
goto fail;
goto fail;
....
fail:
....;
}
• V640 The code's operational logic does not correspond with its formatting
• V779 Unreachable code detected. It is possible that an error is present
CVE-2014-1266
29
typedef char my_bool;
my_bool check_scramble(const char *scramble_arg,
const char *message,
const uint8 *hash_stage2)
{
....
return memcmp(hash_stage2,
hash_stage2_reassured,
SHA1_HASH_SIZE);
}
• V642 Saving the 'memcmp' function result inside the 'char' type variable is
inappropriate. The significant bits could be lost breaking the program's logic.
CVE-2012-2122
30
• Платный стандарт кодирования.
• Сайт: https://www.misra.org.uk/
• 143 правила в MISRA-C:2012
• 228 правил в MISRA-C++:2008
31
Примеры правил MISRA
• Не используйте восьмеричные константы
• Не используйте goto
• Функция должна иметь ровно одну точку
выхода
• Не используйте функции стандартной
библиотеки
(atof/…/abort/exit/getenv/system/…)
• Не используйте динамические аллокации
• Каждый case должен заканчиваться break
или throw
32
33
Как использовать стандарты
неправильно
34
Как использовать стандарты
неправильно
35
А что с легаси?
 Берем старый проект с большим
объемом кода
 Запускаем анализ в вашем
любимом анализаторе
 Получаем...
36
… кучу предупреждений
37
Как правильно
 Прогнать анализ один раз
 Подавить все предупреждения
 Запускать анализ на новом коде
 Постепенно исправлять старый и
проверять правки
38
Сценарий использования
39
И регулярно!
40
Заключение
 Проблемы с безопасностью дорого
обходятся, если попадают в конечный
продукт
 Статический анализ кода – один из
способов поиска уязвимостей
 Регулярные проверки позволяют
устранять потенциальные уязвимости
на ранних стадиях
41
Вопросы
 Сайт PVS-Studio:
https://www.viva64.com
 Контакты:
Юрий Минаев
minaev@viva64.com

Статические анализаторы кода как DevSecOps решение