SlideShare a Scribd company logo
1 of 44
Заголовок
ptsecurity.com
SAST, CWE, SEI CERT
и другие умные слова
из мира
информационной
безопасности
Сергей Хренов
PVS-Studio
Разработчик
Заголовок
2
Докладчик
Сергей Хренов
C# разработчик, PVS-Studio
khrenov@viva64.com
www.viva64.com
Заголовок
3
Зачем слушать этот доклад
Б - безопасность
Заголовок
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 строк кода
• Плотность ошибок тоже растёт, но нелинейно
• Все хотят качественный и БЕЗОПАСНЫЙ код
• Старых методов контроля качества уже недостаточно
Заголовок
5
Когда размер имеет значение
Заголовок
6
Плотность ошибок (на 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
Как бороться с ошибками
• Делать сразу правильно (не работает)
• Следование корпоративным правилам
• Использование “лучших практик”
• Code Review
• Парная разработка
• Разработка через тестирование (TDD)
• Гибкая разработка Agile
• Инструментальные средства
Заголовок
8
Пара слов о Code Review
Заголовок
9
Пример из жизни (проект Mono)
Заголовок
10
Пример из жизни (проект Mono)
Заголовок
11
Пример из жизни (проект Mono)
Заголовок
12
Инструментальные средства
• Unit-тесты
• Функциональные тесты
• Нагрузочные тесты
• …
• Динамические анализаторы
• Статические анализаторы
Заголовок
13
Статический анализ – это…
Заголовок
14
Современные анализаторы
 Интеграция в IDE
 Интеграция в системы сборки и CI
 Инкрементальный анализ
 Механизмы подавления шума
Заголовок
15
Не медли!
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
Заголовок
16
Программные ошибки и их последствия (Therac-25)
С июня 1985 по январь
1987 года из-за ошибок
в ПО этот аппарат стал
причиной как минимум
шести передозировок
радиации, некоторые
пациенты получили
дозы в десятки
тысяч рад. Как
минимум двое умерли
непосредственно от
передозировок.
Заголовок
17
Программные ошибки и их последствия (Ariane-5)
4 июня 1996 года,
космодром Куру. Во
время первого
запуска, на 40-й
секунде полета
произошло
разрушение ракеты.
Причина – ошибка в
работе бортового
программного
обеспечения.
Заголовок
18
Нам помогут DevSecOps и SAST
Заголовок
19
Рост числа выявленных уязвимостей
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
Заголовок
20
Поиск уязвимостей
Для старого кода оптимален поиск известных уязвимостей:
• Аналогия - антивирусы
• Нет ложных срабатываний
• Но находится только то, что уже известно
• Особенно полезно в больших старых проектах
Для нового кода более эффективен метод поиска дефектов
кода с целью предотвращения уязвимостей.
Заголовок
21
SAST - Static Application Security Testing
• Статический анализ, нацеленный на поиск и
предотвращение уязвимостей
• Уязвимости - те же самые обыкновенные ошибки (по
данным NIST, более 60%)
• Инструменты SAST помогают предотвращать
уязвимости и обеспечивают поддержку стандартов
безопасной разработки: CWE, MISRA, SEI CERT и т.п.
Заголовок
22
SAST - Static Application Security Testing
Преимущества:
• Раннее обнаружение проблем
• Покрытие всего кода
• Хорош в поиске опечаток и ошибок типа Copy-Paste
Недостатки:
• Ложные срабатывания
• Неизвестна точная критичность ошибки
• Слабое диагностирование утечек памяти и параллельных
ошибок
Заголовок
23
Путь к реальной уязвимости
CWE - Common Weakness
Enumeration
CVE - Common Vulnerabilities
and Exposures
Заголовок
24
CWE
• CWE™ is a community-developed list of common
software security weaknesses
• https://cwe.mitre.org
• Cписок из более чем 800 потенциальных
уязвимостей, которые могут стать реальными
Заголовок
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
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
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
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
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
CVE
• CVE® is a list of publicly known cybersecurity
vulnerabilities
• https://cve.mitre.org/
• Список из более чем 114 000 реальных уязвимостей,
найденных в приложениях
Заголовок
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
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
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
MISRA C/C++
• Motor Industry Software Reliability Association
• Стандарт кодирования, который уменьшает вероятность
допущения ошибки для ответственных встраиваемых
систем
• Проприетарный
• MISRA C 2012 cодержит 143 правила
• MISRA C++ 2008 cодержит 228 правил
Заголовок
35
MISRA C/C++ (некоторые правила)
• Не используйте восьмеричные константы
• Не используйте goto
• Функция должна иметь ровно одну точку выхода
• Не используйте функции стандартной библиотеки
(atof/…/abort/exit/getenv/system/…)
• Не используйте динамические аллокации
• Не используйте объединения
• Каждый case должен заканчиваться break или throw
Заголовок
36
MISRA C/C++ (Toyota)
• NHTSA: за 2000 - 2010 годы в
авариях погибло 89 человек,
57 получили увечья
• NHTSA и NASA провели
расследование
• Выявлено 7 134 нарушения
по MISRA
• Toyota отрицает вину, но выплачивает 16 миллиардов долларов
в досудебном порядке
Заголовок
37
SEI CERT
• Стандарт кодирования
• Разрабатывается координационным центром CERT
(CERT Coordination Center, CERT/CC)
• Предназначен для языков C, C++, Java, Perl
• Весьма похож на CWE
Заголовок
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
Внедряем и используем SAST правильно
• Выбираем подходящий анализатор
• Настраиваем
• Проверяем проект, рассматриваем текущие
предупреждения как “технический долг”
• Работаем с новыми предупреждениями
• Внедряем SAST в системы CI
• Внедряем SAST на рабочих местах
• ….
• PROFIT!!!
Заголовок
40
Заблуждения, связанные с SAST
• Дорого
• Не для новичков
• Сложно внедрять на большом проекте
• Панацея от всех бед
Заголовок
41
Снижаем потери
• Возникновение уязвимости
• Прямые и косвенные потери:
• Эксплуатация злоумышленниками
• Bug bounty
• Репутация
• Исправление
• Выпуск обновления
$
$
$
$
$
$
$
Заголовок
42
Снижаем потери
• Возникновение уязвимости
• Обнаружение с помощью SAST, исправление
• Прямые и косвенные потери:
• Эксплуатация злоумышленниками
• Bug bounty
• Репутация
• Исправление
• Выпуск обновления
$
$
$
$
$
$
$
Заголовок
43
Выводы
 Проблемы с безопасностью дорого обходятся, если
попадают в конечный продукт
 Инструменты SAST – один из способов поиска
уязвимостей
 Тем не менее, используйте все другие доступные вам
методы
 Если ваша компания зарабатывает деньги, используя
программный код, вы просто не можете не думать о его
безопасности
Заголовок
ptsecurity.com
Спасибо!
Спасибо!

More Related Content

Similar to SAST, CWE, SEI CERT и другие умные слова из мира информационной безопасности

SAST, борьба с потенциальными уязвимостями
SAST, борьба с потенциальными уязвимостямиSAST, борьба с потенциальными уязвимостями
SAST, борьба с потенциальными уязвимостямиAndrey Karpov
 
Статический анализ кода: борьба с удорожанием ошибок
Статический анализ кода: борьба с удорожанием ошибокСтатический анализ кода: борьба с удорожанием ошибок
Статический анализ кода: борьба с удорожанием ошибокAndrey Karpov
 
PVS-Studio. Статический анализатор кода. Windows/Linux, C/C++/C#
PVS-Studio. Статический анализатор кода. Windows/Linux, C/C++/C#PVS-Studio. Статический анализатор кода. Windows/Linux, C/C++/C#
PVS-Studio. Статический анализатор кода. Windows/Linux, C/C++/C#Andrey Karpov
 
Формальная верификация кода на языке Си
Формальная верификация кода на языке СиФормальная верификация кода на языке Си
Формальная верификация кода на языке СиPositive Development User Group
 
Formal verification of C code
Formal verification of C codeFormal verification of C code
Formal verification of C codeDenis Efremov
 
Формальная верификация кода на языке Си
Формальная верификация кода на языке СиФормальная верификация кода на языке Си
Формальная верификация кода на языке СиPositive Hack Days
 
Современный статический анализ кода: что умеет он, чего не умели линтеры
Современный статический анализ кода: что умеет он, чего не умели линтерыСовременный статический анализ кода: что умеет он, чего не умели линтеры
Современный статический анализ кода: что умеет он, чего не умели линтерыcorehard_by
 
Статический анализ и написание качественного кода на C/C++ для встраиваемых с...
Статический анализ и написание качественного кода на C/C++ для встраиваемых с...Статический анализ и написание качественного кода на C/C++ для встраиваемых с...
Статический анализ и написание качественного кода на C/C++ для встраиваемых с...Andrey Karpov
 
Статический анализ исходного кода на примере WinMerge
Статический анализ исходного кода на примере WinMergeСтатический анализ исходного кода на примере WinMerge
Статический анализ исходного кода на примере WinMergeTatyanazaxarova
 
Цена ошибки
Цена ошибкиЦена ошибки
Цена ошибкиAndrey Karpov
 
Formal verification of operating system kernels
Formal verification of operating system kernelsFormal verification of operating system kernels
Formal verification of operating system kernelsDenis Efremov
 
DevSecOps против восстания машин
DevSecOps против восстания машинDevSecOps против восстания машин
DevSecOps против восстания машинAndrey Karpov
 
Технологии анализа бинарного кода приложений: требования, проблемы, инструменты
Технологии анализа бинарного кода приложений: требования, проблемы, инструментыТехнологии анализа бинарного кода приложений: требования, проблемы, инструменты
Технологии анализа бинарного кода приложений: требования, проблемы, инструментыPositive Development User Group
 
Основы и применение статического анализа кода при разработке лекция 1
Основы и применение статического анализа кода при разработке лекция 1Основы и применение статического анализа кода при разработке лекция 1
Основы и применение статического анализа кода при разработке лекция 1m2rus
 
Статический анализ: ищем ошибки... и уязвимости?
Статический анализ: ищем ошибки... и уязвимости?Статический анализ: ищем ошибки... и уязвимости?
Статический анализ: ищем ошибки... и уязвимости?Andrey Karpov
 
PVS-Studio, решение для разработки современных ресурсоемких приложений
PVS-Studio, решение для разработки современных ресурсоемких приложенийPVS-Studio, решение для разработки современных ресурсоемких приложений
PVS-Studio, решение для разработки современных ресурсоемких приложенийTatyanazaxarova
 
Что могут статические анализаторы, чего не могут программисты и тестировщики
Что могут статические анализаторы, чего не могут программисты и тестировщикиЧто могут статические анализаторы, чего не могут программисты и тестировщики
Что могут статические анализаторы, чего не могут программисты и тестировщикиAndrey Karpov
 
Модели в профессиональной инженерии и тестировании программ. Александр Петрен...
Модели в профессиональной инженерии и тестировании программ. Александр Петрен...Модели в профессиональной инженерии и тестировании программ. Александр Петрен...
Модели в профессиональной инженерии и тестировании программ. Александр Петрен...yaevents
 

Similar to SAST, CWE, SEI CERT и другие умные слова из мира информационной безопасности (20)

SAST, борьба с потенциальными уязвимостями
SAST, борьба с потенциальными уязвимостямиSAST, борьба с потенциальными уязвимостями
SAST, борьба с потенциальными уязвимостями
 
Статический анализ кода: борьба с удорожанием ошибок
Статический анализ кода: борьба с удорожанием ошибокСтатический анализ кода: борьба с удорожанием ошибок
Статический анализ кода: борьба с удорожанием ошибок
 
PVS-Studio. Статический анализатор кода. Windows/Linux, C/C++/C#
PVS-Studio. Статический анализатор кода. Windows/Linux, C/C++/C#PVS-Studio. Статический анализатор кода. Windows/Linux, C/C++/C#
PVS-Studio. Статический анализатор кода. Windows/Linux, C/C++/C#
 
Формальная верификация кода на языке Си
Формальная верификация кода на языке СиФормальная верификация кода на языке Си
Формальная верификация кода на языке Си
 
Formal verification of C code
Formal verification of C codeFormal verification of C code
Formal verification of C code
 
Формальная верификация кода на языке Си
Формальная верификация кода на языке СиФормальная верификация кода на языке Си
Формальная верификация кода на языке Си
 
Современный статический анализ кода: что умеет он, чего не умели линтеры
Современный статический анализ кода: что умеет он, чего не умели линтерыСовременный статический анализ кода: что умеет он, чего не умели линтеры
Современный статический анализ кода: что умеет он, чего не умели линтеры
 
Статический анализ и написание качественного кода на C/C++ для встраиваемых с...
Статический анализ и написание качественного кода на C/C++ для встраиваемых с...Статический анализ и написание качественного кода на C/C++ для встраиваемых с...
Статический анализ и написание качественного кода на C/C++ для встраиваемых с...
 
Статический анализ исходного кода на примере WinMerge
Статический анализ исходного кода на примере WinMergeСтатический анализ исходного кода на примере WinMerge
Статический анализ исходного кода на примере WinMerge
 
Цена ошибки
Цена ошибкиЦена ошибки
Цена ошибки
 
Цена ошибки
Цена ошибкиЦена ошибки
Цена ошибки
 
Formal verification of operating system kernels
Formal verification of operating system kernelsFormal verification of operating system kernels
Formal verification of operating system kernels
 
DevSecOps против восстания машин
DevSecOps против восстания машинDevSecOps против восстания машин
DevSecOps против восстания машин
 
Технологии анализа бинарного кода приложений: требования, проблемы, инструменты
Технологии анализа бинарного кода приложений: требования, проблемы, инструментыТехнологии анализа бинарного кода приложений: требования, проблемы, инструменты
Технологии анализа бинарного кода приложений: требования, проблемы, инструменты
 
Основы и применение статического анализа кода при разработке лекция 1
Основы и применение статического анализа кода при разработке лекция 1Основы и применение статического анализа кода при разработке лекция 1
Основы и применение статического анализа кода при разработке лекция 1
 
Статический анализ: ищем ошибки... и уязвимости?
Статический анализ: ищем ошибки... и уязвимости?Статический анализ: ищем ошибки... и уязвимости?
Статический анализ: ищем ошибки... и уязвимости?
 
PVS-Studio, решение для разработки современных ресурсоемких приложений
PVS-Studio, решение для разработки современных ресурсоемких приложенийPVS-Studio, решение для разработки современных ресурсоемких приложений
PVS-Studio, решение для разработки современных ресурсоемких приложений
 
Что могут статические анализаторы, чего не могут программисты и тестировщики
Что могут статические анализаторы, чего не могут программисты и тестировщикиЧто могут статические анализаторы, чего не могут программисты и тестировщики
Что могут статические анализаторы, чего не могут программисты и тестировщики
 
Модели в профессиональной инженерии и тестировании программ. Александр Петрен...
Модели в профессиональной инженерии и тестировании программ. Александр Петрен...Модели в профессиональной инженерии и тестировании программ. Александр Петрен...
Модели в профессиональной инженерии и тестировании программ. Александр Петрен...
 
PVS-Studio vs Chromium
PVS-Studio vs ChromiumPVS-Studio vs Chromium
PVS-Studio vs Chromium
 

More from Andrey Karpov

60 антипаттернов для С++ программиста
60 антипаттернов для С++ программиста60 антипаттернов для С++ программиста
60 антипаттернов для С++ программистаAndrey Karpov
 
60 terrible tips for a C++ developer
60 terrible tips for a C++ developer60 terrible tips for a C++ developer
60 terrible tips for a C++ developerAndrey Karpov
 
Ошибки, которые сложно заметить на code review, но которые находятся статичес...
Ошибки, которые сложно заметить на code review, но которые находятся статичес...Ошибки, которые сложно заметить на code review, но которые находятся статичес...
Ошибки, которые сложно заметить на code review, но которые находятся статичес...Andrey Karpov
 
PVS-Studio in 2021 - Error Examples
PVS-Studio in 2021 - Error ExamplesPVS-Studio in 2021 - Error Examples
PVS-Studio in 2021 - Error ExamplesAndrey Karpov
 
PVS-Studio in 2021 - Feature Overview
PVS-Studio in 2021 - Feature OverviewPVS-Studio in 2021 - Feature Overview
PVS-Studio in 2021 - Feature OverviewAndrey Karpov
 
PVS-Studio в 2021 - Примеры ошибок
PVS-Studio в 2021 - Примеры ошибокPVS-Studio в 2021 - Примеры ошибок
PVS-Studio в 2021 - Примеры ошибокAndrey Karpov
 
Make Your and Other Programmer’s Life Easier with Static Analysis (Unreal Eng...
Make Your and Other Programmer’s Life Easier with Static Analysis (Unreal Eng...Make Your and Other Programmer’s Life Easier with Static Analysis (Unreal Eng...
Make Your and Other Programmer’s Life Easier with Static Analysis (Unreal Eng...Andrey Karpov
 
Best Bugs from Games: Fellow Programmers' Mistakes
Best Bugs from Games: Fellow Programmers' MistakesBest Bugs from Games: Fellow Programmers' Mistakes
Best Bugs from Games: Fellow Programmers' MistakesAndrey Karpov
 
Does static analysis need machine learning?
Does static analysis need machine learning?Does static analysis need machine learning?
Does static analysis need machine learning?Andrey Karpov
 
Typical errors in code on the example of C++, C#, and Java
Typical errors in code on the example of C++, C#, and JavaTypical errors in code on the example of C++, C#, and Java
Typical errors in code on the example of C++, C#, and JavaAndrey Karpov
 
How to Fix Hundreds of Bugs in Legacy Code and Not Die (Unreal Engine 4)
How to Fix Hundreds of Bugs in Legacy Code and Not Die (Unreal Engine 4)How to Fix Hundreds of Bugs in Legacy Code and Not Die (Unreal Engine 4)
How to Fix Hundreds of Bugs in Legacy Code and Not Die (Unreal Engine 4)Andrey Karpov
 
Game Engine Code Quality: Is Everything Really That Bad?
Game Engine Code Quality: Is Everything Really That Bad?Game Engine Code Quality: Is Everything Really That Bad?
Game Engine Code Quality: Is Everything Really That Bad?Andrey Karpov
 
C++ Code as Seen by a Hypercritical Reviewer
C++ Code as Seen by a Hypercritical ReviewerC++ Code as Seen by a Hypercritical Reviewer
C++ Code as Seen by a Hypercritical ReviewerAndrey Karpov
 
The Use of Static Code Analysis When Teaching or Developing Open-Source Software
The Use of Static Code Analysis When Teaching or Developing Open-Source SoftwareThe Use of Static Code Analysis When Teaching or Developing Open-Source Software
The Use of Static Code Analysis When Teaching or Developing Open-Source SoftwareAndrey Karpov
 
Static Code Analysis for Projects, Built on Unreal Engine
Static Code Analysis for Projects, Built on Unreal EngineStatic Code Analysis for Projects, Built on Unreal Engine
Static Code Analysis for Projects, Built on Unreal EngineAndrey Karpov
 
Safety on the Max: How to Write Reliable C/C++ Code for Embedded Systems
Safety on the Max: How to Write Reliable C/C++ Code for Embedded SystemsSafety on the Max: How to Write Reliable C/C++ Code for Embedded Systems
Safety on the Max: How to Write Reliable C/C++ Code for Embedded SystemsAndrey Karpov
 
The Great and Mighty C++
The Great and Mighty C++The Great and Mighty C++
The Great and Mighty C++Andrey Karpov
 
Static code analysis: what? how? why?
Static code analysis: what? how? why?Static code analysis: what? how? why?
Static code analysis: what? how? why?Andrey Karpov
 
Zero, one, two, Freddy's coming for you
Zero, one, two, Freddy's coming for youZero, one, two, Freddy's coming for you
Zero, one, two, Freddy's coming for youAndrey Karpov
 

More from Andrey Karpov (20)

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

SAST, CWE, SEI CERT и другие умные слова из мира информационной безопасности

  • 1. Заголовок ptsecurity.com SAST, CWE, SEI CERT и другие умные слова из мира информационной безопасности Сергей Хренов PVS-Studio Разработчик
  • 3. Заголовок 3 Зачем слушать этот доклад Б - безопасность
  • 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 строк кода • Плотность ошибок тоже растёт, но нелинейно • Все хотят качественный и БЕЗОПАСНЫЙ код • Старых методов контроля качества уже недостаточно
  • 6. Заголовок 6 Плотность ошибок (на 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. Заголовок 7 Как бороться с ошибками • Делать сразу правильно (не работает) • Следование корпоративным правилам • Использование “лучших практик” • Code Review • Парная разработка • Разработка через тестирование (TDD) • Гибкая разработка Agile • Инструментальные средства
  • 12. Заголовок 12 Инструментальные средства • Unit-тесты • Функциональные тесты • Нагрузочные тесты • … • Динамические анализаторы • Статические анализаторы
  • 14. Заголовок 14 Современные анализаторы  Интеграция в IDE  Интеграция в системы сборки и CI  Инкрементальный анализ  Механизмы подавления шума
  • 15. Заголовок 15 Не медли! 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
  • 16. Заголовок 16 Программные ошибки и их последствия (Therac-25) С июня 1985 по январь 1987 года из-за ошибок в ПО этот аппарат стал причиной как минимум шести передозировок радиации, некоторые пациенты получили дозы в десятки тысяч рад. Как минимум двое умерли непосредственно от передозировок.
  • 17. Заголовок 17 Программные ошибки и их последствия (Ariane-5) 4 июня 1996 года, космодром Куру. Во время первого запуска, на 40-й секунде полета произошло разрушение ракеты. Причина – ошибка в работе бортового программного обеспечения.
  • 19. Заголовок 19 Рост числа выявленных уязвимостей 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
  • 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!!!
  • 40. Заголовок 40 Заблуждения, связанные с SAST • Дорого • Не для новичков • Сложно внедрять на большом проекте • Панацея от всех бед
  • 41. Заголовок 41 Снижаем потери • Возникновение уязвимости • Прямые и косвенные потери: • Эксплуатация злоумышленниками • Bug bounty • Репутация • Исправление • Выпуск обновления $ $ $ $ $ $ $
  • 42. Заголовок 42 Снижаем потери • Возникновение уязвимости • Обнаружение с помощью SAST, исправление • Прямые и косвенные потери: • Эксплуатация злоумышленниками • Bug bounty • Репутация • Исправление • Выпуск обновления $ $ $ $ $ $ $
  • 43. Заголовок 43 Выводы  Проблемы с безопасностью дорого обходятся, если попадают в конечный продукт  Инструменты SAST – один из способов поиска уязвимостей  Тем не менее, используйте все другие доступные вам методы  Если ваша компания зарабатывает деньги, используя программный код, вы просто не можете не думать о его безопасности