В Clang намерены добавить режим усиленной безопасности

Аарон Баллман (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.
  • Передача дополнительных флагов компоновщику, например, для включения рандомизации адресов.
Release. Ссылка here.