В НАЙС.ОС по умолчанию включены ключевые hardening-флаги, которые значительно повышают устойчивость системы к эксплуатации уязвимостей. Эти флаги активируют защитные механизмы на уровне бинарных файлов: PIE (перемещаемые исполняемые файлы), RELRO (защита таблиц GOT), SSP (Stack Smashing Protection), ASLR (рандомизация адресного пространства), FORTIFY_SOURCE (дополнительные проверки функций libc). Вместе они делают практически невозможным эксплуатацию типовых багов вроде переполнения буфера, возврата в libc или ROP-атак без сложных обходов. Эти защиты активированы как для системных сервисов, так и для пользовательских приложений, включая sudo, sshd, rpm, gpg. Пользователи получают безопасную по умолчанию систему, а разработчики — возможность собирать устойчивые к атакам приложения без лишних усилий.
1. Зачем нужны Hardening-флаги
Современные атаки на приложения редко опираются только на логические ошибки. Чаще всего они используют низкоуровневые уязвимости — такие как переполнение буфера, повреждение указателей, использование уже освобождённой памяти (use-after-free), переходы на произвольный код (return-to-libc, ROP).
Даже если у вас нет критических багов в коде, типовая уязвимость в сторонней библиотеке может быть использована для компрометации всей системы. Здесь на помощь приходят hardening-флаги — специальные параметры компиляции и линковки, которые:
- предотвращают исполнение кода из стека или кучи (NX, RELRO);
- делают невозможным предсказание адресов функций (ASLR, PIE);
- заставляют программы падать безопасно при попытке переписать стек (SSP);
- вставляют дополнительные проверки при работе со строками (FORTIFY_SOURCE).
Во многих случаях hardening мешает эксплойту даже при наличии уязвимости — либо усложняя атаку до невозможности, либо вызывая безопасное завершение процесса до компрометации.
📉 Исторические примеры
- Heartbleed (2014) — утечка памяти из-за отсутствия проверки границ;
- Dirty COW (2016) — гонка в доступе к памяти;
- Stack Clash (2017) — переполнение стека с перезаписью heap;
- Return-to-libc / ROP — типовые техники обфускации исполнения.
Современные флаги компиляции блокируют или смягчают большинство таких атак.
Итог: hardening — это дешёвая, эффективная и прозрачная форма защиты, которая работает на уровне компиляции и распространяется на всё системное и пользовательское ПО.
2. Какие механизмы мы используем в НАЙС.ОС
В НАЙС.ОС используется полный набор актуальных защитных флагов компиляции, линковки и исполнения. Они применяются ко всем системным пакетам по умолчанию — как при сборке в RPM-спеке, так и через глобальные политики сборки.
| Механизм | Описание | Флаг / настройка |
|---|---|---|
| PIE (Position Independent Executables) | Позволяет размещать исполняемый код в случайном месте памяти (требуется для ASLR). |
-fPIE -pie
|
| RELRO (Relocation Read-Only) | Делает GOT-таблицы только для чтения, предотвращает подмену функций. |
-Wl,-z,relro -Wl,-z,now
|
| ASLR (Address Space Layout Randomization) | Случайное размещение стека, heap, библиотек и исполняемых файлов. |
Активируется в ядре и через
PIE
|
| SSP (Stack Smashing Protection) | Вставляет канарейку (canary) в стек, проверяет перед возвратом из функции. |
-fstack-protector-strong
|
| FORTIFY_SOURCE | Расширенные проверки стандартных функций (strcpy, memcpy и др.) с размером буфера на этапе компиляции и исполнения. |
-D_FORTIFY_SOURCE=2
(с
-O2
и выше)
|
Эти флаги применяются через
%optflags
в RPM‑спецификациях и встроены в макросы
gcc
/
clang
на этапе сборки.
Также используется проверка
hardening-check
и Lint-сценарии в CI.
sudo
в НАЙС.ОС собирается с полным набором: PIE + RELRO + SSP + FORTIFY.
Попытка переполнить буфер вызывает защитный краш, а не выполнение shell-кода.
3. Как проверить, что защита работает
Проверить наличие защитных механизмов можно как на уровне исполняемых файлов, так и на уровне поведения системы. Ниже приведены основные способы.
🔍 Проверка флагов бинарника
Для анализа включённых защит можно использовать утилиту
checksec
:
checksec --file /usr/bin/sudo
Пример вывода:
RELRO Full RELRO
Stack Canary Yes
NX Enabled
PIE Enabled
FORTIFY Enabled
Также можно использовать встроенную команду
readelf
:
-
readelf -h /usr/bin/ssh— покажет, PIE или нет (ET_DYN = PIE); -
readelf -l /usr/bin/bash | grep GNU_RELRO— наличие секции RELRO; -
strings /usr/bin/bash | grep __stack_chk— наличие защиты SSP; -
objdump -d /usr/bin/ls | grep strcpy— поможет найти потенциально опасные функции;
🧪 Тест поведения (stack smashing)
Можно скомпилировать простой уязвимый код и проверить, сработает ли защита:
#include <string.h>
int main() {
char buf[8];
strcpy(buf, "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA");
return 0;
}
Скомпилируйте с SSP:
gcc -fstack-protector-strong test.c -o test
При запуске программа должна завершиться с ошибкой:
*** stack smashing detected ***: terminated
🔁 Проверка ASLR
Убедитесь, что ASLR включён в ядре:
cat /proc/sys/kernel/randomize_va_space
Значения:
-
0— отключено; -
1— частично включено (stack, mmap); -
2— полностью включено (PIE + libs + stack + heap).
Важно:
в НАЙС.ОС по умолчанию
2
, и все пользовательские процессы собираются с
PIE
.
4. Чем отличается от других дистрибутивов
Многие современные дистрибутивы Linux включают частичную поддержку hardening-флагов — но не все делают это системно и по умолчанию для всех пакетов. НАЙС.ОС отличается тем, что:
- 🔒 Все системные утилиты и сервисы собираются с PIE, RELRO, SSP, FORTIFY и NX;
-
⚙️
Политики безопасности применяются на уровне toolchain
— через глобальные
optflags,rpm macrosи компиляторы; - 🔁 ASLR включён по умолчанию во всех профилях, включая headless-серверы и контейнеры;
- 🧪 CI и QA-пайплайны включают автоматическую проверку на наличие всех защит в собранных бинарниках;
-
🧰
Утилита
hardening-checkвстроена в инструменты разработчика; -
🔐
Особое внимание уделяется критическим компонентам
:
sudo,sshd,gnupg,rpm,opensslи другим.
📊 Таблица сравнения с популярными дистрибутивами
| Дистрибутив | PIE | RELRO | SSP | FORTIFY | ASLR |
|---|---|---|---|---|---|
| НАЙС.ОС | ✅ по умолчанию | ✅ full (NOW) | ✅ strong | ✅ level 2 | ✅ включено |
| Ubuntu 22.04 | ⚠️ частично | ✅ | ✅ | ✅ | ✅ |
| Debian 12 | ⚠️ частично | ⚠️ partial | ✅ | ✅ | ✅ |
| AlmaLinux / RHEL 9 | ✅ (в некоторых пакетах) | ✅ | ✅ | ⚠️ не везде | ✅ |
Таким образом, НАЙС.ОС стремится к максимально жёсткой, но прозрачной политике hardening-защиты — без необходимости ручной настройки со стороны пользователя или сборки «особых» пакетов.
5. Как это влияет на безопасность реальных систем
Hardening-флаги — это не просто академическая «проверка чекбоксов». Они дают реальное преимущество в противостоянии атакам нулевого дня, ошибкам в сторонних библиотеках и целевым эксплойтам.
📈 Практический эффект
- 🛑 SSP (stack protector) предотвращает использование стековых переполнений — программа аварийно завершится до выполнения shellcode.
- 🔐 RELRO + PIE + ASLR усложняют или делают невозможным return-to-libc и ROP-атаки, за счёт непредсказуемости адресов и защиты GOT.
-
🧪
FORTIFY_SOURCE
внедряет дополнительные runtime-проверки в функции работы со строками и памятью (например,
strcpy,memcpy). - ⛔ NX (non-exec stack) полностью блокирует исполнение shellcode, даже если злоумышленник получил контроль над стеком.
🧬 Типовой сценарий: уязвимость в библиотеке
Допустим, в системе установлена библиотека, уязвимая к переполнению буфера (например, JPEG-декодер). Без hardening, злоумышленник может подставить обработанный файл, запустить ROP и получить shell.
С включённым hardening в НАЙС.ОС:
-
Атака будет выявлена на стадии выполнения (SSP вызывает
__stack_chk_fail()); - Стек не содержит исполняемых страниц (NX);
-
GOT защищена (RELRO), и злоумышленник не может перехватить вызов
free()илиsystem(); - Адреса функций и libc меняются при каждой загрузке (PIE + ASLR);
- Вероятность успешной эксплуатации падает практически до нуля.
Итог: даже в случае 0-day или ошибки в софте стороннего поставщика, вы получаете ещё один уровень защиты — невидимый, автоматический и работающий по умолчанию.
6. Как включить в своих проектах
Включение hardening-флагов в своих C/C++-проектах — это простая и эффективная мера безопасности. Ниже — основные подходы для популярных систем сборки и компиляторов.
🔧 Makefile
Добавьте флаги в переменные
CFLAGS
и
LDFLAGS
:
CFLAGS += -O2 -fstack-protector-strong -D_FORTIFY_SOURCE=2 -fPIE
LDFLAGS += -Wl,-z,relro,-z,now -pie
🔧 CMake
В
CMakeLists.txt
:
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O2 -fstack-protector-strong -D_FORTIFY_SOURCE=2 -fPIE")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-z,relro,-z,now -pie")
🔧 Meson
Добавьте в
meson.build
:
add_project_arguments('-D_FORTIFY_SOURCE=2', '-fstack-protector-strong', '-fPIE',
language : 'c')
add_project_link_arguments('-Wl,-z,relro', '-Wl,-z,now', '-pie',
language : 'c')
🔧 Autotools
Перед
./configure
задайте переменные окружения:
export CFLAGS="-O2 -fstack-protector-strong -D_FORTIFY_SOURCE=2 -fPIE"
export LDFLAGS="-Wl,-z,relro,-z,now -pie"
./configure
🧪 Советы по отладке
-
При использовании
-pieубедитесь, что ваш загрузчик и runtime поддерживают ASLR. -
Не все флаги совместимы с LTO (
-flto) — проводите отдельные тесты сборки. -
В случае shared-библиотек используйте
-fPICвместо-fPIE. -
Учитывайте, что
-D_FORTIFY_SOURCEработает только с-O1и выше. -
Для C++ не забудьте применить флаги и к
CXXFLAGS.
Итог: даже минимальный набор флагов может значительно повысить безопасность вашего приложения — особенно если оно работает с не доверенными данными.
7. Подводные камни и ограничения
Несмотря на очевидные плюсы, использование hardening-флагов имеет ряд ограничений и нюансов, о которых важно знать при разработке и отладке.
⚠️ Производительность и real-time
- PIE (Position Independent Executable) вносит дополнительную нагрузку на динамическое разрешение адресов . В типичных задачах разница незаметна, но в real-time системах (например, embedded, SCADA, VoIP) она может повлиять на задержки и детерминизм.
- Рекомендуется измерять производительность вручную в таких случаях и отключать PIE/ASLR точечно для критичных компонентов.
🧰 Требования к toolchain
Полноценная поддержка всех флагов требует современного компилятора и библиотек. В НАЙС.ОС всё это включено из коробки, но для других систем важно учесть:
-
GCC ≥ 9.3
— поддержка
-fstack-protector-strong, PIE по умолчанию и FORTIFY; -
Glibc ≥ 2.31
— расширенные проверки
FORTIFY_SOURCEи защита malloc-метаданных; -
binutils ≥ 2.35
— корректная линковка с
-z relro,-z now, и PIE.
🐞 Влияние на отладку
-
PIE/ASLR могут затруднить отладку, т.к. адреса в памяти меняются при каждом запуске. В GDB это можно обойти командой:
set disable-randomization off -
Отладка производительности (через
perf,valgrind) также усложняется, особенно если используетсяfortifyиstack protector, т.к. они могут прерывать выполнение при ошибках. - Системы сборки с LTO и отложенной линковкой требуют особого внимания: не все hardening-флаги дружат с оптимизирующими сборками.
Вывод: hardening — это не серебряная пуля, а инструмент. Его следует применять осознанно, с пониманием контекста и ограничений.
8. Проверка на соответствие: CI + аудит
Одного включения hardening-флагов недостаточно — важно проверять, что они действительно применились . Особенно в масштабных проектах и в рамках требований сертификации ИБ. Ниже приведены подходы к автоматической проверке и аудиту.
✅ Проверка на уровне CI/CD
Включите автоматические проверки в ваши CI-пайплайны (GitHub Actions, GitLab CI, Jenkins и др.). Пример задачи на GitHub Actions:
- name: Проверка hardening-флагов
run: |
checksec --file=./your_binary
hardening-check ./your_binary
shell: bash
Также можно встроить вызов утилит в собственные build-сценарии и Makefile:
check-hardening:
checksec --file=bin/myapp
hardening-check bin/myapp
🔍 Утилиты для аудита
-
checksec— универсальный инструмент, показывает наличие PIE, RELRO, NX, SSP и др. -
hardening-check— утилита от Debian Security, быстро проверяет соответствие общим правилам. -
lintian(в Debian/Ubuntu) — выявляет отсутствие флагов в .deb-пакетах. -
rpm --eval %__global_ldflags— проверка применяемых флагов при сборке пакетов в RPM-окружении.
📋 Интеграция с аудитом и сертификацией
- Для ОС, подлежащих сертификации ФСТЭК/Минобороны, важно зафиксировать применение флагов в отчётах по защищённости и при прохождении испытаний.
-
В НАЙС.ОС отчёты
checksecвключаются в состав артефактов сборки. - Возможно применение внешнего аудита (3rd party), особенно для компонентов безопасности, библиотек и служб.
Итог: систематическая проверка — важная часть цепочки доверия. Автоматизация аудита в CI помогает не допустить случайных ошибок и упростить сертификацию решений.
8. Проверка на соответствие: CI + аудит
Одного включения hardening-флагов недостаточно — важно проверять, что они действительно применились . Особенно в масштабных проектах и в рамках требований сертификации ИБ. Ниже приведены подходы к автоматической проверке и аудиту.
✅ Проверка на уровне CI/CD
Включите автоматические проверки в ваши CI-пайплайны (GitHub Actions, GitLab CI, Jenkins и др.). Пример задачи на GitHub Actions:
- name: Проверка hardening-флагов
run: |
checksec --file=./your_binary
hardening-check ./your_binary
shell: bash
Также можно встроить вызов утилит в собственные build-сценарии и Makefile:
check-hardening:
checksec --file=bin/myapp
hardening-check bin/myapp
🔍 Утилиты для аудита
-
checksec— универсальный инструмент, показывает наличие PIE, RELRO, NX, SSP и др. -
hardening-check— утилита от Debian Security, быстро проверяет соответствие общим правилам. -
lintian(в Debian/Ubuntu) — выявляет отсутствие флагов в .deb-пакетах. -
rpm --eval %__global_ldflags— проверка применяемых флагов при сборке пакетов в RPM-окружении.
📋 Интеграция с аудитом и сертификацией
- Для ОС, подлежащих сертификации ФСТЭК/Минобороны, важно зафиксировать применение флагов в отчётах по защищённости и при прохождении испытаний.
-
В НАЙС.ОС отчёты
checksecвключаются в состав артефактов сборки. - Возможно применение внешнего аудита (3rd party), особенно для компонентов безопасности, библиотек и служб.
Итог: систематическая проверка — важная часть цепочки доверия. Автоматизация аудита в CI помогает не допустить случайных ошибок и упростить сертификацию решений.
9. Дорожная карта
Защита по умолчанию — это не статичная цель, а постоянный процесс. В НАЙС.ОС мы продолжаем усиливать базовую безопасность системы, добавляя новые технологии и флаги по мере зрелости инструментов и поддержки со стороны toolchain.
🧠 Поддержка CET (Control-Flow Enforcement Technology)
CET — аппаратный механизм от Intel, защищающий от атак типа
Return-Oriented Programming (ROP)
и
Jump-Oriented Programming (JOP)
.
В планах — сборка ключевых библиотек и исполняемых файлов с флагом
-fcf-protection
и линковкой
-z cet
, с проверкой наличия CET в процессе загрузки.
🛡️ Расширение компиляторных флагов
-
-fstack-clash-protection— защита от переполнения стека на границе страниц (stack clash); -
-fcf-protection+-z,cet— активация CET для компилятора и линковщика; -
-D_GLIBCXX_ASSERTIONS— дополнительные проверки STL-контейнеров в libstdc++; - Введение clang-hardening-профилей для компонентов, где GCC уступает по статическому анализу и оптимизации.
⚙️ Интеграция с LTO и ASan
В перспективе планируется автоматическое профилирование и сборка критически важных библиотек с:
- LTO (Link-Time Optimization) для усиления защиты от внутримодульных переходов;
- ASan (AddressSanitizer) в режиме тестирования для выявления утечек, OOB-доступов и UAF;
- Поддержка режимов профилирования без лишнего overhead в production-билдах.
Все изменения проходят через систему CI, проверяются на совместимость и тестируются в реальных сценариях, включая сборку пользовательских пакетов и совместимость с сертификационными профилями.
Цель: сделать НАЙС.ОС одной из самых защищённых Linux-систем, где безопасность — не надстройка, а базовое свойство архитектуры.
10. Заключение
В
НАЙС.ОС
безопасность начинается не с антивирусов или файрволов, а с базовой сборки бинарных файлов. Использование
hardening-флагов
— таких как
PIE
,
RELRO
,
ASLR
,
SSP
,
FORTIFY
— даёт реальную защиту от целого класса уязвимостей на уровне памяти, управления потоком исполнения и целостности данных.
Эти механизмы включены по умолчанию для всех системных компонентов НАЙС.ОС, а также рекомендованы для пользовательских и сторонних приложений.
Hardening стоит дёшево, но защищает дорого . Не требует переписывания кода, но даёт выигрыш в стойкости перед потенциальными эксплойтами. Это особенно важно в условиях роста числа supply-chain атак и попыток эксплуатации типовых библиотек.
Мы призываем разработчиков, DevOps-инженеров и системных интеграторов:
- включайте защитные флаги в своих сборках,
- автоматизируйте проверку безопасности на уровне CI,
- расширяйте свою цепочку доверия с самых низких уровней.
Безопасность — это не опция. Это фундамент.