Релиз LKRG 1.0.0 (Linux Kernel Runtime Guard) для защиты от эксплуатации уязвимостей в ядре Linux

Состоялся первый мажорный выпуск модуля ядра LKRG 1.0.0 (Linux Kernel Runtime Guard). Проект предназначен для проверки целостности структур ядра Linux и выявления попыток эксплуатации уязвимостей в ядре Linux. Команда Openwall, которая занимается разработкой решения, пояснила, что присвоение номера версии 1.0.0 ознаменовало достижение проектом зрелого состояния. Исходный код проекта написан на C и опубликован на GitHub под лицензией GPLv2.

По информации OpenNET, модуль LKRG подходит как для защиты от атак, манипулирующих уже известными уязвимостями в ядре Linux, так для противостояния эксплоитам, использующим ещё неизвестные уязвимости, если в них не применяются специальные меры для обхода LKRG. Защита основывается на выявлении несанкционированного внесения изменений в работающее ядро (проверка целостности) и отслеживании изменения полномочий пользовательских процессов (определение применения эксплоитов).

Проверка целостности в LKRG выполняется на основе сравнения хэшей, вычисляемых для наиболее важных областей памяти и структур данных ядра, таких как IDT (Interrupt Descriptor Table), MSR, таблицы системных вызовов, все процедуры и функции, обработчики прерываний, списки загруженных модулей, содержимое секции «.text» модулей и атрибуты процессов. Процедура проверки активируется периодически по таймеру или при наступлении определённых событий в ядре, например, при выполнении системных вызовов setuid, setreuid, fork, exit, execve и do_init_module.

Определение возможного применения эксплоитов и блокирование атак в LKRG производится на стадии до предоставления ядром доступа к ресурсам (например, до открытия файла), но после получения процессом несанкционированных полномочий (например, смена UID). При выявлении несанкционированного поведения процессов выполняется их принудительное завершение, чего достаточно для блокирования многих эксплоитов. Накладные расходы от работы модуля оцениваются в 2-2.5%.

В LKRG поддерживается работа на системах с архитектурами x86-64, AArch64 (ARM64), ARM32 и x86. Работа LKRG 1.0.0 протестирована с ядрами из различных дистрибутивов, начиная с ядра 3.10 из RHEL/CentOS 7 и заканчивая 6.17-rc4 из репозитория, в котором ведётся подготовка релиза Fedora 44. Пакеты доступны для дистрибутивов ALT Linux, Arch Linux, Astra Linux, Gentoo, Guix, NixOS, Rocky Linux, Whonix, Yocto и OpenBMC. Собранные для Rocky Linux пакеты можно использовать в RHEL 8/9 и производных дистрибутивах, таких как AlmaLinux 8/9, а пакеты для Whonix в Debian и Ubuntu.

Основные изменения в LKRG 1.0.0:

обеспечена совместимость с ядрами Linux вплоть до выпуска 6.17-rc4;

при использовании с ядрами начиная с 6.13 прекращён перехват удалённых вызовов override_creds() и revert_creds(), что ограничило выявление атак, переопределяющих указатель cred. Ограничения попытались компенсировать через добавления проверок перезаписи указателя cred в других местах ядра;

прекращено излишнее отслеживание учётных данных для которых не производится проверка целостности. Изменение позволило сократить кодовую базу примерно на 1500 строк;

добавлена поддержка появившегося в ядре Linux 6.10 механизма для создания в ФС OverlayFS временных файлов, используя опцию O_TMPFILE (ovl_tmpfile). Указанная поддержка необходима для предотвращения ложных срабатываний, проявляющихся при использовании изолированных контейнеров на системах с ядрами 6.10-6.12;

для систем x86_64 добавлена поддержка технологии Intel CET (Control‑flow Enforcement Technology) для защиты исполняемого кода с использованием инструкций IBT (indirect branch tracking), а также программной защиты kCFI (kernel Control Flow Integrity) для блокирования нарушения нормального порядка выполнения (control flow) в результате применения эксплоитов, изменяющих хранимые в памяти указатели на функции;

для подключения многих обработчиков вместо kretprobes задействован механизм kprobes, упрощающий код установки hook‑ов и позволяющий добиться более высокой производительности;

переработана работа с блокировками (lock) данных в ядре, специфичных для процесса (per‑task shadow data). За счёт исключения лишних блокировок удалось повысить производительность обращения к подобным данным;

устранены ошибки, приводившие к состоянию гонки, проблемам с проверкой целостности и ложным срабатываниям;

улучшена поддержка сборки с использованием Clang.

Источник: habr.com

0 0 голоса
Рейтинг новости
1
0
Подписаться
Уведомить о
0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии