Многие слышали или сталкивались со статическим анализом кода (SAST). Их репутация была существенно подпорчена старыми инструментами, которые для простоты назовём "линтерами". Доклад будет полезен тем, кто пробовал, но ему не понравилось :). Статические анализаторы не стояли на месте. Продемонстрируем возможности современных инструментов и поговорим об интеграции в существующие старые проекты. Отдельное внимание уделим вопросам информационной безопасности и таким стандартам, как CWE.
10. 10
Статический анализ кода
• Плюсы:
– Малозатратно
– Анализатор не устает
– Анализатор знает про ошибочные паттерны, о
которых не догадываются программисты
• Минусы:
– Ложные срабатывания
– Нельзя найти высокоуровневые ошибки
– Сложно с многопоточностью
11. 11
Динамический анализ
• Плюсы:
– Анализ в процессе выполнения
– Нет ложных срабатываний
• Минусы:
– Санитайзеры и профилировщики медленные
– Часто нужны специальные входные данные
– Не все случаи можно покрыть тестами
20. 20
Немного терминов
• CWE – Common Weakness
Enumeration
• SEI CERT – Software Engineering
Institute Coding Standard
• CVE - Common Vulnerabilities and
Exposures
• MISRA - Motor Industry Software
Reliability Association
21. 21
• CWE™ is a community-developed list
of common software security
weaknesses.
• Это список потенциальных
уязвимостей, которые могут стать
реальными.
• Сайт: https://cwe.mitre.org
• 806 потенциальных уязвимостей.
22. 22
• Стандарт от CERT Coordination
Center, CERT/CC
• Содержит правила для C, C++, Java,
Perl
• Много пересечений с CWE
• Сайт: https://wiki.sei.cmu.edu/
24. 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.
27. 27
• CVE - реальные уязвимости,
найденные в приложениях.
• Сайт: https://cve.mitre.org/
• Total CVE Entries: 114 142
28. 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. 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. 30
• Платный стандарт кодирования.
• Сайт: https://www.misra.org.uk/
• 143 правила в MISRA-C:2012
• 228 правил в MISRA-C++:2008
31. 31
Примеры правил MISRA
• Не используйте восьмеричные константы
• Не используйте goto
• Функция должна иметь ровно одну точку
выхода
• Не используйте функции стандартной
библиотеки
(atof/…/abort/exit/getenv/system/…)
• Не используйте динамические аллокации
• Каждый case должен заканчиваться break
или throw
37. 37
Как правильно
Прогнать анализ один раз
Подавить все предупреждения
Запускать анализ на новом коде
Постепенно исправлять старый и
проверять правки
40. 40
Заключение
Проблемы с безопасностью дорого
обходятся, если попадают в конечный
продукт
Статический анализ кода – один из
способов поиска уязвимостей
Регулярные проверки позволяют
устранять потенциальные уязвимости
на ранних стадиях