Проект Openwall публикува модул LKRG 1.0.0 (Linux Kernel Runtime Guard), предназначен за проверка на целостността на ядрените структури и за откриване на опити за експлоатация на уязвимости в ядрото. Указва се, че присвояването на версия 1.0.0 е отбелязало достигането на зрялост за проекта. Кодът на проекта се разпространява под лицензия GPLv2.
Модулът е подходящ както за защита от атаки, манипулиращи вече известни уязвимости в ядрото на Linux, така и за противодействие на експлойти, използващи още неизвестни уязвимости, ако не се прилагат специални мерки за заобикаляне на LKRG. Защитата се основава на откритията за неоторизирани изменения в работещото ядро (проверка на целостността) и проследяване на измененията в правомощията на потребителските процеси (определяне на прилагането на експлоити).
Проверката на целостността се изпълнява на базата на сравнение на хешове, изчислявани за най-важните области на паметта и структурите на данни в ядрото, като IDT (Interrupt Descriptor Table), MSR, таблици за системни повиквания, всички процедури и функции, обработващи прекъсвания, списъци с заредени модули, съдържанието на секцията «.text» на модулите и атрибутите на процесите. Процедурата за проверка се активира периодично по таймер или при възникване на определени събития в ядрото, например при изпълнение на системни повиквания setuid, setreuid, fork, exit, execve и do_init_module.
Определението за възможното прилагане на експлоити и блокирането на атаки се извършва на етапа преди предоставянето на достъп от ядрото до ресурсите (например, преди отварянето на файл), но след получаването на неоторизирани правомощия от процеса (например, смяна на UID). При откритие на неоторизирано поведение на процесите, те се принуждават да се прекратят, което е достатъчно за блокиране на много експлоити. Разходите от работата на модула се оценяват на 2-2.5%.
Поддържат се системи с архитектури 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.
Сред измененията в новата версия:
- Осигурена е съвместимост с 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.
Източник: opennet.ru
