Address Space Layout Randomization
Address Space Layout Randomization (ASLR, рандомизация адресного пространства) — это технология компьютерной безопасности, применяемая в операционных системах для случайного размещения ключевых областей памяти процесса (таких как стек, куча, исполняемый код и библиотеки) в адресном пространстве. Основная цель ASLR — затруднить эксплуатацию уязвимостей, связанных с повреждением памяти, путём предотвращения предсказуемого расположения объектов в памяти, что делает атаки типа «переполнение буфера» или ROP (Return-Oriented Programming) значительно более сложными.
История
Концепция ASLR была впервые предложена в конце 1990-х годов как ответ на растущее число атак, использующих уязвимости переполнения буфера. Ранние реализации появились в операционных системах с открытым исходным кодом. В 2001 году проект PaX (патч для ядра Linux) ввёл рандомизацию адресного пространства для пользовательских процессов. В 2003 году компания Microsoft внедрила частичную ASLR в Windows XP SP2, а полная поддержка была реализована в Windows Vista (2007). В macOS ASLR появилась в версии 10.5 Leopard (2007) и была значительно расширена в последующих версиях. В настоящее время ASLR является стандартным компонентом всех современных операционных систем, включая Linux, Windows, macOS, iOS, Android и FreeBSD.
Принцип работы
ASLR работает на уровне операционной системы, которая при запуске нового процесса случайным образом выбирает базовые адреса для размещения различных сегментов памяти. Конкретные механизмы зависят от архитектуры процессора и реализации ОС.
Основные рандомизируемые области
- Исполняемый код (текст): базовый адрес самой программы может быть сдвинут на случайную величину.
- Библиотеки (например, .so в Linux, .dll в Windows): адреса загрузки разделяемых библиотек рандомизируются.
- Стек: начальный адрес стека процесса выбирается случайным образом.
- Куча (heap): адрес начала кучи, выделяемой при запуске, также рандомизируется.
- Отображённые в память файлы (mmap): адреса, используемые для отображения файлов и анонимных областей памяти, рандомизируются.
Уровни рандомизации
В разных ОС реализованы различные уровни рандомизации:
- Полная (Full ASLR): рандомизируются все основные области, включая стек, кучу, библиотеки и исполняемый код. Реализована в Linux (с патчем PaX) и в Windows (начиная с Vista).
- Частичная (Partial ASLR): рандомизируются только некоторые области, например, библиотеки, но не сам исполняемый файл. Такая реализация была в ранних версиях Windows.
- Статическая (Static ASLR): базовый адрес исполняемого файла фиксирован, но библиотеки рандомизируются. Встречается в некоторых старых версиях ОС.
Реализации в различных операционных системах
Linux
В Linux ASLR реализована на уровне ядра. Управление осуществляется через файл /proc/sys/kernel/randomize_va_space, который может принимать три значения:
- 0: ASLR отключена.
- 1: частичная рандомизация (рандомизируются стек, куча и библиотеки, но не исполняемый код).
- 2: полная рандомизация (включая рандомизацию кучи и стека с использованием дополнительной энтропии). Значение по умолчанию — 2.
В дистрибутивах Linux, использующих ядро с патчем PaX, ASLR является более агрессивной, включая рандомизацию базового адреса исполняемого файла, даже если он не скомпилирован как Position Independent Executable (PIE). Современные дистрибутивы (например, Ubuntu, Fedora, Debian) по умолчанию компилируют программы с поддержкой PIE, что позволяет рандомизировать и сам исполняемый код.
Windows
В Windows ASLR реализована начиная с Windows Vista. Управление осуществляется через настройки реестра и групповые политики. В Windows 8 и более поздних версиях ASLR включена по умолчанию для всех процессов. Существуют два режима:
- Bottom-up ASLR: рандомизация адресов, выделяемых снизу вверх (например, для кучи).
- Top-down ASLR: рандомизация адресов, выделяемых сверху вниз (например, для стека).
Windows также поддерживает технологию Force ASLR, которая принудительно рандомизирует образы, не имеющие информации о предпочтительном базировании (флаг /DYNAMICBASE в компоновщике). Для исполняемых файлов, скомпилированных без поддержки ASLR, может применяться High Entropy ASLR (HEASLR), использующая 64-битное адресное пространство для увеличения энтропии.
macOS и iOS
В macOS ASLR была введена в версии 10.5 Leopard (2007) для системных библиотек, а в 10.6 Snow Leopard (2009) распространена на все приложения. В iOS ASLR является обязательной с версии 4.3 (2011). В macOS и iOS используется рандомизация с высокой энтропией, особенно для 64-битных процессов, где доступно огромное адресное пространство. В iOS также применяется KASLR (Kernel ASLR) для рандомизации адресов ядра, что затрудняет эксплуатацию уязвимостей на уровне ядра.
Android
Android, основанный на ядре Linux, использует ASLR начиная с версии 4.0 (Ice Cream Sandwich, 2011). В более поздних версиях (начиная с 5.0 Lollipop) ASLR включена по умолчанию для всех приложений, включая те, которые скомпилированы без поддержки PIE. В Android также реализована рандомизация адресов библиотек и стека.
Эффективность и ограничения
ASLR значительно повышает безопасность системы, но не является панацеей. Её эффективность зависит от энтропии (количества случайных битов) и от того, насколько хорошо она защищена от атак, направленных на обход рандомизации.
Факторы, влияющие на эффективность
- Разрядность адресного пространства: в 32-битных системах адресное пространство ограничено (4 ГБ), что снижает энтропию. В 64-битных системах доступно огромное адресное пространство, что позволяет использовать значительно больше случайных битов.
- Количество случайных битов: чем больше битов используется для рандомизации, тем сложнее угадать адрес. В 32-битных системах типичная энтропия составляет 8-16 бит, в 64-битных — до 28-32 бит.
- Поддержка PIE: если исполняемый файл не скомпилирован как PIE, его базовый адрес не рандомизируется, что делает атаки на него более простыми.
Методы обхода ASLR
- Утечка информации (Info Leak): если злоумышленник может получить доступ к информации о расположении памяти (например, через уязвимость, раскрывающую адреса), он может вычислить базовые адреса и обойти ASLR.
- Атаки с использованием предсказания (Brute Force): в 32-битных системах с низкой энтропией злоумышленник может многократно пытаться выполнить атаку, перебирая возможные адреса. Вероятность успеха может быть достаточно высокой (например, 1/256 для 8-битной энтропии).
- Return-Oriented Programming (ROP): ASLR затрудняет ROP, но не делает его невозможным, если злоумышленник может найти подходящие «гаджеты» (gadgets) в рандомизированной памяти.
- Heap Spraying: техника, при которой злоумышленник заполняет кучу большим количеством копий вредоносного кода, увеличивая вероятность попадания в нужную область, несмотря на рандомизацию.
Критика и альтернативы
Основная критика ASLR связана с тем, что она не предотвращает утечку информации, а лишь усложняет эксплуатацию уязвимостей. Кроме того, в 32-битных системах её эффективность ограничена из-за малого адресного пространства. В ответ на это были разработаны дополнительные технологии:
- ASLR с высокой энтропией (HEASLR): использует 64-битное адресное пространство для увеличения энтропии.
- KASLR (Kernel ASLR): рандомизация адресов ядра, защищающая от атак на уровне ядра.
- Control Flow Integrity (CFI): технология, проверяющая целостность потока управления, что затрудняет ROP-атаки.
- Shadow Stacks: аппаратная защита, предотвращающая перезапись адресов возврата в стеке.
Интересные факты
- В 2017 году исследователи из Университета штата Нью-Йорк в Стоуни-Брук продемонстрировали атаку ASLR⊕Cache, которая позволяла обойти ASLR на процессорах Intel, используя уязвимости в кэше памяти.
- В 2018 году была обнаружена уязвимость Meltdown, которая, среди прочего, позволяла обойти KASLR на процессорах Intel.
- В 2020 году исследователи из Университета Виргинии разработали метод BranchScope, который использовал предсказание ветвлений для обхода ASLR.
Источники
- PaX Team. «The PaX Project». 2001.
- Microsoft. «Windows ASLR». MSDN Documentation.
- Jonathan Corbet. «ASLR in Linux». LWN.net, 2005.
- Shacham, H., et al. «On the Effectiveness of Address-Space Randomization». Proceedings of the 11th ACM Conference on Computer and Communications Security, 2004.
- «Address Space Layout Randomization». Wikipedia (англ.).
- «KASLR: Kernel Address Space Layout Randomization». Linux Kernel Documentation.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →