Рекомендации по сборке безопасных программ
23 января 2025
ID 273767
Для сборки программ мы рекомендуем задействовать следующие механизмы компилятора:
- Поддержка Data Execution Prevention (DEP) – функция безопасности, которая не позволяет программе исполнять код из области памяти, помеченной как "только для данных".
- Поддержка Address Space Layout Randomization (ASLR) – технология, при использовании которой в адресном пространстве процесса случайным образом изменяется расположение важных структур данных.
- Предотвращение эксплуатации уязвимости переполнения буфера.
- Технологии контроля передачи управления в исполняемом коде модуля
- Включение Read-only relocation (RELRO) – механизм безопасности, помечающий флагом "только для чтения" записи в таблице перемещений. Осуществляется после того, как записи были разрешены динамическим компоновщиком/загрузчиком.
- Общие проверки при сборке.
Подключение механизмов компилятора
Опция компилятора
Минимальная версия компилятора
Описание опции
-Wl,-z,noexecstackBinutils 2.14
Включение поддержки DEP.
Определенные области памяти, такие как стек или куча, помечаются специальным флагом NX, что делает их недоступными для исполнения вредоносного кода
-fPIE -pieBinutils 2.16, Clang 5.0.0
Поддержка ASLR. Сборка позиционно-независимого кода (для исполняемых файлов).
-fPIC -sharedBinutils 2.6, Clang 5.0.0
Поддержка ASLR. Сборка позиционно-независимого кода (для динамических библиотек).
-fstack-protector-strongили
-fstack-protector-allили
-fstack-protector --param=ssp-buffer-size=<N>GCC 4.9.0, Clang 5.0.0
Предотвращение эксплуатации уязвимости переполнения буфера. Включение проверок времени исполнения для выявления переполнения буфера в стеке используя строгую эвристику
или для всех функций
или для символьных массивов размером больше N.
-fcf-protection=fullGCC 8, Clang 7.0.0
Технология контроля передачи управления в исполняемом коде модуля. Включение контроля передачи управления для противодействия атакам возвратно-ориентированного программирования на x86.
-mbranch-protection=standardGCC 9, Clang 8
Технология контроля передачи управления в исполняемом коде модуля. Включение защиты ветвления для противодействия атакам возвратно-ориентированного программирования на AArch64.
-Wl,-z,relro-Wl,-z,nowBinutils 2.15
Включение RELRO. Пометка флагом "только для чтения" записей в таблице перемещений.
-Wallили
-Wextraили
-WpedanticGCC 2.95.3
Clang 4.0
Общие проверки. Изменение уровней предупреждений компилятора. -Wpedantic включает больше всего предупреждений
-Wformatили
-Wformat=2GCC 2.95.3
Clang 4.0
Общие проверки. Включение дополнительных предупреждений для функций форматирования строк.
-Wconversionили
-Wsign-conversionGCC 2.95.3
Clang 4.0
Общие проверки. Включение предупреждений о неявных преобразованиях типов.
-WtrampolinesGCC 4.3
Общие проверки. Включение предупреждений о наличии исполняемого кода в стеке, который может мешать защите виртуальной памяти стека (DEP).
-Wimplicit-fallthroughGCC 7
Clang 4.0
Общие проверки. Включение предупреждений о непреднамеренном использовании оператора
switch-case.-Werrorили
-Werror=<warning-flag>GCC 2.95.3
Clang 2.6
Общие проверки. Рассматривать предупреждения компилятора как ошибки.
-Werror=implicit-Werror=incompatible-pointer-types-Werror=int-conversionGCC 2.95.3
Clang 2.6
Общие проверки. Рассматривать устаревшие конструкции языка C как ошибки.