Открыть сервис

KASLR

KASLR (от англ. Kernel Address Space Layout Randomizationрандомизация адресного пространства ядра) — это механизм защиты компьютерных систем, реализующий принцип случайного размещения ключевых структур данных и исполняемого кода ядра операционной системы в виртуальной памяти. Относится к классу методов противодействия эксплуатации уязвимостей, основанных на знании точных адресов памяти. Является специфической реализацией более общего принципа ASLR (Address Space Layout Randomization), адаптированной для пространства ядра.

История и предпосылки появления

Развитие атак на ядро

До появления KASLR злоумышленники, получившие возможность выполнять код в пространстве ядра (например, через уязвимости типа «переполнение буфера» в драйверах), могли относительно легко определить расположение критических структур. Адреса функций и глобальных переменных в ядре часто были фиксированными для конкретной версии и конфигурации сборки. Это позволяло создавать универсальные эксплойты, работающие на большом числе систем без адаптации.

Первые реализации

Концепция рандомизации адресного пространства для пользовательских процессов (userspace ASLR) была внедрена в主流 операционных системах в начале 2000-х годов. Однако её применение к ядру столкнулось с техническими сложностями, связанными с необходимостью поддержания стабильности работы низкоуровневых компонентов, таких как обработчики прерываний и страничная память.

Первая полноценная реализация KASLR для ядра Linux была предложена и включена в состав основной ветки разработки в версии 3.14 (март 2014 года). Разработка велась группой инженеров под руководством Кирана Шармы (Kees Cook) при поддержке компании Red Hat. В операционной системе Windows аналогичный механизм, известный как Kernel ASLR, был введён начиная с Windows 8 (2012 год), а в macOS — с версии 10.8 Mountain Lion (2012 год).

Принцип работы

Базовый механизм

KASLR работает путём добавления случайного смещения (offset) к базовому адресу загрузки образа ядра в физическую и виртуальную память. При каждой загрузке системы ядро размещается по случайному адресу в пределах заранее заданного диапазона. Это смещение применяется ко всем адресам, используемым ядром: к точкам входа функций, глобальным переменным, таблицам страниц и другим структурам данных.

Этапы инициализации

  1. Загрузчик (например, GRUB для Linux или Boot Manager для Windows) получает от прошивки (UEFI/BIOS) информацию о доступной памяти.
  2. Загрузчик генерирует случайное число, которое определяет смещение для загрузки ядра.
  3. Образ ядра распаковывается и размещается в памяти по адресу, равному базовому адресу по умолчанию плюс сгенерированное смещение.
  4. Все ссылки на адреса внутри ядра корректируются с учётом этого смещения на этапе загрузки.

Ограничения рандомизации

Эффективность KASLR ограничена энтропией — количеством возможных вариантов размещения. В ранних версиях Linux KASLR предоставлял всего 1024 возможных положения (10 бит энтропии) для 64-битных систем. Это делало возможным полный перебор вариантов при локальном доступе. В современных версиях (начиная с ядра 5.x) энтропия была увеличена до 2^32 (4 миллиарда) на 64-битных архитектурах за счёт использования более широких случайных смещений и рандомизации на уровне страниц памяти.

Классификация и разновидности

По объекту рандомизации

  • KASLR образа ядра (Kernel image KASLR): Рандомизирует положение самого исполняемого кода ядра и его статических данных.
  • KASLR модулей ядра (Module KASLR): Размещает загружаемые модули (драйверы, файловые системы) по случайным адресам, независимым от адреса основного ядра.
  • KASLR структур данных (Data KASLR): Рандомизирует расположение динамических структур ядра, таких как стеки ядра, куча (slab allocator) и таблицы страниц. Реализован в Linux начиная с версии 5.18.

По архитектуре

  • x86-64 KASLR: Наиболее распространённая реализация, использующая 64-битное адресное пространство для обеспечения высокой энтропии.
  • ARM64 KASLR: Реализован для мобильных и встраиваемых систем на архитектуре ARMv8. Имеет особенности, связанные с поддержкой разных уровней исключений (EL).
  • x86-32 KASLR: Ограниченная реализация для 32-битных систем, где доступное адресное пространство значительно меньше, что снижает энтропию.

Применение и значение

Защита от эксплуатации уязвимостей

KASLR является критически важным компонентом защиты современных операционных систем. Он существенно усложняет проведение атак, требующих знания точных адресов:

  • Атаки типа ROP (Return-Oriented Programming): Злоумышленнику необходимо знать адреса «гаджетов» (gadgets) — коротких последовательностей инструкций, завершающихся инструкцией возврата. Без KASLR эти адреса были бы статическими.
  • Эксплойты для повышения привилегий: При попытке получить полный контроль над системой через уязвимость в ядре, атакующий должен перезаписать определённые указатели (например, в таблице обработчиков системных вызовов). KASLR делает расположение этих таблиц непредсказуемым.
  • Извлечение конфиденциальных данных: Даже при наличии возможности чтения памяти ядра, злоумышленнику сложнее найти нужные структуры данных без знания их адресов.

Взаимодействие с другими механизмами

KASLR не является изолированным решением. Он работает в связке с:

  • SMEP (Supervisor Mode Execution Prevention): Запрещает выполнение кода в пространстве ядра из страниц памяти, принадлежащих пользовательским процессам.
  • SMAP (Supervisor Mode Access Prevention): Запрещает ядру прямой доступ к данным пользовательского пространства.
  • KPTI (Kernel Page-Table Isolation): Отделяет таблицы страниц ядра от таблиц страниц пользовательских процессов, предотвращая утечку адресов через спекулятивное выполнение (атаки Meltdown).

Критика и ограничения

Уязвимости KASLR

Несмотря на свою полезность, KASLR не является панацеей. Исследователи неоднократно демонстрировали методы обхода:

  • Информационные утечки (Information Disclosure): Наиболее эффективный способ нейтрализовать KASLR — получить базовый адрес ядра через другую уязвимость, которая позволяет читать память или регистры. Примером может служить уязвимость CVE-2017-5123 в системном вызове waitid() в Linux.
  • Атаки по сторонним каналам (Side-Channel Attacks): В 2017 году была продемонстрирована атака, использующая разницу во времени доступа к кэшированным и некэшированным страницам памяти ядра для определения их расположения.
  • Атаки на основе предсказания ветвлений (Branch Prediction): С помощью анализа поведения предсказателя переходов процессора можно определить, по каким адресам выполнялся код ядра, что позволяет вычислить смещение KASLR.
  • Атаки на основе перебора (Brute Force): На системах с низкой энтропией (например, 32-битных) возможен полный перебор всех возможных смещений за приемлемое время.

Влияние на производительность

Включение KASLR вносит незначительное снижение производительности, связанное с:

  • Дополнительными вычислениями на этапе загрузки системы.
  • Усложнением работы кэша процессора (TLB — Translation Lookaside Buffer), так как адреса ядра меняются при каждой загрузке.

Обычно это снижение составляет менее 1% от общей производительности и считается приемлемой платой за повышение безопасности.

Реализации в различных операционных системах

Linux

KASLR в Linux является опциональным и может быть отключён параметром загрузки nokaslr. Начиная с ядра 5.18, введена поддержка рандомизации стека ядра и кучи. Разработка ведётся в рамках проекта Kernel Self Protection Project (KSPP).

Windows

В Windows Kernel ASLR (часть механизма Kernel Protection) является обязательным для всех 64-битных версий, начиная с Windows 8.1. В Windows 10 и 11 он дополнен рандомизацией пула ядра (Kernel Pool ASLR) и рандомизацией стеков (Kernel Stack ASLR).

macOS и iOS

В системах Apple KASLR (называемый Kernel ASLR) является неотъемлемой частью архитектуры безопасности XNU. Начиная с iOS 10, используется усиленная рандомизация с энтропией 256 бит, что делает перебор практически невозможным.

Источники

  • Kees Cook. «KASLR: Kernel Address Space Layout Randomization» (доклад на Linux Security Summit, 2013).
  • Документация ядра Linux: Documentation/admin-guide/kernel-parameters.rst (параметр kaslr).
  • Исследование: «KASLR is Dead: Long Live KASLR» (2017, Gruss et al.) — демонстрация обхода KASLR через атаки по сторонним каналам.
  • Спецификация безопасности Windows 10: «Windows 10 Kernel Security Enhancements» (Microsoft, 2015).
  • Документация Apple: «iOS Security Guide» (раздел «Kernel ASLR»).
  • Статья: «An Analysis of Linux KASLR» (2014, Jake Edge, LWN.net).

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →