Компиляторы обеспечивают безопасность программного обеспечения с помощью различных механизмов, среди которых:
- Рандомизация размещения адресного пространства (ASLR). 1 Эта опция затрудняет прогнозирование адресов памяти для злоумышленника, случайным образом перемещая важные структуры данных в памяти. 1
- Защита стека (Stack Protection). 1 Опции компилятора вставляют защитные маркеры на стек. 1 При переполнении буфера программа немедленно завершится, тем самым предотвращая эксплуатацию уязвимости. 1
- Целостность потока управления (Control Flow Integrity — CFI). 1 Эта опция предотвращает атаки, связанные с нарушением потока исполнения программы. 1 Однако её внедрение может требовать изменений кода и влиять на производительность. 1
- Средства выявления ошибок (Sanitizers). 1 Использование санитайзеров на этапе тестирования позволяет найти и устранить скрытые ошибки до того, как приложение попадёт в эксплуатацию. 1
- FORTIFY_SOURCE. 1 Эта встроенная в компилятор проверка защищает от стандартных ошибок переполнения буфера в часто используемых функциях (например, memcpy, strcpy). 1
Также существует понятие «безопасного компилятора», который не вносит в бинарный код программы ошибки, которых не было в исходном коде программы. 23