1.0.0 : 176 250 строк кода • Ядро Linux 4.11.7: 18 373 471 строк кода • Photoshop 1.0 : 128 000 строк кода • Photoshop CS 6 : 10 000 000 строк кода • Плотность ошибок тоже растёт, но нелинейно • Все хотят качественный и БЕЗОПАСНЫЙ код • Старых методов контроля качества уже недостаточно
(не работает) • Следование корпоративным правилам • Использование “лучших практик” • Code Review • Парная разработка • Разработка через тестирование (TDD) • Гибкая разработка Agile • Инструментальные средства
1985 по январь 1987 года из-за ошибок в ПО этот аппарат стал причиной как минимум шести передозировок радиации, некоторые пациенты получили дозы в десятки тысяч рад. Как минимум двое умерли непосредственно от передозировок.
1996 года, космодром Куру. Во время первого запуска, на 40-й секунде полета произошло разрушение ракеты. Причина – ошибка в работе бортового программного обеспечения.
уязвимостей: • Аналогия - антивирусы • Нет ложных срабатываний • Но находится только то, что уже известно • Особенно полезно в больших старых проектах Для нового кода более эффективен метод поиска дефектов кода с целью предотвращения уязвимостей.
анализ, нацеленный на поиск и предотвращение уязвимостей • Уязвимости - те же самые обыкновенные ошибки (по данным NIST, более 60%) • Инструменты SAST помогают предотвращать уязвимости и обеспечивают поддержку стандартов безопасной разработки: CWE, MISRA, SEI CERT и т.п.
Раннее обнаружение проблем • Покрытие всего кода • Хорош в поиске опечаток и ошибок типа Copy-Paste Недостатки: • Ложные срабатывания • Неизвестна точная критичность ошибки • Слабое диагностирование утечек памяти и параллельных ошибок
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
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.
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.
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.
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.
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
= 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.
• Стандарт кодирования, который уменьшает вероятность допущения ошибки для ответственных встраиваемых систем • Проприетарный • MISRA C 2012 cодержит 143 правила • MISRA C++ 2008 cодержит 228 правил
константы • Не используйте goto • Функция должна иметь ровно одну точку выхода • Не используйте функции стандартной библиотеки (atof/…/abort/exit/getenv/system/…) • Не используйте динамические аллокации • Не используйте объединения • Каждый case должен заканчиваться break или throw
2010 годы в авариях погибло 89 человек, 57 получили увечья • NHTSA и NASA провели расследование • Выявлено 7 134 нарушения по MISRA • Toyota отрицает вину, но выплачивает 16 миллиардов долларов в досудебном порядке
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
анализатор • Настраиваем • Проверяем проект, рассматриваем текущие предупреждения как “технический долг” • Работаем с новыми предупреждениями • Внедряем SAST в системы CI • Внедряем SAST на рабочих местах • …. • PROFIT!!!
попадают в конечный продукт Инструменты SAST – один из способов поиска уязвимостей Тем не менее, используйте все другие доступные вам методы Если ваша компания зарабатывает деньги, используя программный код, вы просто не можете не думать о его безопасности