ASLR (Address Space Layout Randomization)

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 22:22, 4 мая 2017.

ASLR (англ. address space layout randomization — «рандомизация размещения адресного пространства») — технология, применяемая в операционных системах, при использовании которой случайным образом изменяется расположение в адресном пространстве процесса важных структур данных, а именно образов исполняемого файла, подгружаемых библиотек, кучи и стека.

Технология ASLR позволяет размещать системные компоненты в разных областях памяти при каждом запуске операционной системы. Задача этой технологии – внесение случайности в распределение адресов оперативной памяти, используемых приложением. Использование ASLR изменяет расположение в адресном пространстве таких важных структур как образ исполняемого файла, подгружаемых библиотек, кучи и прочего. Использование ASLR приводит к тому, что целый класс атак (к примеру, переполнение буфера, возврат в библиотеку (return-to-libc)) заканчивается неудачей. Помимо этого технология позволяет обнаруживать подобные атаки, так как в результате неудачных попыток исполнение атакуемого приложения прекращается. [Источник 1]

Эта технология позволяет сделать разработку эксплойтов гораздо более дорогостоящим мероприятием, поскольку кроме эксплуатации самой уязвимости в ПО злоумышленнику нужно опереться на те или иные предсказуемые адреса в памяти в момент эксплуатации, которых ASLR его лишает. Например, если при помощи переполнения буфера или другим методом атакующий получит возможность передать управление по произвольному адресу, ему нужно будет угадать, по какому именно адресу расположен стек, куча или другие структуры данных, в которые можно поместить shell-код. Сходные проблемы возникнут и при атаке типа «возврат в библиотеку» (return-to-libc): атакующему не будет известен адрес, по которому загружена библиотека. От атакующего скрыты конкретные адреса, и, если не удастся угадать правильный адрес, приложение скорее всего аварийно завершится, тем самым лишив атакующего возможности повторной атаки и привлекая внимание системного администратора.

Технические особенности

Ключевой элемент

Ключевую роль в работе ASLR играют генератор случайных чисел и пара функций, модифицирующих базовый адрес загружаемого PE-файла. Например, Windows 8 полагается на генератор случайных чисел, который по сути является генератором Фибоначчи с задержкой с параметрами j=24 и k=55. Его зерно инициализируется в модуле winload.exe при старте системы. Winload.exe собирает энтропию из различных источников: ключи реестра, TPM, текущее время, ACPI, а также при помощи новой инструкции rdrand. Инициализация ядерного генератора случайных чисел детально описана в книге [Источник 2].

Показатели эффективности

Рандомизация макета адресного пространства основана на низкой вероятности того, что злоумышленник угадает места расположения случайно расположенных областей. Безопасность увеличивается за счет увеличения пространства поиска. Таким образом, рандомизация в адресном пространстве более эффективна, когда в случайных смещениях присутствует больше энтропии. Энтропия увеличивается за счет увеличения объема пространства виртуальной памяти, в котором происходит рандомизация, или сокращения периода, в течение которого происходит рандомизация. Период, как правило, делается как можно менее продолжительным, поэтому большинство систем должно увеличивать рандомизацию пространства VMA.

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

Могут быть объявлены следующие переменные:

(энтропийные биты вершины стека)
(энтропийные биты mmap() базы)
(энтропийные биты основной исполняемой базы)
(энтропийные биты базы кучи)
(атакованные биты за попытку энтропии стека)
(атакованные биты за попытку энтропии mmap() базы)
(атакованные биты за попытку энтропии основной исполняемой базы)
(атакованные биты за попытку энтропии базы кучи)
(сделанные попытки)
(общее количество энтропии: )

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

Следующие формулы представляют вероятность успеха для данного набора попыток по битам энтропии:

(изолированное предположение, адресное пространство повторно рандомизируется после каждой попытки)
(систематическое грубое навязывание копий программы с одинаковым адресным пространством)

Во многих системах может равняться тысячам миллионов; в современных 64-битных системах эти цифры обычно достигают миллионов как минимум. Marco H. and Ripoll I. показали как обойти ASLR в 64-битных системах менее чем за одну секунду при определенных обстоятельствах.[Источник 3]. Для 32-битных систем скоростей 2004 года, которые имеют 16 бит для адресной рандомизации, Shacham и его коллеги "... 16 бит адресной рандомизации могут быть побеждены грубой силой в течение нескольких минут."[Источник 4] Следует отметить, что утверждение авторов базируется на способности атаковать одно и то же приложение несколько раз без какой-либо задержки. Правильные реализации ASLR, например, включенные в grsecurity, предоставляют несколько методов, делающих невозможным такие атаки с применением грубой силы. Один из способов заключается в предотвращении выполнения исполняемого файла за настраиваемое количество времени, если он разбился определенное количество раз.

В Android реализуется Library Load Order Randomization, форма ASLR, которая рандомизирует порядок, в котором загружаются библиотеки. Это дает очень мало энтропии. Ниже приведена аппроксимация числа битов энтропии, приходящегося на нужную библиотеку; Это еще не объясняет различия в размерах библиотек, поэтому фактический прирост энтропии действительно несколько выше. Обратите внимание, что атакующим обычно нужна только одна библиотека; математика усложняется с увеличением количества библиотек - продемонстрировано ниже. Обратите внимание, что случай, когда злоумышленник использует только одну библиотеку, является упрощением более сложной формулы, которая при описании одной библиотеки пишется с параметром .

(количество загруженных библиотек)
(количество библиотек, используемых атакующим)

Эти параметры имеют тенденцию быть низкими даже при больших значениях ,наиболее важно, что злоумышленники, как правило, могут использовать только стандартную библиотеку C и, таким образом, с высокой вероятностью можно предположить, что . Интересно однако, что даже для небольшом числе библиотек здесь имеется несколько единиц энтропии, поэтому потенциально интересно комбинировать рандомизацию порядка загрузки библиотеки с рандомизацией адреса VMA, чтобы получить несколько дополнительных битов энтропии. Обратите внимание, что эти дополнительные биты энтропии не будут применяться к другим сегментам mmap(), только к библиотекам.

Уменьшение энтропии

Атакующие могут использовать несколько методов для уменьшения энтропии, присутствующей в рандомизированном адресном пространстве, начиная от простых утечек информации и заканчивая атакой множества битов энтропии за атаку (например, путем heap spraying). Этому мало, что можно противопоставить.

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

Можно также уменьшить энтропию в стеке или куче. Обычно стек должен быть выровнен по 16 байт, и, следовательно - это наименьший возможный интервал рандомизации, в то время как куча должна быть выровнена по странице, обычно 4096 байтов. При попытке атаки можно выровнять повторяющиеся атаки с этими интервалами; а NOP-слайд может быть использован с shellcode-инъекцией, и строку /bin/sh можно будет заменить строкой ////////bin/sh для произвольного числа слешей при попытке возврата к system. Количество удаленных битов равняется для интервалов нападения.

Такое уменьшение ограничено из-за количества данных в стеке или куче. Например, стек, как правило, ограничен 8 МБ и растет намного меньше, это позволяет хранить не более 19 бит энтропии, хотя более консервативная оценка будет составлять около 8-10 бит, что соответствует заполнению стека 4-16 КБ. Куча, с другой стороны, ограничена поведением распределителя памяти, в случае glibc, распределения выше 128   КБ создаются с использованием mmap(), ограничивая атакующих до 5   бит сокращения. Это также является ограничивающим фактором для брутфорса. Хотя количество атакуемых операций может быть уменьшено, размер атак увеличивается настолько, что это может в некоторых случаях стать очевидным для систем обнаружения вторжений при попытках битов энтропии.

Реализации

Microsoft Windows

В ОС Windows технология ASLR поддерживается, начиная с Windows Vista (2007 год) для исполнимых файлов и библиотек, собранных сo специальными флагами. ASLR также поддерживается в более поздних версиях Windows, таких как Windows Server 2008, Windows 7, Windows Server 2008 R2, Windows 8, Windows 8.1. ASLR не используется для приложений, собранных без специальных флагов, и при работе в режиме совместимости с более ранними версиями Windows. В ОС Windows XP и Windows Server 2003 ASLR можно включить для любых выбранных приложений с помощью набора средств Microsoft EMET(Enhanced Mitigation Experience Toolkit).

Если в узком смысле ASLR понимается как просто перемещение образа по непредсказуемым адресам с каждой перезагрузкой, то в более общем смысле эта возможность на уровне системы должна лишить атакующих любой возможности зацепится за те или иные адреса функций системных библиотек и иных системных объектов (ASLR bypass mitigation / Address Space Information Disclosure Hardening) в тех нескольких десятках байт shell-кода, который может быть исполнен минуя Windows DEP (с помощью ROP). В последнее время, в том числе, и с выпуском новейших Windows 8/8.1 Microsoft (MS) решила более серьезно подойти к развертыванию данной особенности в системе.

Совместимость ПО с ASLR

Microsoft использует по отношению к ASLR схожий c DEP подход, т. е. разрешать его использование по мере необходимости, если приложение скомпилировано с поддержкой. Такая практика применяется в виду очевидных проблем совместимости, которые могут возникнуть при работе программ с технологиями, на которые они могут реагировать неадекватно. Но в случае с ASLR эта ситуация работает с большими ограничениями. Например, на современных выпусках Windows 8/8.1 DEP включен всегда для приложений вне зависимости от того, скомпилированы они с его поддержкой или нет (по крайней мере на 64-битном процессоре и вне зависимости от разрядности ОС и параметра загрузчика). С ASLR ситуация иная, даже работая на Windows 8/8.1 он опирается на правила его поддержки самим приложением и не включает рандомизацию образа, если в заголовке нет этого флага.

Security Feature Bypass

Атакующие могут использовать «преимущества» системной библиотеки, которая не скомпилирована с поддержкой ASLR, для своих целей, например, для реализации стабильной цепочки ROP, которая будет работать во всех поддерживаемых ОС. Как показывает практика последних лет, такая возможность использовалась не один раз при организации таргетированных атак. Здесь указаны такие эксплуатируемые in-the-wild уязвимости типа RCE (drive-by download). Как видно, библиотека MS Office (hxds.dll) не поддерживает ASLR (Office 2007-2010) и атакующие смогли воспользоваться ее не меняющимся адресом загрузки для успешной эксплуатации уязвимости. В рамках декабрьского patch tuesday компания закрыла эту оплошность (которая называется Security Feature Bypass) с помощью MS13-106, обеспечивая пользователей Windows, которые работают с этой версией Office, должным уровнем защиты.

Force ASLR

Одной из основных возможностей по поддержке ASLR, которую MS внесла с Windows 8, является функция принудительного ASLR (Force ASLR). Эта функция чем-то напоминает параметр OptIn политики DEP для всей системы. Теперь используя раздел реестра Image File Execution Options (IFEO) HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options и параметр MitigationOptions пользователь может вручную включать ASLR для исполняемых PE файлов. Подобная функция доступна и для пользователей Windows 7 при установке опционального обновления KB2639308. Для того чтобы сделать Internet Explorer (10+) более безопасным, компания ввела поддержку функции принудительного применения ASLR (на Windows 8+ и для Windows 7 с установленным KB2639308) для всех библиотек, загружаемых в адресное пространство процесса браузера. Таким образом, если какая-то из библиотек или плагинов изначально скомпилирована без поддержки этой функции, она будет применена к ней в принудительном порядке.

High Entropy ASLR

ASLR потенциально может работать эффективнее в 64-битном адресном пространстве, поскольку там существует гораздо большая возможность по произвольному размещению памяти в таком большом адресном пространстве. Очевидно и само его использование уже является усложняющим фактором для heap spray. В то же время ОС до Windows 8 не используют ASLR на x64 самым полноценным образом. Главным образом это касается возможности энтропии (т. е. степени произвольности/предсказуемости выбора адреса) и сколько бит адреса будут использоваться для вычисления произвольности этого размещения. В Windows 8 такая возможность получила название High Entropy Randomization. Windows 8+ содержит возможности, реализующие High Entropy Randomization и эта технология распространяется как на выделяемые процессом блоки виртуальной памяти, так на и загружаемые исполняемые файлы. Браузер Internet Explorer 10+ использует режим High Entropy ASLR (x64).

ASLR Bypass Mitigations

С выпуском Windows 8 компания постаралась пойти по стратегии сокрытия различных адресов системных функций и объектов. Некоторые из этих возможностей доставлялись как обновления и для Windows 7. Присутствие подобной информации по предсказуемым для атакующих адресам сильно снижает возможности существующих технологий DEP&ASLR и повышает возможность успеха атакующих к эксплуатации. Одним из ярких примеров является обновление MS13-031, которое вводит ограничение на выделение памяти по нулевой странице (Windows 7+). Размещение кода на этой странице с последующей эксплуатацией уязвимости в драйвере используется атакующими как LPE, т. е. поднятие своих привилегий до системных и исполнение своего кода в режиме ядра. В Windows 8.1 появилась возможность скрывать информацию об адресах объектов ядра для недоверенных приложений (чей Integrity Level < Medium). [Источник 5]

Фундаментальная уязвимость ASLR

В 2016 году группа голландских специалистов показала, как с помощью JavaScript обойти защиту ASLR в браузере Microsoft Edge, используя атаку по стороннему каналу дедупликации памяти. Microsoft быстро отключила дедубликацию памяти, чтобы защитить своих пользователей. Но это не решило проблему ASLR на фундаментальном уровне, связанную с работой самого устройства управления памятью (MMU) в процессорах. [Источник 6]

Linux

В ядре Linux простой вариант ASLR имеется с 2005 года (с версии 2.6.12). Более сложные и полные варианты ASLR предлагаются в виде патчей (PaX, ExecShield и др.). В дистрибутивах, содержащих в названии слово «hardened», а также в современных версиях дистрибутива Ubuntu, сильные варианты включены по умолчанию. Для работы ASLR (для размещения исполняемых файлов в памяти по случайным адресам) исполняемые файлы должны быть скомпилированы в режиме position-independent executable (разновидность позиционно-независимого кода для исполняемых файлов).

Android

Сегодня ASLR в том или ином виде поддерживается практически всеми популярными ОС, и Android вовсе не исключение: полная поддержка этой технологии появилась в версии 4.1, а в урезанном виде (только для стека) была доступна с первых версий системы. Проблема только в том, что из-за самого принципа работы Android, который предполагает использовать одну и ту же загруженную в память среду исполнения для запуска всех приложений (форк процесса zygote в режиме copy-on-write), ASLR здесь не так эффективна, как в других системах (адреса всех библиотек и классов среды исполнения остаются одинаковыми для всех приложений). Практически единственный способ решить эту проблему — повторно загружать среду исполнения для каждого приложения отдельно. [Источник 7]

Важные недостатки

Общие

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

  • увеличится размер кода исполняемых файлов;
  • увеличится время загрузки в память каждого исполняемого файла;
  • возникнет дополнительная несовместимость с ПО и библиотеками, разработанным под версии ОС без ASLR.

Зависимость от уязвимостей в процессорах

В середине октября 2016 года группа американских исследователей информационной безопасности из Калифорнийского (Риверсайд) и Нью-Йоркского (Бинхемптон) университетов опубликовала описание техники атаки, которая использует для обхода ASLR ошибку в процессорах Intel. Исследователям удалось обнаружить ошибку в работе части процессора Haswell, которая называется предиктор — используя ее разработанное ими приложение смогло предсказывать расположения в памяти, в которые другие программы будут загружать данные. Предиктор содержит таблицу «буфер целевой ветви» (branch target buffer), в которой хранятся расположение в памяти (так называемые адреса) ветвей. Современные процессоры используют предиктор ветвей для ускорения операций с памятью — это достигается за счет того, что система может «предсказывать» адреса, где находятся инструкции, которые скоро будут исполнены. Для облегчения процесса «предсказания» в буферах также хранятся адреса ранее использованных ветвей. Техника атаки использует коллизию в таблице целевых буферов — с ее помощью можно узнать участки памяти, где находятся конкретные куски кода. Таким образом, если атакующий создаст простое приложение, использующее этот механизм обхода ASLR, которое будет работать в связке с эксплоитом какой-либо уязвимости самой операционной системы, то это откроет возможность к удаленному выполнению вредоносного кода. По мнению исследователей, их метод позволяет одинаково успешно обходить механизмы ASLR, реализованные как в Microsoft Windows так и в OS X от Apple. В настоящий момент продолжаются эксперименты с целью выяснить, работает ли новая техника обхода ASLR на процессорах других архитектур. Исследователи представили разработанную ими технику обхода ASLR на конференции IEEE/ACM International Symposium on Microarchitecture, прошедшей в городе Тайбэй (Тайвань) — они продемонстрировали ее на компьютере c процессором Haswell, работающем под управлением последней версии Linux. [Источник 8]

Источники

  1. ASLR (Address Space Layout Randomization) // SecurityLab.ru: сайт. URL: http://www.securitylab.ru/news/tags/ASLR+(Address+Space+Layout+Randomization) (дата обращения: 30.03.2017)
  2. Valasek Ch., Mandt T. Windows 8 Heap Internals. 2012.
  3. Marco-Gisbert, Hector, and Ismael Ripoll. On the Ectiveness of Full-ASLR on 64-bit Linux. Систем. требования: Adobe Acrobat Reader DC. URL: http://cybersecurity.upv.es/attacks/offset2lib/offset2lib-paper.pdf (дата обращения: 22.04.2017)
  4. Shacham H., Page M., Pfaff B., Goh E.J., Modadugu N., Boneh D. On the Effectiveness of Address-Space Randomization. // Proceedings of the 11th ACM conference on Computer and communications security 2004. С. 298—307
  5. ASLR в новейших выпусках Windows // Хабрахабр: сайт. URL: https://habrahabr.ru/company/eset/blog/206244 (дата обращения: 30.03.2017)
  6. Дерандомизация ASLR на любых современных процессорах средствами JavaScript // Хабрахабр: сайт. URL: https://habrahabr.ru/post/322020 (дата обращения: 30.03.2017)
  7. Блеск и нищета BlackBerry Priv // Хакер: электрон. журнал. URL: https://xakep.ru/2016/02/26/rise-and-shine-blackberry-priv (дата обращения: 30.03.2017)
  8. В процессорах Intel обнаружена ошибка, позволяющая обходить защиту ASLR // Хабрахабр: сайт. URL: https://habrahabr.ru/company/pt/blog/313856 (дата обращения: 30.03.2017)

Ссылки/Литература