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

Рандомизация адресного пространства

Рандомизация адресного пространства (англ. 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 включён по умолчанию для всех процессов, а его отключение возможно только при наличии специальных обоснований.

Источники

  1. PaX Team. «Address Space Layout Randomization» (документация проекта PaX).
  2. Microsoft. «Address Space Layout Randomization (ASLR)» (документация Windows Security).
  3. Linux Kernel Documentation: «/proc/sys/kernel/randomize_va_space».
  4. Shacham, H., et al. «On the Effectiveness of Address-Space Randomization» (2004).
  5. «Astra Linux Special Edition. Руководство по безопасности» (версия 1.7, 2023).
  6. «РЕД ОС. Руководство администратора» (версия 8.0, 2024).
  7. «Android Security Bulletin: ASLR Improvements» (2011–2023).
  8. «iOS Security Guide» (Apple, 2023).

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

На главную BFOmetr →