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

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

Рандомизация адресного пространства (англ. 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) и кучи.

Компоненты, подвергаемые рандомизации

Уровни рандомизации

В разных ОС реализованы различные уровни ASLR:

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

Linux

В ядре Linux ASLR управляется через файл /proc/sys/kernel/randomize_va_space. Возможны три значения:

По умолчанию в большинстве дистрибутивов 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 не является абсолютной защитой и может быть обойдён при определённых условиях:

Взаимодействие с другими методами защиты

ASLR часто используется в сочетании с другими технологиями защиты:

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

Внедрение ASLR незначительно увеличивает время запуска процессов (на несколько микросекунд) из-за необходимости генерации случайных смещений. На производительность выполнения программ ASLR практически не влияет, так как адресация памяти остаётся прямой и не требует дополнительных вычислений. Однако в некоторых встраиваемых системах с ограниченными ресурсами (например, микроконтроллеры) ASLR может быть отключён для экономии времени и памяти.

Критика и альтернативы

Критики ASLR указывают, что метод неэффективен против атак, не требующих знания точных адресов (например, атаки на основе форматной строки или использование утечек данных). Кроме того, в 32-битных системах энтропия ASLR недостаточна (обычно 8–12 бит для стека и кучи), что делает возможным перебор адресов за несколько минут. В ответ на это были разработаны более совершенные методы:

Применение в России

В российской практике 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 →