Выпуск модуля LKRG 0.8 для защиты от эксплуатации уязвимостей в ядре Linux


Проект Openwall опубликовал выпуск модуля ядра LKRG 0.8 (Linux Kernel Runtime Guard), предназначенного для выявления и блокирования атак и нарушений целостности структур ядра. Например, модуль может защитить от несанкционированного внесения изменений в работающее ядро и попыток изменения полномочий пользовательских процессов (определение применения эксплоитов). Модуль подходит как для организации защиты от уже известных эксплоитов для ядра Linux (например, в ситуациях когда в системе проблематично обновить ядро), так и для противостояния эксплоитам для ещё неизвестных уязвимостей. Код проекта распространяется под лицензией GPLv2.

Среди изменений в новой версии:

  • Изменено позиционирование проекта LKRG, который теперь не разделяется на отдельные подсистемы для проверки целостности и определения применения эксплоитов, а преподносится как цельный продукт для выявления атак и различных нарушений целостности;
  • Обеспечена совместимость с ядрами Linux с 5.3 по 5.7, а также с ядрами, собранными с агрессивными оптимизациями GCC, без опций CONFIG\_USB и CONFIG\_STACKTRACE или с опцией CONFIG\_UNWINDER\_ORC, а также с ядрами, в которых отсутствуют перехватываемые LKRG функции, если без них можно обойтись;
  • При сборке обеспечена проверка некоторых обязательных настроек ядра CONFIG\_\* для формирования осмысленных сообщений об ошибках вместо неясных сбоев;
  • Добавлена поддержка ждущего (ACPI S3, suspend to RAM) и спящего (S4, suspend to disk) режимов;
  • В Makefile добавлена поддержка DKMS;
  • Реализована экспериментальная поддержка 32-разрядных платформ ARM (протестировано на Raspberry Pi 3 Model B). Ранее доступная поддержка AArch64 (ARM64) дополнена обеспечением совместимости с платой Raspberry Pi 4;
  • Добавлены новые обработчики (hook), в том числе обработчик вызова capable() для лучшего определения эксплоитов, манипулирующих "capabilities", а не идентификаторами процессов (credentials);
  • Предложена новая логика определения попыток выхода из ограничений пространств имён (например, из контейнеров Docker);
  • На системах x86-64 обеспечена проверка и применение бита SMAP (Supervisor Mode Access Prevention), предназначенного для блокирования доступа к данным в пространстве пользователя из привилегированного кода, выполняемого на уровне ядра. Защита SMEP (Supervisor Mode Execution Prevention) была реализована ранее;
  • В процессе работы обеспечено размещение настроек LKRG в странице памяти, обычно доступной только для чтения;
  • Вывод в логи сведений, которые могут быть наиболее полезны для атак (например, информация об адресах в ядре), ограничен отладочным режимом (log\_level=4 и выше), отключенным по умолчанию.
  • Повышена масштабируемость БД отслеживания процессов - вместо одного дерева RB, защищаемого одним spinlock, задействована хэш таблица из 512 деревьев RB, защищённых соответственно 512 блокировками чтения-записи;
  • Реализован и включён по умолчанию режим, при котором проверка целостности идентификаторов процесса часто выполняется только для текущей задачи, а также опционально для активируемых (просыпающихся) задач. Для остальных задач, находящихся в состоянии сна или работающих без обращения контролируемому в LKRG API ядра, проверка выполняется реже.
  • Добавлены новые sysctl и параметры модуля для тонкой настройки LKRG, а также два sysctl для упрощенной настройки путем выбора из подготовленных разработчиками наборов тонких настроек (profiles);
  • Настройки по умолчанию изменены для достижения более взвешенного баланса между оперативностью выявления нарушений и эффективностью реакции с одной стороны, и влиянием на производительность и риском ложных срабатываний с другой;
  • Unit-файл systemd переработан для загрузки модуля LKRG на раннем этапе загрузки (для отключения модуля может использоваться параметр командной строки ядра);

С учётом предложенных в новом выпуске оптимизаций снижение производительности при применении LKRG 0.8 оценивается на уровне 2.5% в режиме по умолчанию ("heavy") и 2% в облегченном режиме ("light").

В недавно проведённом исследовании эффективности пакетов для выявления руткитов LKRG показал лучшие результаты, без ложных срабатываний определив 8 из 9 протестированных руткиков, работающих на уровне ядра (были выявлены руткиты Diamorphine, Honey Pot Bears, LilyOfTheValley, Nuk3 Gh0st, Puszek, Reptile, Rootfoo Linux Rootkit и Sutekh, но пропущен Keysniffer, который является модулем ядра с кейлоггером, а не руткитом в прямом смысле). Для сравнения, пакеты AIDE, OSSEC и Rootkit Hunter выявили 2 руткита из 9, а Chkrootkit не выявил ни одного. При этом LKRG не поддерживает определение руткитов, размещаемых в пространстве пользователя, поэтому наибольшая эффективность достигается при использовании связки AIDE и LKRG, позволившей выявить 14 из 15 руткитов всех типов.

Дополнительно можно отметить что разработчик дистрибутива Whonix начал формирование готовых пакетов с DKMS для Debian, Whonix, Qubes и Kicksecure, а пакет для Arch Linux уже обновлен до версии 0.8. Пакеты с LKRG также присутствуют в российских ALT Linux и Astra Linux.

Проверка целостности в LKRG выполняется на основе сравнения актуального кода и данных ядра и модулей, некоторых важных структур данных и настроек CPU с сохраненными хэшами или копиями соответствующих областей памяти, структур данных или регистров. Проверки активируются как периодически по таймеру, так и при наступлении различных событий.

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

Источник: https://www.opennet.ru/opennews/art.shtml?num=53244


Comments 0