RPM/hardening: различия между версиями

Материал из ALT Linux Wiki
< RPM
Нет описания правки
 
(не показано 14 промежуточных версий 3 участников)
Строка 1: Строка 1:
= Включено по умолчанию в GCC =
= Включено по умолчанию в GCC =
Эти опции не нужно добавлять вручную в <tt>CFLAGS</tt>, так как они включены у нас в ALT по умолчанию. Список взят из <tt>info gcc</tt> поиском по <tt>ALT.*gcc</tt>
Эти опции не нужно добавлять вручную в <code>CFLAGS</code>, так как они включены у нас в ALT по умолчанию. Список взят из <code>info gcc</code> поиском по <code>ALT.*gcc</code>
* <tt>-Wformat=2</tt> и <tt>-Wformat-security</tt>
* <code>-Wformat=2</code> и <code>-Wformat-security</code>
* <tt>-Wtrampolines</tt>
* <code>-Wtrampolines</code>
* <tt>-D_FORTIFY_SOURCE=2</tt> (activated when <tt>-O2</tt> or higher)
* <code>-D_FORTIFY_SOURCE=2</code> (activated when <code>-O2</code> or higher)
* <tt>-fstack-protector</tt> и <tt>-fstack-protector-strong</tt>
* <code>-fstack-protector</code> и <code>-fstack-protector-strong</code>
* <tt>-fstack-clash-protection</tt>
* <code>-fstack-clash-protection</code>
Также наш GCC всегда передает линкеру: <tt>-pie -z now</tt> и <tt>--as-needed</tt>.
Также наш GCC [[UpStream/AsNeeded|всегда]] передает линкеру: <code>-pie -z now</code> и <code>--as-needed</code>.


= Можно добавить в CFLAGS =
= Что еще может быть в CFLAGS =
* <tt>-fanalyzer</tt>, но остерегайтесь ложных срабатываний, а так же эта опция потребляет много памяти.
* <code>-fanalyzer</code>, но остерегайтесь ложных срабатываний, а так же эта опция потребляет много памяти.
* Старайтесь не собирать с <tt>-O0</tt>, так ка кэто отключает многие проверки.
* Старайтесь не собирать с <code>-O0</code>, так как это отключает многие проверки.
* Для устранения verify-elf варнинга при сборке библиотек:<pre>verify-elf: ERROR: ./usr/lib64/..: found executable STACK entry: GNU_STACK ... RWE 0x10</pre> (он возникает, например, если в asm файлах нет соответствующего заголовка) может быть полезно добавить <code>-Wa,--noexecstack</code> или <code>-Wl,-z,noexecstack</code> (выбор в зависимости от обстоятельств).
* В GCC-12 появилось <code>-D_FORTIFY_SOURCE=3</code> (конфликтует с <code>-Werror</code> и может замедлять код <ref>[https://developers.redhat.com/blog/2021/04/16/broadening-compiler-checks-for-buffer-overflows-in-%20fortify%20source Broadening compiler checks for buffer overflows in _FORTIFY_SOURCE]</ref>).


= CFLAGS для тестирования пакета =
= CFLAGS для тестирования пакета =
Нельзя добавлять в итоговый пакет, но полезно использовать для (периодического) тестирования.
Нельзя добавлять в итоговый пакет, но полезно использовать для (периодического) тестирования.
* <tt>-fsanitize=address</tt>. (NB: Медленно работает leak detector на aarch64 (отключается <tt>ASAN_OPTIONS=detect_leaks=0</tt>).)
* <code>-fsanitize=address</code>. (NB: Медленно работает leak detector на aarch64 (отключается <code>ASAN_OPTIONS=detect_leaks=0</code>).)
[[LTO]] может скрывать так и добавлять новые сообщения об ошибках, поэтому рекомендуется для эксперимента собрать пакет (с и) без LTO.


= В будущем ожидается =
Пока нет поддержки следующих hardening'ов:
* Control-flow integrity (CFI) -- есть поддержка в hardware (на x86-64 и aarch64), в GCC и Clang<ref>[https://developers.redhat.com/articles/2022/06/02/use-compiler-flags-stack-protection-gcc-and-clang Use compiler flags for stack protection in GCC and Clang]</ref>, но, к сожалению, до сих пор нет поддержки в Linux kernel<ref>[https://lwn.net/Articles/900099/ Kernel support for hardware-based control-flow integrity]</ref><ref>[https://lwn.net/Articles/885220/ Shadow stacks for user space]</ref>.
<hr><references />


{{Category navigation|title=RPM|category=RPM}}
{{Category navigation|title=RPM|category=RPM}}

Текущая версия от 22:11, 19 июля 2022

Включено по умолчанию в GCC

Эти опции не нужно добавлять вручную в CFLAGS, так как они включены у нас в ALT по умолчанию. Список взят из info gcc поиском по ALT.*gcc

  • -Wformat=2 и -Wformat-security
  • -Wtrampolines
  • -D_FORTIFY_SOURCE=2 (activated when -O2 or higher)
  • -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].