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) к базовому адресу загрузки образа ядра в физическую и виртуальную память. При каждой загрузке системы ядро размещается по случайному адресу в пределах заранее заданного диапазона. Это смещение применяется ко всем адресам, используемым ядром: к точкам входа функций, глобальным переменным, таблицам страниц и другим структурам данных.
Этапы инициализации
- Загрузчик (например, GRUB для Linux или Boot Manager для Windows) получает от прошивки (UEFI/BIOS) информацию о доступной памяти.
- Загрузчик генерирует случайное число, которое определяет смещение для загрузки ядра.
- Образ ядра распаковывается и размещается в памяти по адресу, равному базовому адресу по умолчанию плюс сгенерированное смещение.
- Все ссылки на адреса внутри ядра корректируются с учётом этого смещения на этапе загрузки.
Ограничения рандомизации
Эффективность 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 →