Upgrade to Pro — share decks privately, control downloads, hide ads and more …

SAST, CWE, SEI CERT и другие умные слова из мир...

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

Доклад Сергея Хренова (PVS-Studio) для PDUG-секции на форуме PHDays 9.

More Decks by Positive Development User Group

Other Decks in Programming

Transcript

  1. Заголовок ptsecurity.com SAST, CWE, SEI CERT и другие умные слова

    из мира информационной безопасности Сергей Хренов PVS-Studio Разработчик
  2. Заголовок 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 строк кода • Плотность ошибок тоже растёт, но нелинейно • Все хотят качественный и БЕЗОПАСНЫЙ код • Старых методов контроля качества уже недостаточно
  3. Заголовок 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)
  4. Заголовок 7 Как бороться с ошибками • Делать сразу правильно

    (не работает) • Следование корпоративным правилам • Использование “лучших практик” • Code Review • Парная разработка • Разработка через тестирование (TDD) • Гибкая разработка Agile • Инструментальные средства
  5. Заголовок 12 Инструментальные средства • Unit-тесты • Функциональные тесты •

    Нагрузочные тесты • … • Динамические анализаторы • Статические анализаторы
  6. Заголовок 14 Современные анализаторы  Интеграция в IDE  Интеграция

    в системы сборки и CI  Инкрементальный анализ  Механизмы подавления шума
  7. Заголовок 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
  8. Заголовок 16 Программные ошибки и их последствия (Therac-25) С июня

    1985 по январь 1987 года из-за ошибок в ПО этот аппарат стал причиной как минимум шести передозировок радиации, некоторые пациенты получили дозы в десятки тысяч рад. Как минимум двое умерли непосредственно от передозировок.
  9. Заголовок 17 Программные ошибки и их последствия (Ariane-5) 4 июня

    1996 года, космодром Куру. Во время первого запуска, на 40-й секунде полета произошло разрушение ракеты. Причина – ошибка в работе бортового программного обеспечения.
  10. Заголовок 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
  11. Заголовок 20 Поиск уязвимостей Для старого кода оптимален поиск известных

    уязвимостей: • Аналогия - антивирусы • Нет ложных срабатываний • Но находится только то, что уже известно • Особенно полезно в больших старых проектах Для нового кода более эффективен метод поиска дефектов кода с целью предотвращения уязвимостей.
  12. Заголовок 21 SAST - Static Application Security Testing • Статический

    анализ, нацеленный на поиск и предотвращение уязвимостей • Уязвимости - те же самые обыкновенные ошибки (по данным NIST, более 60%) • Инструменты SAST помогают предотвращать уязвимости и обеспечивают поддержку стандартов безопасной разработки: CWE, MISRA, SEI CERT и т.п.
  13. Заголовок 22 SAST - Static Application Security Testing Преимущества: •

    Раннее обнаружение проблем • Покрытие всего кода • Хорош в поиске опечаток и ошибок типа Copy-Paste Недостатки: • Ложные срабатывания • Неизвестна точная критичность ошибки • Слабое диагностирование утечек памяти и параллельных ошибок
  14. Заголовок 24 CWE • CWE™ is a community-developed list of

    common software security weaknesses • https://cwe.mitre.org • Cписок из более чем 800 потенциальных уязвимостей, которые могут стать реальными
  15. Заголовок 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
  16. Заголовок 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.
  17. Заголовок 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.
  18. Заголовок 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.
  19. Заголовок 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.
  20. Заголовок 30 CVE • CVE® is a list of publicly

    known cybersecurity vulnerabilities • https://cve.mitre.org/ • Список из более чем 114 000 реальных уязвимостей, найденных в приложениях
  21. Заголовок 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.
  22. Заголовок 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
  23. Заголовок 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.
  24. Заголовок 34 MISRA C/C++ • Motor Industry Software Reliability Association

    • Стандарт кодирования, который уменьшает вероятность допущения ошибки для ответственных встраиваемых систем • Проприетарный • MISRA C 2012 cодержит 143 правила • MISRA C++ 2008 cодержит 228 правил
  25. Заголовок 35 MISRA C/C++ (некоторые правила) • Не используйте восьмеричные

    константы • Не используйте goto • Функция должна иметь ровно одну точку выхода • Не используйте функции стандартной библиотеки (atof/…/abort/exit/getenv/system/…) • Не используйте динамические аллокации • Не используйте объединения • Каждый case должен заканчиваться break или throw
  26. Заголовок 36 MISRA C/C++ (Toyota) • NHTSA: за 2000 -

    2010 годы в авариях погибло 89 человек, 57 получили увечья • NHTSA и NASA провели расследование • Выявлено 7 134 нарушения по MISRA • Toyota отрицает вину, но выплачивает 16 миллиардов долларов в досудебном порядке
  27. Заголовок 37 SEI CERT • Стандарт кодирования • Разрабатывается координационным

    центром CERT (CERT Coordination Center, CERT/CC) • Предназначен для языков C, C++, Java, Perl • Весьма похож на CWE
  28. Заголовок 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
  29. Заголовок 39 Внедряем и используем SAST правильно • Выбираем подходящий

    анализатор • Настраиваем • Проверяем проект, рассматриваем текущие предупреждения как “технический долг” • Работаем с новыми предупреждениями • Внедряем SAST в системы CI • Внедряем SAST на рабочих местах • …. • PROFIT!!!
  30. Заголовок 40 Заблуждения, связанные с SAST • Дорого • Не

    для новичков • Сложно внедрять на большом проекте • Панацея от всех бед
  31. Заголовок 41 Снижаем потери • Возникновение уязвимости • Прямые и

    косвенные потери: • Эксплуатация злоумышленниками • Bug bounty • Репутация • Исправление • Выпуск обновления $ $ $ $ $ $ $
  32. Заголовок 42 Снижаем потери • Возникновение уязвимости • Обнаружение с

    помощью SAST, исправление • Прямые и косвенные потери: • Эксплуатация злоумышленниками • Bug bounty • Репутация • Исправление • Выпуск обновления $ $ $ $ $ $ $
  33. Заголовок 43 Выводы  Проблемы с безопасностью дорого обходятся, если

    попадают в конечный продукт  Инструменты SAST – один из способов поиска уязвимостей  Тем не менее, используйте все другие доступные вам методы  Если ваша компания зарабатывает деньги, используя программный код, вы просто не можете не думать о его безопасности