Рандомизация адресного пространства
Рандомизация адресного пространства (англ. Address Space Layout Randomization, ASLR) — это метод защиты компьютерных систем от эксплуатации уязвимостей, основанный на случайном размещении в оперативной памяти ключевых структур данных процесса: исполняемого кода, стека, кучи (heap), а также библиотек. Основная цель ASLR — затруднить или сделать невозможным для злоумышленника предсказание адресов, по которым расположены критически важные участки памяти, что препятствует выполнению атак типа «переполнение буфера» и внедрению вредоносного кода. Технология применяется в большинстве современных операционных систем, включая ядра Linux, Windows, macOS, iOS, Android и *BSD.
История
Идея случайного размещения данных в памяти впервые была предложена в 1993 году в рамках проекта Linux kernel patch PaX, разработанного программистом под псевдонимом Spender. Однако широкое внедрение ASLR началось лишь в начале 2000-х годов, когда атаки на основе переполнения буфера стали массовыми. В 2001 году компания Microsoft включила ограниченную версию ASLR в Windows XP SP2 (только для системных библиотек). Полноценная реализация для пользовательских процессов появилась в Windows Vista (2006) и Windows 7 (2009). В ядре Linux поддержка ASLR была добавлена в версии 2.6.12 (2005) для архитектуры x86, а затем расширена на другие архитектуры. В macOS и iOS ASLR внедрена с выходом OS X Leopard (2007) и iOS 4.3 (2011) соответственно. В Android полноценная поддержка ASLR появилась в версии 4.0 Ice Cream Sandwich (2011).
Принцип работы
ASLR реализуется на уровне операционной системы и управляется планировщиком задач. При запуске процесса ядро генерирует случайное смещение (базу) для каждой области памяти. Это смещение добавляется к стандартным адресам, которые использовались бы при отсутствии рандомизации. Например, стек процесса по умолчанию может располагаться в диапазоне 0xBFFFF000, а при ASLR — в случайном месте, например 0x9A3F2000. Аналогично рандомизируются адреса загрузки динамических библиотек (DLL, SO) и кучи.
Компоненты, подвергаемые рандомизации
- Исполняемый код (текст программы): адрес точки входа и расположение функций.
- Стек: адрес вершины стека и локальные переменные.
- Куча (heap): адрес начала динамически выделяемой памяти.
- Библиотеки: адреса загрузки динамически подключаемых библиотек (например, libc.so в Linux, kernel32.dll в Windows).
- Отображённые в память файлы (mmap): случайное размещение файлов, отображаемых в адресное пространство.
Уровни рандомизации
В разных ОС реализованы различные уровни ASLR:
- Полная рандомизация: все компоненты процесса размещаются случайно при каждом запуске.
- Частичная рандомизация: рандомизируются только некоторые компоненты (например, библиотеки, но не сам исполняемый файл).
- Рандомизация по сессиям: адреса фиксируются на время работы сессии пользователя, но меняются при перезагрузке.
Реализации в различных операционных системах
Linux
В ядре Linux ASLR управляется через файл /proc/sys/kernel/randomize_va_space. Возможны три значения:
- 0: ASLR отключён.
- 1: частичная рандомизация (стек, куча, mmap, библиотеки; исполняемый код не рандомизирован для совместимости с некоторыми старыми приложениями).
- 2: полная рандомизация (все компоненты, включая исполняемый код).
По умолчанию в большинстве дистрибутивов Linux (например, Ubuntu, Debian, Fedora) установлено значение 2. Для некоторых приложений (например, отладчиков) ASLR может быть временно отключён через флаг ADDR_NO_RANDOMIZE в атрибутах процесса.
Windows
Microsoft реализовала ASLR в Windows начиная с Vista. В Windows 10 и 11 ASLR включён по умолчанию для всех процессов. Дополнительно используется технология Force ASLR (включена в настройках безопасности), которая принудительно рандомизирует даже те исполняемые файлы, которые не были скомпилированы с поддержкой ASLR (отсутствует флаг /DYNAMICBASE в PE-заголовке). Также в Windows применяется ASLR для ядра (KASLR), рандомизирующая адреса загрузки драйверов и структур ядра.
macOS и iOS
В macOS ASLR используется с версии 10.5 (Leopard). В iOS ASLR был усилен начиная с версии 4.3, а в iOS 6 (2012) добавлена рандомизация адресов загрузки системных библиотек. В современных версиях (macOS 14 Sonoma, iOS 17) ASLR является обязательным компонентом защиты, отключение невозможно без джейлбрейка.
Android
Начиная с Android 4.0, ASLR включён по умолчанию. В версии 5.0 (Lollipop) была добавлена поддержка ASLR для 64-битных процессов. В Android 10 и выше ASLR применяется ко всем процессам, включая системные службы и приложения, запущенные в изолированных контейнерах.
Ограничения и уязвимости
ASLR не является абсолютной защитой и может быть обойдён при определённых условиях:
- Утечка адресов (Address Leak): если злоумышленник может получить информацию о фактическом расположении памяти (например, через чтение файлов
/proc/self/mapsв Linux или через уязвимости, раскрывающие адреса), ASLR теряет эффективность. - Атаки с использованием спекулятивного исполнения: уязвимости класса Spectre и Meltdown (2018) позволяют злоумышленнику обойти ASLR, используя побочные каналы для определения адресов памяти.
- Атаки на основе предсказания (Brute Force): при малом энтропийном пространстве (например, в 32-битных системах) злоумышленник может перебирать возможные адреса. Для 64-битных систем этот метод практически неэффективен из-за огромного адресного пространства.
- Обход через NOP-слайды (NOP sled): в атаках типа «heap spray» злоумышленник заполняет память большим количеством инструкций NOP, что увеличивает вероятность попадания в нужный диапазон адресов.
- Отключение ASLR: некоторые старые или неправильно скомпилированные приложения могут запрашивать отключение ASLR (например, через флаг
IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASEв Windows или через файл конфигурации в Linux).
Взаимодействие с другими методами защиты
ASLR часто используется в сочетании с другими технологиями защиты:
- NX-бит (No-Execute): запрещает выполнение кода в областях памяти, предназначенных для данных (стек, куча). Без NX ASLR может быть обойдён через внедрение кода в разрешённые области.
- Stack Canaries: защитные значения (канарейки), помещаемые в стек для обнаружения переполнения буфера.
- Control Flow Integrity (CFI): проверка целостности потока управления, предотвращающая перенаправление выполнения на случайные адреса.
- KASLR (Kernel ASLR): рандомизация адресного пространства ядра, защищающая от атак на уровне ядра.
Влияние на производительность
Внедрение ASLR незначительно увеличивает время запуска процессов (на несколько микросекунд) из-за необходимости генерации случайных смещений. На производительность выполнения программ ASLR практически не влияет, так как адресация памяти остаётся прямой и не требует дополнительных вычислений. Однако в некоторых встраиваемых системах с ограниченными ресурсами (например, микроконтроллеры) ASLR может быть отключён для экономии времени и памяти.
Критика и альтернативы
Критики ASLR указывают, что метод неэффективен против атак, не требующих знания точных адресов (например, атаки на основе форматной строки или использование утечек данных). Кроме того, в 32-битных системах энтропия ASLR недостаточна (обычно 8–12 бит для стека и кучи), что делает возможным перебор адресов за несколько минут. В ответ на это были разработаны более совершенные методы:
- Fine-Grained ASLR: рандомизация на уровне отдельных функций или даже инструкций (например, в проекте ASLR++).
- Address Space Layout Permutation (ASLP): перестановка страниц памяти, а не просто смещение.
- Randomization of Code and Data (RCD): рандомизация не только адресов, но и самого машинного кода (например, через перемешивание инструкций).
Применение в России
В российской практике ASLR используется в сертифицированных операционных системах, таких как Astra Linux Special Edition, РЕД ОС, Альт Линукс и других, входящих в Единый реестр российских программ для электронных вычислительных машин и баз данных. В этих системах ASLR является обязательным компонентом для достижения сертификации по требованиям ФСТЭК России (например, для защиты информации ограниченного доступа). В документации к Astra Linux (версии 1.7 и выше) указано, что ASLR включён по умолчанию для всех процессов, а его отключение возможно только при наличии специальных обоснований.
Источники
- PaX Team. «Address Space Layout Randomization» (документация проекта PaX).
- Microsoft. «Address Space Layout Randomization (ASLR)» (документация Windows Security).
- Linux Kernel Documentation: «/proc/sys/kernel/randomize_va_space».
- Shacham, H., et al. «On the Effectiveness of Address-Space Randomization» (2004).
- «Astra Linux Special Edition. Руководство по безопасности» (версия 1.7, 2023).
- «РЕД ОС. Руководство администратора» (версия 8.0, 2024).
- «Android Security Bulletin: ASLR Improvements» (2011–2023).
- «iOS Security Guide» (Apple, 2023).
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →