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

ASLR

ASLR (Address Space Layout Randomization, рандомизация адресного пространства) — это технология защиты компьютерных систем от эксплуатации уязвимостей, основанная на случайном размещении в оперативной памяти ключевых областей процесса (стека, кучи, библиотек, исполняемого кода). Цель ASLR — затруднить злоумышленнику предсказание адресов, по которым находятся критически важные структуры данных или исполняемый код, что делает невозможным или крайне сложным выполнение атак типа переполнения буфера, возврата в libc (return-to-libc) и ROP (Return-Oriented Programming).

История

Предпосылки и ранние реализации

Идея рандомизации адресного пространства впервые была предложена в 1990-х годах как ответ на рост числа атак, использующих уязвимости переполнения буфера. До появления ASLR адреса памяти в большинстве операционных систем были фиксированными или предсказуемыми, что позволяло злоумышленникам, зная структуру памяти, вставлять произвольный код или манипулировать потоком выполнения.

Первая известная реализация ASLR была представлена в 2001 году в проекте OpenBSD (версия 3.0). Разработчики OpenBSD внедрили рандомизацию стека, кучи и адресов загружаемых библиотек. В 2003 году компания Microsoft добавила поддержку ASLR в Windows XP Service Pack 2, но только для 64-битных приложений. Полноценная поддержка в Windows появилась начиная с Windows Vista (2007 год).

Развитие в Linux и других системах

В ядре Linux ASLR была реализована в версии 2.6.12 (2005 год) и с тех пор постоянно совершенствовалась. В 2008 году в ядро была добавлена поддержка рандомизации адресов стека и кучи для 32-битных процессов. В 2010-х годах ASLR стала обязательной для всех современных операционных систем, включая macOS (с версии 10.5 Leopard, 2007 год), iOS, Android и FreeBSD.

Уязвимости и обходы

Несмотря на эффективность, ASLR не является панацеей. В 2010-х годах были обнаружены методы обхода ASLR, такие как:

  • Утечки информации (information leaks) — злоумышленник может получить адрес какой-либо области памяти через другую уязвимость (например, чтение неинициализированной памяти).
  • Атаки на основе предсказания (например, использование слабой энтропии в 32-битных системах, где количество возможных вариантов адресов ограничено).
  • Атаки с использованием аппаратных уязвимостей (например, Meltdown и Spectre, 2018 год), которые позволяют читать память ядра, минуя ASLR.

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

Основные механизмы

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

  • Стек — область временного хранения локальных переменных и адресов возврата.
  • Куча (heap) — область динамического выделения памяти.
  • Библиотеки (shared libraries) — загружаемые динамические библиотеки (например, libc, libssl).
  • Исполняемый код (executable) — сама программа.

Каждая область размещается в памяти по случайному адресу, который меняется при каждом новом запуске процесса. В многопоточных приложениях рандомизация применяется к каждому потоку отдельно.

Энтропия и разрядность

Эффективность ASLR зависит от энтропии — количества случайных битов, используемых для генерации смещения. В 64-битных системах энтропия значительно выше, чем в 32-битных:

  • 32-битные системы: обычно 8–16 бит энтропии, что даёт от 256 до 65 536 возможных вариантов адресов. Это делает ASLR уязвимой для атак перебором (brute force).
  • 64-битные системы: 24–32 бита энтропии, что даёт миллионы или миллиарды вариантов. Практически не поддаётся перебору.

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

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

  • DEP (Data Execution Prevention) — запрет на выполнение кода из областей данных (стек, куча). Без DEP ASLR бесполезна, так как злоумышленник может вставить код в стек и выполнить его.
  • PIE (Position Independent Executable) — режим компиляции, при котором исполняемый файл может быть загружен по любому адресу. Без PIE ASLR не влияет на адрес самого исполняемого кода.
  • CFG (Control Flow Guard) — защита потока управления, предотвращающая непредусмотренные переходы.

Классификация

По типу рандомизируемых объектов

  • Полная (full ASLR) — рандомизируются все области: стек, куча, библиотеки, исполняемый код (при PIE).
  • Частичная (partial ASLR) — рандомизируются только библиотеки и стек, но не исполняемый код (если программа не скомпилирована с PIE).
  • Пользовательская (user-space ASLR) — применяется только к процессам пользовательского режима.
  • Ядерная (kernel ASLR) — рандомизация адресов ядра операционной системы (KASLR). Внедрена в Linux с версии 4.12 (2017 год), в Windows начиная с Windows 8.

По способу реализации

  • Статическая ASLR — рандомизация выполняется один раз при загрузке операционной системы (например, для ядра).
  • Динамическая ASLR — рандомизация выполняется при каждом запуске процесса.

Применение

В операционных системах

ASLR является обязательной частью всех современных операционных систем:

  • Windows — включена по умолчанию начиная с Windows Vista. Для 64-битных приложений — полная ASLR, для 32-битных — частичная, если не включена опция /HIGHENTROPYVA.
  • Linux — включена по умолчанию. Управляется через файл /proc/sys/kernel/randomize_va_space (значение 2 — полная рандомизация, 1 — частичная, 0 — отключена).
  • macOS — включена с версии 10.5. Для приложений из App Store обязательна PIE.
  • Android — включена начиная с Android 4.0 (Ice Cream Sandwich). Для приложений, написанных на Java, ASLR не применяется, так как они работают в виртуальной машине Dalvik/ART с собственным управлением памятью.
  • iOS — включена с версии 4.3. Для всех приложений обязательна PIE.

В веб-браузерах

Современные браузеры (Google Chrome, Mozilla Firefox, Microsoft Edge) используют ASLR для защиты от атак на уязвимости JavaScript и плагинов. В Chrome реализована так называемая «песочница» (sandbox), где каждый процесс работает с изолированной памятью, и ASLR усиливает эту изоляцию.

В серверных приложениях

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

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

Недостатки

  • Утечки информации — ASLR не защищает от атак, при которых злоумышленник получает адрес памяти через другую уязвимость (например, чтение неинициализированной памяти или утечка через /proc/self/maps в Linux).
  • Ограниченная энтропия в 32-битных системах — в 32-битных системах количество возможных адресов невелико, что позволяет атаковать ASLR перебором.
  • Аппаратные уязвимости — уязвимости типа Meltdown и Spectre позволяют читать память ядра, обходя ASLR.
  • Совместимость — некоторые старые приложения, скомпилированные без поддержки PIE, не могут использовать ASLR для исполняемого кода.

Контрмеры

Для повышения эффективности ASLR применяются:

  • Увеличение энтропии — переход на 64-битные системы.
  • Использование дополнительных механизмов — DEP, CFG, изоляция процессов.
  • Защита от утечек — запрет на чтение /proc/self/maps для непривилегированных пользователей (в Linux — параметр kernel.kptr_restrict).

Интересные факты

  • В 2012 году исследователи из Университета штата Пенсильвания продемонстрировали атаку на ASLR в Windows 7, используя утечку информации через кэш процессора (атака «ASLR Cache»).
  • В 2017 году в Linux была обнаружена уязвимость CVE-2017-1000253, позволявшая обходить ASLR через утечку адресов стека в 32-битных процессах.
  • В 2018 году уязвимости Meltdown и Spectre показали, что даже аппаратная изоляция памяти не гарантирует защиту от обхода ASLR.

Источники

  • «Address Space Layout Randomization (ASLR)» — Microsoft Security Research & Defense, 2007.
  • «The Linux Kernel: ASLR» — документация ядра Linux, версия 5.10.
  • «ASLR: A Survey of Attacks and Defenses» — H. Shacham, M. Page, B. Pfaff, 2004.
  • «Meltdown and Spectre: Vulnerabilities in Modern Computers Leak Passwords and Sensitive Data» — J. Horn, 2018.
  • «OpenBSD: The First OS with ASLR» — OpenBSD Project, 2001.

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

На главную BFOmetr →