SlideShare a Scribd company logo
SAST и Application Security:
как бороться с уязвимостями в коде
Сергей Хренов
Moscow, 17 June 2019
PVS-Studio
2/52
Сергей Хренов
разработчик, PVS-Studio
khrenov@viva64.com
www.viva64.com
Докладчик
3/52
Зачем слушать этот доклад
4/52
Проблематика
• Объёмы кода растут
• Плотность ошибок растёт
нелинейно
• Все хотят качественный и
БЕЗОПАСНЫЙ код
• Старых методов контроля
качества уже недостаточно
5/52
• Ядро Linux 1.0.0 : 176 250 строк кода
• Ядро Linux 4.11.7: 18 373 471 строк кода
• Photoshop 1.0 : 128 000 строк кода
• Photoshop CS 6 : 10 000 000 строк кода
Рост объёма кода некоторых проектов
6/52
Плотность ошибок (на 1 KLOC)
0
20
40
60
80
100
< 2 2-16 16-64 64-512 > 512
"Estimating Software Costs: Bringing Realism to Estimating" (Capers Jones, 2007)
7/52
Пара слов о Code Review
8/52
Аттракцион “Найди ошибку” (проект Mono)
9/52
Аттракцион “Найди ошибку” (проект Mono)
10/52
Аттракцион “Найди ошибку” (проект Mono)
V3012 The '?:' operator, regardless of its conditional expression, always
returns one and the same value: Color.FromArgb (150, 179, 225).
ProfessionalColorTable.cs 258
11/52
Показать всё, что скрыто
12/52
Статический анализ кода, используемые технологии
13/52
14/52
• Не заменяет, но дополняет обзоры кода
• Позволяет контролировать качество кода в больших
проектах
• Раннее обнаружение проблем
• Максимальное покрытие кода
• Поиск разнообразных паттернов ошибок
Статический анализ кода
15/52
Статический анализ кода
Недостатки:
• Ложные срабатывания
• Неизвестна точная критичность
ошибки
16/52
• Сложно искать даже простейшие перестановки:
(A + B == B + A)
• Макросы: кто их раскроет?
• Типы: кто вычислит цепочку typedef?
• Значения: как узнать, что индекс вышел за границу массива?
Регулярные выражения не работают!
17/52
А что работает?
• Сопоставление с шаблоном (pattern-based analysis)
• Вывод типов (type inference)
• Символьное выполнение (symbolic execution)
• Анализ потока данных (data-flow analysis)
• Аннотирование методов (method annotations)
18/52
Сопоставление с шаблоном (pattern-based analysis)
Linux Kernel
static ssize_t lp8788_show_eoc_time(struct device *dev,
struct device_attribute *attr, char *buf)
{
struct lp8788_charger *pchg = dev_get_drvdata(dev);
char *stime[] = { "400ms", "5min", "10min", "15min",
"20min", "25min", "30min" "No timeout" };
....
}
V653 A suspicious string consisting of two parts is used for array initialization.
It is possible that a comma is missing. Consider inspecting this literal: "30min"
"No timeout". lp8788-charger.c 657
19/52
Вывод типов (type inference)
template<class T, size_t N> struct X
{
T A[N];
void Foo()
{
memset(A, 0, sizeof(T) * 10);
}
};
void Do()
{
X<int, 5> a;
a.Foo();
}
V512 Instantiate X < int, 5 >: A call of the 'memset' function will lead to overflow of
the buffer 'A'. test.cpp 127
20/52
Символьное выполнение (symbolic execution)
void F(int X)
{
int A = X;
int B = X + 10;
int Q[5];
Q[B - A] = 1;
}
V557 Array overrun is possible. The 'B - A' index is pointing beyond array
bound. test.cpp 126
21/52
Анализ потока данных (data-flow analysis)
static const int kDaysInMonth[13] = {
0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
};
bool ValidateDateTime(const DateTime& time) {
if (time.year < 1 || time.year > 9999 ||
time.month < 1 || time.month > 12 ||
time.day < 1 || time.day > 31 ||
....) {
return false;
}
if (time.month == 2 && IsLeapYear(time.year)) {
return time.month <= kDaysInMonth[time.month] + 1;
} else {
return time.month <= kDaysInMonth[time.month];
}
}
protobuf
(Chromium)
V547 Expression 'time.month <= kDaysInMonth[time.month] + 1' is always true. time.cc 83
V547 Expression 'time.month <= kDaysInMonth[time.month]' is always true. time.cc 85
22/52
Аннотирование методов (method annotations)
public boolean equals(Object other) {
if (other instanceof Id) {
Id that = (Id) other;
return purchaseSequence.equals(this.purchaseSequence) &&
that.purchaseNumber == this.purchaseNumber;
}
else {
return false;
}
}
V6009 Function 'equals' receives odd arguments. Inspect arguments: this, 1.
PurchaseRecord.java 57
Hibernate
23/52
Да, статический анализ - это не так просто, но…
…никакой магии!
24/52
SAST и поиск потенциальных уязвимостей
25/52
Рост числа выявленных уязвимостей
5632
16555
0
2000
4000
6000
8000
10000
12000
14000
16000
18000
2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018
https://www.cvedetails.com
26/52
SAST - Static Application Security Testing
• Статический анализ, нацеленный на поиск и предотвращение
уязвимостей
• Уязвимости - те же самые обыкновенные ошибки (по данным
NIST, более 60%)
• Инструменты SAST помогают предотвращать уязвимости и
обеспечивают поддержку стандартов безопасной разработки:
CWE, MISRA, SEI CERT и т.п.
27/52
SAST и DevSecOps
28/52
Поиск уязвимостей
Для старого кода оптимален поиск известных уязвимостей:
• Аналогия - антивирусы
• Нет ложных срабатываний
• Но находится только то, что уже известно
• Особенно полезно в больших старых проектах
Для нового кода более эффективен метод поиска дефектов
кода с целью предотвращения уязвимостей.
29/52
Медлить нельзя!
0
1000
2000
3000
4000
5000
6000
7000
8000
Development Build QA Release Phase
Cost to Fix a Security Defect ($)
NIST: National Institute of Standards and Technology
30/52
Ошибки, потенциальные и реальные уязвимости
31/52
Путь к реальной уязвимости
CWE - Common Weakness
Enumeration
CVE - Common Vulnerabilities
and Exposures
32/52
CWE
• CWE™ is a community-developed list of common
software security weaknesses
• https://cwe.mitre.org
• Cписок из более чем 800 потенциальных
уязвимостей, которые могут стать реальными
33/52
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
34/52
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);
}
V597 The compiler could delete the 'memset' function call, which is used to flush
'win32op' object.
35/52
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);
}
V579 The memset function receives the pointer and its size as arguments. It is
possibly a mistake. Inspect the third argument.
36/52
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;
}
}
V3008 The 'this.linker.s3.region' variable is assigned values twice successively.
Perhaps this is a mistake.
37/52
CWE-674 (Uncontrolled Recursion)
OnFailure? onFailure = null;
public OnFailure? OnFailure
{
get { return this.OnFailure; }
set { this.onFailure = value; }
}
V3110 Possible infinite recursion inside 'OnFailure' property.
38/52
CVE
• CVE® is a list of publicly known cybersecurity
vulnerabilities
• https://cve.mitre.org/
• Список из более чем 114 000 реальных уязвимостей,
найденных в приложениях
39/52
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);
}
V642 [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.
40/52
CVE-2013-4258
if (NasConfig.DoDaemon) {
openlog("nas", LOG_PID, LOG_DAEMON);
syslog(LOG_DEBUG, buf);
closelog();
} else {
errfd = stderr;
}
Network Audio System
V618 [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).
41/52
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:
....
}
V640 [CWE-483] The code's operational logic does not correspond with its formatting.
V779 [CWE-561] Unreachable code detected. It is possible that an error is present.
42/52
Другие непонятные слова
полезные стандарты
43/52
MISRA C/C++
• Motor Industry Software Reliability Association
• Стандарт кодирования, который уменьшает вероятность
допущения ошибки для ответственных встраиваемых
систем
• Проприетарный
• MISRA C 2012 cодержит 143 правила
• MISRA C++ 2008 cодержит 228 правил
44/52
MISRA C/C++ (некоторые правила)
• Не используйте восьмеричные константы
• Не используйте goto
• Функция должна иметь ровно одну точку выхода
• Не используйте функции стандартной библиотеки
(atof/…/abort/exit/getenv/system/…)
• Не используйте динамические аллокации
• Не используйте объединения
• Каждый case должен заканчиваться break или throw
45/52
SEI CERT
• Стандарт кодирования
• Разрабатывается координационным центром CERT
(CERT Coordination Center, CERT/CC)
• Предназначен для языков C, C++, Java, Perl
• Весьма похож на CWE
46/52
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
47/52
Правильное использование SASТ, выводы
48/52
Внедряем и используем SAST правильно
• Выбираем подходящий анализатор
• Настраиваем
• Проверяем проект, рассматриваем текущие
предупреждения как “технический долг”
• Работаем с новыми предупреждениями
• Внедряем SAST в системы CI
• Внедряем SAST на рабочих местах
• ….
• PROFIT!!!
49/52
Снижаем потери
• Возникновение уязвимости
• Прямые и косвенные потери:
• Эксплуатация злоумышленниками
• Bug bounty
• Репутация
• Исправление
• Выпуск обновления
$
$
$
$
$
$
$
50/52
Снижаем потери
• Возникновение уязвимости
• Обнаружение с помощью SAST, исправление
• Прямые и косвенные потери:
• Эксплуатация злоумышленниками
• Bug bounty
• Репутация
• Исправление
• Выпуск обновления
$
$
$
$
$
$
$
51/52
Выводы
 Проблемы с безопасностью дорого обходятся, если
попадают в конечный продукт
 Инструменты SAST – один из способов поиска уязвимостей
 Тем не менее, используйте все другие доступные вам
методы
 Если компания зарабатывает деньги, используя
программный код, она просто обязана думать о его
безопасности
SAST и Application Security: как бороться с уязвимостями в коде

More Related Content

PPTX
Статический анализ: ищем ошибки... и уязвимости?
PPTX
Статический анализ как ответ на вопрос о повышении качества кода
PPTX
SAST, CWE, SEI CERT и другие умные слова из мира информационной безопасности
PDF
Цена ошибки
PDF
Шишки, набитые за 15 лет использования акторов в C++
PPTX
Философия Application Security
PPTX
Поиск уязвимостей с использованием статического анализа кода
PPTX
Поиск уязвимостей с использованием статического анализа кода
Статический анализ: ищем ошибки... и уязвимости?
Статический анализ как ответ на вопрос о повышении качества кода
SAST, CWE, SEI CERT и другие умные слова из мира информационной безопасности
Цена ошибки
Шишки, набитые за 15 лет использования акторов в C++
Философия Application Security
Поиск уязвимостей с использованием статического анализа кода
Поиск уязвимостей с использованием статического анализа кода

What's hot (20)

PPTX
Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...
PPTX
Современный статический анализ кода: что умеет он, чего не умели линтеры
PPTX
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...
PPTX
C++ CoreHard Autumn 2018. Информационная безопасность и разработка ПО - Евген...
PPTX
Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...
PPTX
Статический анализ и написание качественного кода на C/C++ для встраиваемых с...
PDF
Unsafe: to be or to be removed?
PPTX
PVS-Studio. Статический анализатор кода. Windows/Linux, C/C++/C#
PPTX
Статический анализ кода: Что? Как? Зачем?
PDF
Павел Довгалюк, Обратная отладка
PPTX
New Android NDK & JNI
PPTX
Unit tests final
PPTX
Как команда PVS-Studio может улучшить код операционной системы Tizen
PPTX
Павел Беликов, Как избежать ошибок, используя современный C++
PPTX
Современные подходы к SAST
PDF
C++ refelection and cats
PPTX
SAST, борьба с потенциальными уязвимостями
PPTX
Асинхронность и сопрограммы
PDF
Сравнение статического анализа общего назначения из Visual Studio 2010 и PVS-...
PPTX
Принципы работы статического анализатора кода PVS-Studio
Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...
Современный статический анализ кода: что умеет он, чего не умели линтеры
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...
C++ CoreHard Autumn 2018. Информационная безопасность и разработка ПО - Евген...
Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...
Статический анализ и написание качественного кода на C/C++ для встраиваемых с...
Unsafe: to be or to be removed?
PVS-Studio. Статический анализатор кода. Windows/Linux, C/C++/C#
Статический анализ кода: Что? Как? Зачем?
Павел Довгалюк, Обратная отладка
New Android NDK & JNI
Unit tests final
Как команда PVS-Studio может улучшить код операционной системы Tizen
Павел Беликов, Как избежать ошибок, используя современный C++
Современные подходы к SAST
C++ refelection and cats
SAST, борьба с потенциальными уязвимостями
Асинхронность и сопрограммы
Сравнение статического анализа общего назначения из Visual Studio 2010 и PVS-...
Принципы работы статического анализатора кода PVS-Studio
Ad

Similar to SAST и Application Security: как бороться с уязвимостями в коде (20)

PPTX
Цена ошибки
PDF
Статический анализ исходного кода на примере WinMerge
PPTX
Статические анализаторы кода как DevSecOps решение
PPTX
Что могут статические анализаторы, чего не могут программисты и тестировщики
PPTX
Статический анализ кода
PPTX
статический анализ кода
PPTX
Дмитрий Дудов. Индустриальная IPS своими руками
PPTX
PVS-Studio, решение для разработки современных ресурсоемких приложений
PPTX
Всё о статическом анализе кода для Java программиста
PPTX
200 open source проектов спустя: опыт статического анализа исходного кода
PPTX
200 open source проектов спустя: опыт статического анализа исходного кода
PDF
Пояснения к статье про Copy-Paste
PPTX
Ошибки, которые сложно заметить на code review, но которые находятся статичес...
PPTX
DevSecOps против восстания машин
PDF
20130429 dynamic c_c++_program_analysis-alexey_samsonov
PDF
C++ весна 2014 лекция 2
PPTX
Бинарные уязвимости и эксплойты: технологии и перспективы
PDF
Инструментируй это
PDF
Formal verification of operating system kernels
PPTX
Как создать качественный статический анализатор
Цена ошибки
Статический анализ исходного кода на примере WinMerge
Статические анализаторы кода как DevSecOps решение
Что могут статические анализаторы, чего не могут программисты и тестировщики
Статический анализ кода
статический анализ кода
Дмитрий Дудов. Индустриальная IPS своими руками
PVS-Studio, решение для разработки современных ресурсоемких приложений
Всё о статическом анализе кода для Java программиста
200 open source проектов спустя: опыт статического анализа исходного кода
200 open source проектов спустя: опыт статического анализа исходного кода
Пояснения к статье про Copy-Paste
Ошибки, которые сложно заметить на code review, но которые находятся статичес...
DevSecOps против восстания машин
20130429 dynamic c_c++_program_analysis-alexey_samsonov
C++ весна 2014 лекция 2
Бинарные уязвимости и эксплойты: технологии и перспективы
Инструментируй это
Formal verification of operating system kernels
Как создать качественный статический анализатор
Ad

More from Andrey Karpov (20)

PDF
60 антипаттернов для С++ программиста
PDF
60 terrible tips for a C++ developer
PDF
PVS-Studio in 2021 - Error Examples
PDF
PVS-Studio in 2021 - Feature Overview
PDF
PVS-Studio в 2021 - Примеры ошибок
PDF
PVS-Studio в 2021
PPTX
Make Your and Other Programmer’s Life Easier with Static Analysis (Unreal Eng...
PPTX
Best Bugs from Games: Fellow Programmers' Mistakes
PPTX
Does static analysis need machine learning?
PPTX
Typical errors in code on the example of C++, C#, and Java
PPTX
How to Fix Hundreds of Bugs in Legacy Code and Not Die (Unreal Engine 4)
PPTX
Game Engine Code Quality: Is Everything Really That Bad?
PPTX
C++ Code as Seen by a Hypercritical Reviewer
PPTX
The Use of Static Code Analysis When Teaching or Developing Open-Source Software
PPTX
Static Code Analysis for Projects, Built on Unreal Engine
PPTX
Safety on the Max: How to Write Reliable C/C++ Code for Embedded Systems
PPTX
The Great and Mighty C++
PPTX
Static code analysis: what? how? why?
PDF
Zero, one, two, Freddy's coming for you
PDF
PVS-Studio Is Now in Chocolatey: Checking Chocolatey under Azure DevOps
60 антипаттернов для С++ программиста
60 terrible tips for a C++ developer
PVS-Studio in 2021 - Error Examples
PVS-Studio in 2021 - Feature Overview
PVS-Studio в 2021 - Примеры ошибок
PVS-Studio в 2021
Make Your and Other Programmer’s Life Easier with Static Analysis (Unreal Eng...
Best Bugs from Games: Fellow Programmers' Mistakes
Does static analysis need machine learning?
Typical errors in code on the example of C++, C#, and Java
How to Fix Hundreds of Bugs in Legacy Code and Not Die (Unreal Engine 4)
Game Engine Code Quality: Is Everything Really That Bad?
C++ Code as Seen by a Hypercritical Reviewer
The Use of Static Code Analysis When Teaching or Developing Open-Source Software
Static Code Analysis for Projects, Built on Unreal Engine
Safety on the Max: How to Write Reliable C/C++ Code for Embedded Systems
The Great and Mighty C++
Static code analysis: what? how? why?
Zero, one, two, Freddy's coming for you
PVS-Studio Is Now in Chocolatey: Checking Chocolatey under Azure DevOps

SAST и Application Security: как бороться с уязвимостями в коде

  • 1. SAST и Application Security: как бороться с уязвимостями в коде Сергей Хренов Moscow, 17 June 2019 PVS-Studio
  • 4. 4/52 Проблематика • Объёмы кода растут • Плотность ошибок растёт нелинейно • Все хотят качественный и БЕЗОПАСНЫЙ код • Старых методов контроля качества уже недостаточно
  • 5. 5/52 • Ядро Linux 1.0.0 : 176 250 строк кода • Ядро Linux 4.11.7: 18 373 471 строк кода • Photoshop 1.0 : 128 000 строк кода • Photoshop CS 6 : 10 000 000 строк кода Рост объёма кода некоторых проектов
  • 6. 6/52 Плотность ошибок (на 1 KLOC) 0 20 40 60 80 100 < 2 2-16 16-64 64-512 > 512 "Estimating Software Costs: Bringing Realism to Estimating" (Capers Jones, 2007)
  • 10. 10/52 Аттракцион “Найди ошибку” (проект Mono) V3012 The '?:' operator, regardless of its conditional expression, always returns one and the same value: Color.FromArgb (150, 179, 225). ProfessionalColorTable.cs 258
  • 12. 12/52 Статический анализ кода, используемые технологии
  • 13. 13/52
  • 14. 14/52 • Не заменяет, но дополняет обзоры кода • Позволяет контролировать качество кода в больших проектах • Раннее обнаружение проблем • Максимальное покрытие кода • Поиск разнообразных паттернов ошибок Статический анализ кода
  • 15. 15/52 Статический анализ кода Недостатки: • Ложные срабатывания • Неизвестна точная критичность ошибки
  • 16. 16/52 • Сложно искать даже простейшие перестановки: (A + B == B + A) • Макросы: кто их раскроет? • Типы: кто вычислит цепочку typedef? • Значения: как узнать, что индекс вышел за границу массива? Регулярные выражения не работают!
  • 17. 17/52 А что работает? • Сопоставление с шаблоном (pattern-based analysis) • Вывод типов (type inference) • Символьное выполнение (symbolic execution) • Анализ потока данных (data-flow analysis) • Аннотирование методов (method annotations)
  • 18. 18/52 Сопоставление с шаблоном (pattern-based analysis) Linux Kernel static ssize_t lp8788_show_eoc_time(struct device *dev, struct device_attribute *attr, char *buf) { struct lp8788_charger *pchg = dev_get_drvdata(dev); char *stime[] = { "400ms", "5min", "10min", "15min", "20min", "25min", "30min" "No timeout" }; .... } V653 A suspicious string consisting of two parts is used for array initialization. It is possible that a comma is missing. Consider inspecting this literal: "30min" "No timeout". lp8788-charger.c 657
  • 19. 19/52 Вывод типов (type inference) template<class T, size_t N> struct X { T A[N]; void Foo() { memset(A, 0, sizeof(T) * 10); } }; void Do() { X<int, 5> a; a.Foo(); } V512 Instantiate X < int, 5 >: A call of the 'memset' function will lead to overflow of the buffer 'A'. test.cpp 127
  • 20. 20/52 Символьное выполнение (symbolic execution) void F(int X) { int A = X; int B = X + 10; int Q[5]; Q[B - A] = 1; } V557 Array overrun is possible. The 'B - A' index is pointing beyond array bound. test.cpp 126
  • 21. 21/52 Анализ потока данных (data-flow analysis) static const int kDaysInMonth[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; bool ValidateDateTime(const DateTime& time) { if (time.year < 1 || time.year > 9999 || time.month < 1 || time.month > 12 || time.day < 1 || time.day > 31 || ....) { return false; } if (time.month == 2 && IsLeapYear(time.year)) { return time.month <= kDaysInMonth[time.month] + 1; } else { return time.month <= kDaysInMonth[time.month]; } } protobuf (Chromium) V547 Expression 'time.month <= kDaysInMonth[time.month] + 1' is always true. time.cc 83 V547 Expression 'time.month <= kDaysInMonth[time.month]' is always true. time.cc 85
  • 22. 22/52 Аннотирование методов (method annotations) public boolean equals(Object other) { if (other instanceof Id) { Id that = (Id) other; return purchaseSequence.equals(this.purchaseSequence) && that.purchaseNumber == this.purchaseNumber; } else { return false; } } V6009 Function 'equals' receives odd arguments. Inspect arguments: this, 1. PurchaseRecord.java 57 Hibernate
  • 23. 23/52 Да, статический анализ - это не так просто, но… …никакой магии!
  • 24. 24/52 SAST и поиск потенциальных уязвимостей
  • 25. 25/52 Рост числа выявленных уязвимостей 5632 16555 0 2000 4000 6000 8000 10000 12000 14000 16000 18000 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 https://www.cvedetails.com
  • 26. 26/52 SAST - Static Application Security Testing • Статический анализ, нацеленный на поиск и предотвращение уязвимостей • Уязвимости - те же самые обыкновенные ошибки (по данным NIST, более 60%) • Инструменты SAST помогают предотвращать уязвимости и обеспечивают поддержку стандартов безопасной разработки: CWE, MISRA, SEI CERT и т.п.
  • 28. 28/52 Поиск уязвимостей Для старого кода оптимален поиск известных уязвимостей: • Аналогия - антивирусы • Нет ложных срабатываний • Но находится только то, что уже известно • Особенно полезно в больших старых проектах Для нового кода более эффективен метод поиска дефектов кода с целью предотвращения уязвимостей.
  • 29. 29/52 Медлить нельзя! 0 1000 2000 3000 4000 5000 6000 7000 8000 Development Build QA Release Phase Cost to Fix a Security Defect ($) NIST: National Institute of Standards and Technology
  • 30. 30/52 Ошибки, потенциальные и реальные уязвимости
  • 31. 31/52 Путь к реальной уязвимости CWE - Common Weakness Enumeration CVE - Common Vulnerabilities and Exposures
  • 32. 32/52 CWE • CWE™ is a community-developed list of common software security weaknesses • https://cwe.mitre.org • Cписок из более чем 800 потенциальных уязвимостей, которые могут стать реальными
  • 33. 33/52 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
  • 34. 34/52 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); } V597 The compiler could delete the 'memset' function call, which is used to flush 'win32op' object.
  • 35. 35/52 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); } V579 The memset function receives the pointer and its size as arguments. It is possibly a mistake. Inspect the third argument.
  • 36. 36/52 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; } } V3008 The 'this.linker.s3.region' variable is assigned values twice successively. Perhaps this is a mistake.
  • 37. 37/52 CWE-674 (Uncontrolled Recursion) OnFailure? onFailure = null; public OnFailure? OnFailure { get { return this.OnFailure; } set { this.onFailure = value; } } V3110 Possible infinite recursion inside 'OnFailure' property.
  • 38. 38/52 CVE • CVE® is a list of publicly known cybersecurity vulnerabilities • https://cve.mitre.org/ • Список из более чем 114 000 реальных уязвимостей, найденных в приложениях
  • 39. 39/52 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); } V642 [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.
  • 40. 40/52 CVE-2013-4258 if (NasConfig.DoDaemon) { openlog("nas", LOG_PID, LOG_DAEMON); syslog(LOG_DEBUG, buf); closelog(); } else { errfd = stderr; } Network Audio System V618 [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).
  • 41. 41/52 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: .... } V640 [CWE-483] The code's operational logic does not correspond with its formatting. V779 [CWE-561] Unreachable code detected. It is possible that an error is present.
  • 43. 43/52 MISRA C/C++ • Motor Industry Software Reliability Association • Стандарт кодирования, который уменьшает вероятность допущения ошибки для ответственных встраиваемых систем • Проприетарный • MISRA C 2012 cодержит 143 правила • MISRA C++ 2008 cодержит 228 правил
  • 44. 44/52 MISRA C/C++ (некоторые правила) • Не используйте восьмеричные константы • Не используйте goto • Функция должна иметь ровно одну точку выхода • Не используйте функции стандартной библиотеки (atof/…/abort/exit/getenv/system/…) • Не используйте динамические аллокации • Не используйте объединения • Каждый case должен заканчиваться break или throw
  • 45. 45/52 SEI CERT • Стандарт кодирования • Разрабатывается координационным центром CERT (CERT Coordination Center, CERT/CC) • Предназначен для языков C, C++, Java, Perl • Весьма похож на CWE
  • 46. 46/52 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
  • 48. 48/52 Внедряем и используем SAST правильно • Выбираем подходящий анализатор • Настраиваем • Проверяем проект, рассматриваем текущие предупреждения как “технический долг” • Работаем с новыми предупреждениями • Внедряем SAST в системы CI • Внедряем SAST на рабочих местах • …. • PROFIT!!!
  • 49. 49/52 Снижаем потери • Возникновение уязвимости • Прямые и косвенные потери: • Эксплуатация злоумышленниками • Bug bounty • Репутация • Исправление • Выпуск обновления $ $ $ $ $ $ $
  • 50. 50/52 Снижаем потери • Возникновение уязвимости • Обнаружение с помощью SAST, исправление • Прямые и косвенные потери: • Эксплуатация злоумышленниками • Bug bounty • Репутация • Исправление • Выпуск обновления $ $ $ $ $ $ $
  • 51. 51/52 Выводы  Проблемы с безопасностью дорого обходятся, если попадают в конечный продукт  Инструменты SAST – один из способов поиска уязвимостей  Тем не менее, используйте все другие доступные вам методы  Если компания зарабатывает деньги, используя программный код, она просто обязана думать о его безопасности

Editor's Notes