Поговорим о таких терминах, связанных с информационной безопасностью, как SAST, CWE, CVE, SEI CERT, DevSecOps и как они между собой связаны. Доклад ориентирован на разработчиков и знакомит их с некоторыми понятиями и стандартами кодирования, помогающими создавать надежные, безопасные приложения. Другими словами, как писать код с меньшим количеством потенциальных уязвимостей.
4. Заголовок
4
Проблематика - рост кодовой базы
• Ядро Linux 1.0.0 : 176 250 строк кода
• Ядро Linux 4.11.7: 18 373 471 строк кода
• Photoshop 1.0 : 128 000 строк кода
• Photoshop CS 6 : 10 000 000 строк кода
• Плотность ошибок тоже растёт, но нелинейно
• Все хотят качественный и БЕЗОПАСНЫЙ код
• Старых методов контроля качества уже недостаточно
7. Заголовок
7
Как бороться с ошибками
• Делать сразу правильно (не работает)
• Следование корпоративным правилам
• Использование “лучших практик”
• Code Review
• Парная разработка
• Разработка через тестирование (TDD)
• Гибкая разработка Agile
• Инструментальные средства
16. Заголовок
16
Программные ошибки и их последствия (Therac-25)
С июня 1985 по январь
1987 года из-за ошибок
в ПО этот аппарат стал
причиной как минимум
шести передозировок
радиации, некоторые
пациенты получили
дозы в десятки
тысяч рад. Как
минимум двое умерли
непосредственно от
передозировок.
17. Заголовок
17
Программные ошибки и их последствия (Ariane-5)
4 июня 1996 года,
космодром Куру. Во
время первого
запуска, на 40-й
секунде полета
произошло
разрушение ракеты.
Причина – ошибка в
работе бортового
программного
обеспечения.
20. Заголовок
20
Поиск уязвимостей
Для старого кода оптимален поиск известных уязвимостей:
• Аналогия - антивирусы
• Нет ложных срабатываний
• Но находится только то, что уже известно
• Особенно полезно в больших старых проектах
Для нового кода более эффективен метод поиска дефектов
кода с целью предотвращения уязвимостей.
21. Заголовок
21
SAST - Static Application Security Testing
• Статический анализ, нацеленный на поиск и
предотвращение уязвимостей
• Уязвимости - те же самые обыкновенные ошибки (по
данным NIST, более 60%)
• Инструменты SAST помогают предотвращать
уязвимости и обеспечивают поддержку стандартов
безопасной разработки: CWE, MISRA, SEI CERT и т.п.
22. Заголовок
22
SAST - Static Application Security Testing
Преимущества:
• Раннее обнаружение проблем
• Покрытие всего кода
• Хорош в поиске опечаток и ошибок типа Copy-Paste
Недостатки:
• Ложные срабатывания
• Неизвестна точная критичность ошибки
• Слабое диагностирование утечек памяти и параллельных
ошибок
23. Заголовок
23
Путь к реальной уязвимости
CWE - Common Weakness
Enumeration
CVE - Common Vulnerabilities
and Exposures
24. Заголовок
24
CWE
• CWE™ is a community-developed list of common
software security weaknesses
• https://cwe.mitre.org
• Cписок из более чем 800 потенциальных
уязвимостей, которые могут стать реальными
25. Заголовок
25
CWE: примеры потенциальных уязвимостей
• CWE-14: Compiler Removal of Code to Clear Buffers
• CWE-20: Improper Input Validation
• CWE-91: XML Injection
• CWE-457: Use of Uninitialized Variable
• CWE-467: Use of sizeof() on a Pointer Type
• CWE-562: Return of Stack Variable Address
26. Заголовок
26
CWE-14 (Compiler Removal of Code to Clear Buffers)
void win32_dealloc(struct event_base *_base, void *arg) {
struct win32op *win32op = arg;
....
memset(win32op, 0, sizeof(win32op));
free(win32op);
}
The compiler could delete the 'memset' function call, which is used
to flush 'win32op' object.
27. Заголовок
27
CWE-687 (Function Call With Incorrectly Specified Argument Value)
void win32_dealloc(struct event_base *_base, void *arg) {
struct win32op *win32op = arg;
....
memset(win32op, 0, sizeof(win32op));
free(win32op);
}
The memset function receives the pointer and its size as arguments.
It is possibly a mistake. Inspect the third argument.
28. Заголовок
28
CWE-563 (Assignment to Variable without Use)
public string Region
{
get {....}
set
{
if (String.IsNullOrEmpty(value))
{
this.linker.s3.region = "us-east-1";
}
this.linker.s3.region = value;
}
}
The 'this.linker.s3.region' variable is assigned values twice
successively. Perhaps this is a mistake.
29. Заголовок
29
CWE-674 (Uncontrolled Recursion)
OnFailure? onFailure = null;
public OnFailure? OnFailure
{
get { return this.OnFailure; }
set { this.onFailure = value; }
}
Possible infinite recursion inside 'OnFailure' property.
30. Заголовок
30
CVE
• CVE® is a list of publicly known cybersecurity
vulnerabilities
• https://cve.mitre.org/
• Список из более чем 114 000 реальных уязвимостей,
найденных в приложениях
31. Заголовок
31
CVE-2012-2122
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);
}
[CWE-197] Saving the 'memcmp' function result inside the 'char' type
variable is inappropriate. The significant bits could be lost
breaking the program's logic.
32. Заголовок
32
CVE-2013-4258
if (NasConfig.DoDaemon) {
openlog("nas", LOG_PID, LOG_DAEMON);
syslog(LOG_DEBUG, buf);
closelog();
} else {
errfd = stderr;
}
[CWE-134] It's dangerous to call the 'syslog' function in such
a manner, as the line being passed could contain format
specification. The example of the safe code: printf("%s", str).
Network Audio System
33. Заголовок
33
CVE-2014-1266
static OSStatus
SSLVerifySignedServerKeyExchange(....)
{
....
if ((err = SSLHashSHA1.update(&hashCtx, &signedParams)) != 0)
goto fail;
goto fail;
if ((err = SSLHashSHA1.final(&hashCtx, &hashOut)) != 0)
goto fail;
....
fail:
....
}
[CWE-483] The code's operational logic does not correspond with its formatting.
[CWE-561] Unreachable code detected. It is possible that an error is present.
34. Заголовок
34
MISRA C/C++
• Motor Industry Software Reliability Association
• Стандарт кодирования, который уменьшает вероятность
допущения ошибки для ответственных встраиваемых
систем
• Проприетарный
• MISRA C 2012 cодержит 143 правила
• MISRA C++ 2008 cодержит 228 правил
35. Заголовок
35
MISRA C/C++ (некоторые правила)
• Не используйте восьмеричные константы
• Не используйте goto
• Функция должна иметь ровно одну точку выхода
• Не используйте функции стандартной библиотеки
(atof/…/abort/exit/getenv/system/…)
• Не используйте динамические аллокации
• Не используйте объединения
• Каждый case должен заканчиваться break или throw
36. Заголовок
36
MISRA C/C++ (Toyota)
• NHTSA: за 2000 - 2010 годы в
авариях погибло 89 человек,
57 получили увечья
• NHTSA и NASA провели
расследование
• Выявлено 7 134 нарушения
по MISRA
• Toyota отрицает вину, но выплачивает 16 миллиардов долларов
в досудебном порядке
37. Заголовок
37
SEI CERT
• Стандарт кодирования
• Разрабатывается координационным центром CERT
(CERT Coordination Center, CERT/CC)
• Предназначен для языков C, C++, Java, Perl
• Весьма похож на CWE
38. Заголовок
38
SEI CERT (некоторые правила)
• MSC06-C: Beware of compiler optimizations
• INT33-C: Ensure that division and remainder operations
do not result in divide-by-zero errors
• EXP33-C, EXP53-CPP: Do not read uninitialized memory
• ARR01-C: Do not apply the sizeof operator to a pointer
when taking the size of an array
• DCL30-C: Declare objects with appropriate storage
durations
39. Заголовок
39
Внедряем и используем SAST правильно
• Выбираем подходящий анализатор
• Настраиваем
• Проверяем проект, рассматриваем текущие
предупреждения как “технический долг”
• Работаем с новыми предупреждениями
• Внедряем SAST в системы CI
• Внедряем SAST на рабочих местах
• ….
• PROFIT!!!
42. Заголовок
42
Снижаем потери
• Возникновение уязвимости
• Обнаружение с помощью SAST, исправление
• Прямые и косвенные потери:
• Эксплуатация злоумышленниками
• Bug bounty
• Репутация
• Исправление
• Выпуск обновления
$
$
$
$
$
$
$
43. Заголовок
43
Выводы
Проблемы с безопасностью дорого обходятся, если
попадают в конечный продукт
Инструменты SAST – один из способов поиска
уязвимостей
Тем не менее, используйте все другие доступные вам
методы
Если ваша компания зарабатывает деньги, используя
программный код, вы просто не можете не думать о его
безопасности