Близко к железу
C++ (и его предшественник C) — языки системного программирования. На них написаны операционные системы, браузеры, игровые движки, драйверы и многие программы, где важна скорость.
При чём тут безопасность: огромная доля серьёзных уязвимостей — ошибки работы с памятью именно в коде на C и C++.
Ручное управление памятью
Программист сам выделяет и освобождает память. Ошибки приводят к уязвимостям:
- выход за границы буфера (переполнение буфера);
- использование уже освобождённой памяти;
- утечки памяти.
Такие ошибки позволяют злоумышленнику испортить данные или выполнить свой код.
Зачем безопаснику C++
- Реверс-инжиниринг: вредоносные программы и уязвимое ПО часто написаны на C/C++, и дизассемблированный код похож на них.
- Поиск уязвимостей и понимание эксплойтов.
- Понимание, почему работают ASLR, неисполняемая память и другие защиты ОС.
Современный C++
Современный C++ даёт более безопасные инструменты: умные указатели вместо ручного освобождения памяти, контейнеры с проверкой границ, строки вместо массивов символов.
Помогают и инструменты: предупреждения компилятора, статические анализаторы, санитайзеры памяти, фаззинг.
Безопасные по памяти языки
Многие организации рекомендуют для новых проектов языки, безопасные по памяти: Rust, Go, C#, Java, Python.
Но существующий код на C и C++ никуда не денется ещё десятилетия. Специалисты, которые умеют его читать и находить в нём ошибки, будут нужны долго.
Главное за урок
- C и C++ — языки ОС, браузеров и драйверов.
- Ручное управление памятью — источник опасных уязвимостей.
- Знание C++ нужно для реверса и поиска уязвимостей.