RPM/hardening
< RPM
Включено по умолчанию в GCC
Эти опции не нужно добавлять вручную в CFLAGS, так как они включены у нас в ALT по умолчанию. Список взят из info gcc поиском по ALT.*gcc
-Wformat=2и-Wformat-security-Wtrampolines-D_FORTIFY_SOURCE=2(activated when-O2or higher from gcc 4.1.1-alt9 up to 12.2.1-alt1)-D_FORTIFY_SOURCE=3(activated when-O1or higher from gcc 12.2.1-al2)-fstack-protectorи-fstack-protector-strong-fstack-clash-protection
Также наш GCC всегда передает линкеру: -pie -z now и --as-needed.
Что еще может быть в CFLAGS
-fanalyzer, но остерегайтесь ложных срабатываний, а так же эта опция потребляет много памяти.- Старайтесь не собирать с
-O0, так как это отключает многие проверки. - Для устранения verify-elf варнинга при сборке библиотек:
verify-elf: ERROR: ./usr/lib64/..: found executable STACK entry: GNU_STACK ... RWE 0x10
(он возникает, например, если в asm файлах нет соответствующего заголовка) может быть полезно добавить-Wa,--noexecstackили-Wl,-z,noexecstack(выбор в зависимости от обстоятельств). - В GCC-12 появилось
-D_FORTIFY_SOURCE=3(конфликтует с-Werrorи может замедлять код [1]).
CFLAGS для тестирования пакета
Нельзя добавлять в итоговый пакет, но полезно использовать для (периодического) тестирования.
-fsanitize=address. (NB: Медленно работает leak detector на aarch64 (отключаетсяASAN_OPTIONS=detect_leaks=0).)
LTO может скрывать так и добавлять новые сообщения об ошибках, поэтому рекомендуется для эксперимента собрать пакет (с и) без LTO.
В будущем ожидается
Пока нет поддержки следующих hardening'ов:
- Control-flow integrity (CFI) -- есть поддержка в hardware (на x86-64 и aarch64), в GCC и Clang[2], но, к сожалению, до сих пор нет поддержки в Linux kernel[3][4].