Дата публикации:Mon, 04 Aug 2025 09:24:39 +0300
Аарон Баллман (Aaron Ballman), главный сопровождающий компилятор Clang и участник команд разработки стандартов WG21 (C++) и WG14 (C), начал обсуждение добавления в компилятор Clang режима усиления безопасности. Новый режим позволит разом активировать набор опций для усиления защиты по аналогии с добавленным в GCC 14 флагом "-fhardened", при котором включаются опции "-D_FORTIFY_SOURCE=3 -D_GLIBCXX_ASSERTIONS -ftrivial-auto-var-init=zero -fPIE -pie -Wl,-z,relro,-z,now -fstack-protector-strong -fstack-clash-protection -fcf-protection=full".
Отмечается, что в настоящее время ведётся работа по добавлению возможностей для усиления безопасности в стандарты C и C++, но этот процесс не быстрый, при том, что в Сlang уже доступны отдельные опции с реализацией дополнительных механизмов защиты. Реализуемые методы защиты часто приводят к отдельным несовместимостям с существующим кодом или нарушению ABI, что не позволяет активировать их по умолчанию. Кроме того, подобные опции разрознены (флаги для управления компиляцией, флаги генерации машинных инструкций, привязанные к аппаратным архитектурам, предупреждения, режимы диагностики, макросы), плохо документированы и выпадают из поля зрения многих разработчиков.
Единая настройка унифицирует включение связанных с безопасностью опций и упростит их применение. Рассматривается несколько вариантов активации режима усиленной безопасности, например, обсуждается активация через флаг "-fhardened", набор настроек "--config=hardened", отдельный драйвер (clang --driver-mode) или раздельные опции "-fhardened, -mhardened и -Whardened", привязанные к компиляции, генерации кода и выводу предупреждений. Режим может охватывать:
- Возможности компилятора: -ftrivial-auto-var-init, -fPIE, -fcf-protection и т.п. Возможности, привязанные к генерации кода для целевых платформ: -mspeculative-load-hardening, -mlvi-hardening и т.п. Предупреждения: -Wall, -Wextra, -Werror=return-type и т.п. Режимы усиления безопасности в стандартной библиотеке функций. Макросы: _FORTIFY_SOURCE, _GLIBCXX_ASSERTIONS и т.п. Требование к явному выбору используемого стандарта языка. Отказ компилировать код с использованием устаревших стандартов C89 и C++98. Передача дополнительных флагов компоновщику, например, для включения рандомизации адресов.
Ссылка на оригинал: https://www.opennet.ru/opennews/art.shtml?num=63675