DevSecOps против восстания машин
Сергей Хренов
PVS-Studio
Software Engineering Conference Russia
14-15 ноября, 2019. Санкт-Петербург
2/35
DevOps = системный администратор + программист
QA = тестировщик + программист
SecOps = security anything + программист
Зачем слушать этот доклад?
Чтобы больше зарабатывать денег!
3/35
Ядро Linux 1.0.0 : 177 000 строк кода
Ядро Linux 5.1-rc2 в 118 раз больше: 20 896 000 строк кода
Размер ИМЕЕТ значение
4/35
15.41
17.68
20.35
23.14
26.66
30.73
35.82
42.62
51.11
62.12
75.44
2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025
Источник: https://www.statista.com/statistics/471264/iot-number-of-connected-devices-worldwide/
Прогнозируемые темпы роста IoT
Миллиарды устройств
5/35
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
Число выявленных уязвимостей
6/35
CWE - Common Weakness
Enumeration
CVE - Common Vulnerabilities
and Exposures
Около 64% уязвимостей – программные ошибки (NIST)
7/35
“Хватит графиков! Покажите уже код”
8/35
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);
}
9/35
V597 [CWE-14] 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. wifi_generate_pin.c 185
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);
}
10/35
void
isf_wsc_context_del (WSCContextISF *wsc_ctx)
{
....
WSCContextISF* old_focused = _focused_ic;
_focused_ic = context_scim;
_focused_ic = old_focused;
....
}
11/35
V519 [CWE-563] The '_focused_ic' variable is assigned values twice successively. Perhaps
this is a mistake. Check lines: 1260, 1261. wayland_panel_agent_module.cpp 1261
void
isf_wsc_context_del (WSCContextISF *wsc_ctx)
{
....
WSCContextISF* old_focused = _focused_ic;
_focused_ic = context_scim;
_focused_ic = old_focused;
....
}
12/35
Хочется больше примеров из Tizen?
Проверка Tizen OS: часть 1.
27000 ошибок в операционной системе Tizen
Проверка Tizen OS: часть 2.
Поговорим о микрооптимизациях на примере кода Tizen
Проверка Tizen OS: часть 3.
Продолжаем изучать Tizen: C# компоненты оказались высокого качества
13/35
“Ошибки, уязвимости…
С этим можно как-то
бороться?”
14/35
Один из вариантов борьбы с уязвимостями в IoT
15/35
Два подхода к поиску уязвимостей
• Можно (и нужно) искать потенциальные уязвимости,
которые могут привести к реальным проблемам при
написании нового кода
• Можно искать по базе существующих известных
уязвимостей в своем имеющемся коде (с помощью
автоматизированных средств)
16/35
Как обнаружить уязвимости
 Code review
 Юнит-тесты
 Динамический анализ (DAST)
 Статический анализ (SAST)
 Стандарты кодирования
17/35
Code Review
• Плюсы:
– Обмен опытом
– Правки “по горячим следам”
• Минусы:
– Дорого и долго
– Быстро устаешь от просмотра кода
18/35
Динамический анализ кода
• Отладчики
• Профилировщики
• Санитайзеры (AddressSanitizer, ThreadSanitizer, ...)
• Нашли ошибку? Можно её сразу исправлять!
(нет ложных срабатываний)
19/35
Но...
• Отладить и протестировать
под embedded не всегда
просто
• Санитайзеры и
профилировщики
медленные
• Часто нужны специальные
входные данные
20/35
• Статический анализ, нацеленный на поиск и предотвращение
уязвимостей
• Уязвимости - те же самые обыкновенные ошибки (по данным NIST,
более 60%)
• Инструменты SAST помогают предотвращать уязвимости и
обеспечивают поддержку стандартов безопасной разработки:
CWE, MISRA, SEI CERT и т.п.
Static Application Security Testing (SAST)
21/35
• Преимущества:
- Раннее обнаружение проблем
- Покрытие всего кода
- Хорош в поиске опечаток и ошибок типа copy-paste
• Недостатки:
- Ложные срабатывания
- Неизвестна точная критичность ошибки
- Слабое диагностирование утечек памяти и параллельных ошибок
Static Application Security Testing (SAST)
22/35
Стандарты кодирования
• Common Weakness Enumeration
• SEI CERT Coding Standards
• MISRA C, MISRA C++
23/35
• CWE™ is a community-developed list of common
software security weaknesses
• https://cwe.mitre.org
• Cписок из более чем 800 потенциальных
уязвимостей, которые могут стать реальными. А
могут и не стать
CWE
24/35
CWE: примеры потенциальных уязвимостей
• CWE-570571: Expression is Always FalseTrue
• CWE-467: Use of sizeof() on a Pointer Type
• CWE-476: NULL Pointer Dereference
• CWE-14: Compiler Removal of Code to Clear Buffers
• CWE-369: Divide By Zero
• CWE-20: Improper Input Validation
25/35
bool operator <(const TSegment& other) const {
if (m_start < other.m_start)
return true;
if (m_start == other.m_start)
return m_len < m_len;
return false;
}
CWE-570: Expression is Always False
V501 There are identical sub-expressions to the left and to the right of the '<'
operator: m_len < m_len segmentor.h 65
26/35
CWE-697: Insufficient Comparison
static void __page_focus_changed_cb(void *data)
{
int i = 0;
int *focus_unit = (int *)data;
if (focus_unit == NULL || focus_unit < 0) {
_E("focus page is wrong");
return;
}
....
}
V503 This is a nonsensical comparison: pointer < 0. apps_view_circle_indicator.c 193
27/35
• CVE® is a list of publicly known cybersecurity vulnerabilities
• https://cve.mitre.org/
• Список из более чем 114 000 реальных уязвимостей,
найденных в приложениях
CVE
28/35
MISRA C/C++
• Motor Industry Software Reliability Association
• Закрытый стандарт кодирования. Доступен только за деньги
• Уменьшает вероятность допущения ошибки для
ответственных встраиваемых систем
• Анализаторы, проверяющие соответствие MISRA, не ищут
ошибки
• MISRA C 2012 cодержит 143 правила
• MISRA C++ 2008 cодержит 228 правил
29/35
Примеры рекомендаций из MISRA
CoreHard. Информационная безопасность и разработка ПО
• Каждый 'switch' должен содержать 'default'
• Возвращаемое значение non-void функций должно быть
использовано
• Функция должна иметь одну точку выхода
• Указатели должны иметь не более двух уровней вложенности
• Тела циклов и условных выражений должны быть заключены в {}
• Каждый 'if ... else if' должен иметь завершающий 'else'
• Не использовать unions
30/35
• Стандарт кодирования
• Разрабатывается координационным центром CERT (CERT
Coordination Center, CERT/CC)
• Предназначен для языков C, C++, Java, Perl
• Очень похож на CWE
SEI CERT
31/35
Заблуждения о SAST
• Дорого
• Не для новичков
• Сложно внедрять на
большом проекте
• Панацея от всех бед
32/35
Внедряем и используем SAST правильно
• Выбор подходящего
анализатора, настройка под
особенности проекта
• Создание suppress-базы,
инкрементальный анализ
• Регулярное использование
на CI-серверах и рабочих
местах разработчиков
33/35
Снижаем потери
34/35
 Не допускайте попадания проблем с безопасностью в
конечный продукт
 Инструменты SAST – лишь один из способов поиска
уязвимостей
 Используйте все доступные методологии контроля качества
кода
 Не экономьте на разработке в ущерб безопасности, тогда
сможете избежать трансформации затрат в расплату
Выводы
Сергей Хренов
C# разработчик, PVS-Studio
khrenov@viva64.com
www.viva64.com
Контакты

DevSecOps против восстания машин

  • 1.
    DevSecOps против восстаниямашин Сергей Хренов PVS-Studio Software Engineering Conference Russia 14-15 ноября, 2019. Санкт-Петербург
  • 2.
    2/35 DevOps = системныйадминистратор + программист QA = тестировщик + программист SecOps = security anything + программист Зачем слушать этот доклад? Чтобы больше зарабатывать денег!
  • 3.
    3/35 Ядро Linux 1.0.0: 177 000 строк кода Ядро Linux 5.1-rc2 в 118 раз больше: 20 896 000 строк кода Размер ИМЕЕТ значение
  • 4.
    4/35 15.41 17.68 20.35 23.14 26.66 30.73 35.82 42.62 51.11 62.12 75.44 2015 2016 20172018 2019 2020 2021 2022 2023 2024 2025 Источник: https://www.statista.com/statistics/471264/iot-number-of-connected-devices-worldwide/ Прогнозируемые темпы роста IoT Миллиарды устройств
  • 5.
    5/35 5632 16555 0 2000 4000 6000 8000 10000 12000 14000 16000 18000 2008 2009 20102011 2012 2013 2014 2015 2016 2017 2018 Источник: https://www.cvedetails.com Число выявленных уязвимостей
  • 6.
    6/35 CWE - CommonWeakness Enumeration CVE - Common Vulnerabilities and Exposures Около 64% уязвимостей – программные ошибки (NIST)
  • 7.
  • 8.
    8/35 static void SHA1Final(unsignedchar digest[20], SHA1_CTX *context) { u32 i; unsigned char finalcount[8]; .... memset(context->count, 0, 8); memset(finalcount, 0, 8); }
  • 9.
    9/35 V597 [CWE-14] Thecompiler 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. wifi_generate_pin.c 185 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); }
  • 10.
    10/35 void isf_wsc_context_del (WSCContextISF *wsc_ctx) { .... WSCContextISF*old_focused = _focused_ic; _focused_ic = context_scim; _focused_ic = old_focused; .... }
  • 11.
    11/35 V519 [CWE-563] The'_focused_ic' variable is assigned values twice successively. Perhaps this is a mistake. Check lines: 1260, 1261. wayland_panel_agent_module.cpp 1261 void isf_wsc_context_del (WSCContextISF *wsc_ctx) { .... WSCContextISF* old_focused = _focused_ic; _focused_ic = context_scim; _focused_ic = old_focused; .... }
  • 12.
    12/35 Хочется больше примеровиз Tizen? Проверка Tizen OS: часть 1. 27000 ошибок в операционной системе Tizen Проверка Tizen OS: часть 2. Поговорим о микрооптимизациях на примере кода Tizen Проверка Tizen OS: часть 3. Продолжаем изучать Tizen: C# компоненты оказались высокого качества
  • 13.
    13/35 “Ошибки, уязвимости… С этимможно как-то бороться?”
  • 14.
    14/35 Один из вариантовборьбы с уязвимостями в IoT
  • 15.
    15/35 Два подхода кпоиску уязвимостей • Можно (и нужно) искать потенциальные уязвимости, которые могут привести к реальным проблемам при написании нового кода • Можно искать по базе существующих известных уязвимостей в своем имеющемся коде (с помощью автоматизированных средств)
  • 16.
    16/35 Как обнаружить уязвимости Code review  Юнит-тесты  Динамический анализ (DAST)  Статический анализ (SAST)  Стандарты кодирования
  • 17.
    17/35 Code Review • Плюсы: –Обмен опытом – Правки “по горячим следам” • Минусы: – Дорого и долго – Быстро устаешь от просмотра кода
  • 18.
    18/35 Динамический анализ кода •Отладчики • Профилировщики • Санитайзеры (AddressSanitizer, ThreadSanitizer, ...) • Нашли ошибку? Можно её сразу исправлять! (нет ложных срабатываний)
  • 19.
    19/35 Но... • Отладить ипротестировать под embedded не всегда просто • Санитайзеры и профилировщики медленные • Часто нужны специальные входные данные
  • 20.
    20/35 • Статический анализ,нацеленный на поиск и предотвращение уязвимостей • Уязвимости - те же самые обыкновенные ошибки (по данным NIST, более 60%) • Инструменты SAST помогают предотвращать уязвимости и обеспечивают поддержку стандартов безопасной разработки: CWE, MISRA, SEI CERT и т.п. Static Application Security Testing (SAST)
  • 21.
    21/35 • Преимущества: - Раннееобнаружение проблем - Покрытие всего кода - Хорош в поиске опечаток и ошибок типа copy-paste • Недостатки: - Ложные срабатывания - Неизвестна точная критичность ошибки - Слабое диагностирование утечек памяти и параллельных ошибок Static Application Security Testing (SAST)
  • 22.
    22/35 Стандарты кодирования • CommonWeakness Enumeration • SEI CERT Coding Standards • MISRA C, MISRA C++
  • 23.
    23/35 • CWE™ isa community-developed list of common software security weaknesses • https://cwe.mitre.org • Cписок из более чем 800 потенциальных уязвимостей, которые могут стать реальными. А могут и не стать CWE
  • 24.
    24/35 CWE: примеры потенциальныхуязвимостей • CWE-570571: Expression is Always FalseTrue • CWE-467: Use of sizeof() on a Pointer Type • CWE-476: NULL Pointer Dereference • CWE-14: Compiler Removal of Code to Clear Buffers • CWE-369: Divide By Zero • CWE-20: Improper Input Validation
  • 25.
    25/35 bool operator <(constTSegment& other) const { if (m_start < other.m_start) return true; if (m_start == other.m_start) return m_len < m_len; return false; } CWE-570: Expression is Always False V501 There are identical sub-expressions to the left and to the right of the '<' operator: m_len < m_len segmentor.h 65
  • 26.
    26/35 CWE-697: Insufficient Comparison staticvoid __page_focus_changed_cb(void *data) { int i = 0; int *focus_unit = (int *)data; if (focus_unit == NULL || focus_unit < 0) { _E("focus page is wrong"); return; } .... } V503 This is a nonsensical comparison: pointer < 0. apps_view_circle_indicator.c 193
  • 27.
    27/35 • CVE® isa list of publicly known cybersecurity vulnerabilities • https://cve.mitre.org/ • Список из более чем 114 000 реальных уязвимостей, найденных в приложениях CVE
  • 28.
    28/35 MISRA C/C++ • MotorIndustry Software Reliability Association • Закрытый стандарт кодирования. Доступен только за деньги • Уменьшает вероятность допущения ошибки для ответственных встраиваемых систем • Анализаторы, проверяющие соответствие MISRA, не ищут ошибки • MISRA C 2012 cодержит 143 правила • MISRA C++ 2008 cодержит 228 правил
  • 29.
    29/35 Примеры рекомендаций изMISRA CoreHard. Информационная безопасность и разработка ПО • Каждый 'switch' должен содержать 'default' • Возвращаемое значение non-void функций должно быть использовано • Функция должна иметь одну точку выхода • Указатели должны иметь не более двух уровней вложенности • Тела циклов и условных выражений должны быть заключены в {} • Каждый 'if ... else if' должен иметь завершающий 'else' • Не использовать unions
  • 30.
    30/35 • Стандарт кодирования •Разрабатывается координационным центром CERT (CERT Coordination Center, CERT/CC) • Предназначен для языков C, C++, Java, Perl • Очень похож на CWE SEI CERT
  • 31.
    31/35 Заблуждения о SAST •Дорого • Не для новичков • Сложно внедрять на большом проекте • Панацея от всех бед
  • 32.
    32/35 Внедряем и используемSAST правильно • Выбор подходящего анализатора, настройка под особенности проекта • Создание suppress-базы, инкрементальный анализ • Регулярное использование на CI-серверах и рабочих местах разработчиков
  • 33.
  • 34.
    34/35  Не допускайтепопадания проблем с безопасностью в конечный продукт  Инструменты SAST – лишь один из способов поиска уязвимостей  Используйте все доступные методологии контроля качества кода  Не экономьте на разработке в ущерб безопасности, тогда сможете избежать трансформации затрат в расплату Выводы
  • 35.
    Сергей Хренов C# разработчик,PVS-Studio khrenov@viva64.com www.viva64.com Контакты