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

редактировать

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

Содержание
  • 1 История
  • 2 Преимущества
    • 2.1 Эффективность
      • 2.1.1 Снижение энтропии
    • 2.2 Ограничения
  • 3 Реализации
    • 3.1 Android
    • 3.2 DragonFly BSD
    • 3.3 FreeBSD
    • 3.4 iOS (iPhone, iPod touch, iPad)
    • 3.5 Linux
      • 3.5.1 Рандомизация структуры адресного пространства ядра
    • 3.6 Microsoft Windows
    • 3.7 NetBSD
    • 3.8 OpenBSD
    • 3.9 macOS
    • 3.10 Solaris
  • 4 Эксплуатация
  • 5 См. Также
  • 6 Ссылки
  • 7 Внешние ссылки
История

Проект Linux PaX впервые ввел термин «ASLR» и опубликовал первый проект и реализация ASLR в июле 2001 г. как патч для ядра Linux. Это рассматривается как полная реализация, предоставляющая также исправление для рандомизации стека ядра с октября 2002 года.

Первой основной операционной системой, которая по умолчанию поддерживала ASLR, была OpenBSD версия 3.4 в 2003 г., за ним последовал Linux в 2005 г.

Преимущества

Рандомизация адресного пространства препятствует некоторым типам атак на систему безопасности, затрудняя злоумышленнику прогнозирование целевых адресов. Например, злоумышленники, пытающиеся выполнить атаку return-to-libc, должны найти код для выполнения, в то время как другие злоумышленники, пытающиеся выполнить шелл-код, введенный в стек, должны сначала найти стек.. В обоих случаях система скрывает соответствующие адреса памяти от злоумышленников. Эти значения необходимо угадывать, а ошибочное предположение обычно не удается исправить из-за сбоя приложения.

Эффективность

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

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

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

E s {\ displaystyle E_ {s}}E_ {s} (биты энтропии вершины стека)
E m {\ displaystyle E_ {m }}E_ {m} (биты энтропии mmap ()base)
E x {\ displaystyle E_ {x}}E_x (биты энтропии основной исполняемой базы)
E h {\ displaystyle E_ {h}}E_{h}(биты энтропии базы кучи)
A s {\ displaystyle A_ {s}}A_s (битов, атакованных за попытку энтропии стека)
A m {\ displaystyle A_ {m}}A_ {m} (атакованных битов на попытку mmap ()базовой энтропии)
A x {\ displaystyle A_ {x}}A_x (атакованных битов на попытку энтропии основного исполняемого файла)
A h {\ displaystyle A_ {h}}A_h (атакованных битов на попытку энтропии базы кучи)
α {\ displaystyle \ alpha}\ alpha (сделанные попытки)
N {\ displaystyle N}N (общее количество энтропии: N = (E s - A s) + (E m - A m) + (E x - A x) + (E h - A h) {\ displaystyle N = (E_ {s} -A_ {s}) + (E_ {m} -A_ {m}) + (E_ {x} -A_ {x}) + (E_ {h} -A_ {h}) \,}{\ displaystyle N = (E_ {s} -A_ {s}) + (E_ {m} -A_ {m}) + (E_ {x} -A_ {x}) + (E_ {h} -A_ {h}) \,} )

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

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

g (α) = 1 - (1-2 - N) α, если 0 ≤ α {\ displaystyle g \ left (\ alpha \, \ right) = 1 - {\ left (1- {2 ^ {- N}} \ right) ^ {\ alpha} \,} \, {\ text {if}} 0 \ leq \, \ alpha \,}{ \ Displaystyle г \ влево (\ альфа \, \ вправо) = 1 - {\ left (1- {2 ^ {- N}} \ right) ^ {\ alpha} \,} \, {\ text {if}} 0 \ leq \, \ alpha \,} (изолированное угадывание; адресное пространство повторно рандомизируется после каждая попытка)
b (α) = α 2 N, если 0 ≤ α ≤ 2 N {\ displaystyle b \ left (\ alpha \, \ right) = {\ frac {\ alpha \,} {2 ^ {N }}} \, {\ text {if}} 0 \ leq \, \ alpha \, \ leq \, {2 ^ {N}}}{\ displaystyle b \ left (\ alpha \, \ right) = {\ frac {\ alpha \,} {2 ^ {N}}} \, {\ text {if}} 0 \ leq \, \ alpha \, \ leq \, {2 ^ {N}}} (систематический брутфорс на копиях программы с то же адресное пространство)

Во многих системах 2 N {\ displaystyle 2 ^ {N}}2 ^ N может быть в тысячах или миллионах; в современных 64-битных системах эти цифры обычно достигают как минимум миллионов, Гектор Марко-Гисберт и Исмаэль Риполл показали в 2014 году, как при определенных обстоятельствах обойти ASLR в 64-битных системах менее чем за одну секунду.. Для 32-битных систем на скоростях компьютеров 2004 года, которые имеют 16 бит для рандомизации адресов, Шахам и его сотрудники заявляют: «... 16 бит рандомизации адреса могут быть уничтожены атакой грубой силой в течение нескольких минут». Утверждение авторов зависит от способности атаковать одно и то же приложение несколько раз без задержки. Правильные реализации ASLR, такие как включенный в grsecurity, предоставляют несколько методов, чтобы сделать такие атаки грубой силы невозможными. Один из методов включает в себя предотвращение выполнения исполняемого файла в течение настраиваемого количества времени, если он аварийно завершил работу определенное количество раз.

Android и, возможно, другие системы реализуют рандомизацию порядка загрузки библиотек, форму ASLR, которая рандомизирует порядок, в котором загружаются библиотеки. Это дает очень мало энтропии. Примерное количество бит энтропии, предоставленное для необходимой библиотеки, показано ниже; это еще не учитывает различные размеры библиотек, поэтому фактическая полученная энтропия действительно несколько выше. Обратите внимание, что злоумышленникам обычно нужна только одна библиотека; математика более сложна с несколькими библиотеками, что также показано ниже. Обратите внимание, что случай, когда злоумышленник использует только одну библиотеку, является упрощением более сложной формулы для l = 1 {\ displaystyle l = 1}l = 1 .

l (количество загруженных библиотек)
β (количество библиотек, используемых злоумышленником)
E m = {log 2 ⁡ (l), если β = 1, l ≥ 1 ∑ i = ll - (β - 1) log 2 ⁡ (i), если β ≥ 1 l ≥ 1 {\ displaystyle E_ {m} = {\ begin {cases} \ log _ {2} \ left (l \ right) {\ text {if}} \ beta \, = 1, l \ geq \, 1 \\\ сумма _ {i = l} ^ {l- \ left (\ beta \, - 1 \ right)} \ log _ {2} \ left (i \ right) {\ text {if}} \ beta \, \ geq \, 1, l \ geq \, 1 \ end {cases}}}{\ displaystyle E_ {m} = {\ begin { case} \ log _ {2} \ left (l \ right) {\ text {if}} \ beta \, = 1, l \ geq \, 1 \\\ sum _ {i = l} ^ {l- \ left (\ beta \, - 1 \ right)} \ log _ {2} \ left (i \ right) {\ text {if}} \ beta \, \ geq \, 1, l \ geq \, 1 \ end {case}}}

Эти значения имеют тенденцию быть низкими даже для больших значений l, что наиболее важно, поскольку злоумышленники обычно могут использовать только Стандартная библиотека C, поэтому часто можно предположить, что β = 1 {\ displaystyle \ beta \, = 1}\ beta \, = 1 . Однако даже для небольшого количества библиотек здесь достигается несколько бит энтропии; Таким образом, потенциально интересно объединить рандомизацию порядка загрузки библиотеки с рандомизацией адресов VMA, чтобы получить несколько дополнительных бит энтропии. Обратите внимание, что эти дополнительные биты энтропии не будут применяться к другим сегментам mmap (), только к библиотекам.

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

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

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

Также можно уменьшить энтропию в стеке или куче. Стек обычно должен быть выровнен по 16 байтам, так что это минимально возможный интервал рандомизации; в то время как куча должна быть выровнена по страницам, обычно 4096 байт. При попытке атаки можно согласовать повторяющиеся атаки с этими интервалами; можно использовать слайд NOP, а строку '/ bin / shможно заменить на' //////// bin / sh'на произвольное количество косых черт при попытке вернуться в систему. Количество удаленных битов равно log 2 (n) {\ displaystyle \ log _ {2} \! \ Left (n \ right)}\ log _ {2} \! \ left (n \ right) для n интервалов атаки.

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

Ограничения

Адреса с защитой ASLR могут утечка по различным побочным каналам, удаляя утилиту смягчения. В недавних атаках использовалась информация, просочившаяся из буфера предиктора целевого перехода ЦП (BTB) или таблиц проходящих страниц блока управления памятью (MMU). Неясно, можно ли смягчить этот класс атаки ASLR. Если они не могут, преимущество ASLR уменьшается или отменяется.

Реализации

Несколько основных операционных систем общего назначения реализуют ASLR.

Android

Android 4.0 Ice Cream Sandwich обеспечивает рандомизацию разметки адресного пространства (ASLR), чтобы помочь защитить системные и сторонние приложения от эксплойтов из-за проблем с управлением памятью. Поддержка исполняемых файлов, не зависящих от позиции, была добавлена ​​в Android 4.1. Android 5.0 отказался от поддержки без PIE и требует, чтобы все динамически связанные двоичные файлы были независимыми от позиции. Рандомизация порядка загрузки библиотеки была принята в проект с открытым исходным кодом Android 26 октября 2015 года и включена в выпуск Android 7.0.

DragonFly BSD

DragonFly BSD имеет реализацию ASLR на основе модели OpenBSD, добавленной в 2010 году. По умолчанию она отключена, и ее можно включить, установив sysctl vm.randomize_mmap на 1.

FreeBSD

Поддержка ASLR появится в FreeBSD 13.0 (в настоящее время в разработке). По умолчанию он отключен.

iOS (iPhone, iPod touch, iPad)

Apple представила ASLR в iOS 4.3 (выпущено в марте 2011 г.).

KASLR был представлен в iOS 6. Рандомизированная база ядра: 0x01000000 + ((1 + 0xRR) * 0x00200000), где 0xRR - это случайный байт из SHA1 (случайные данные), сгенерированный iBoot (загрузчик iOS 2-го уровня).

Linux

Ядро Linux по умолчанию включало слабую форму ASLR, начиная с версии ядра 2.6.12, выпущенной в июне 2005 г. Наборы исправлений PaX и Exec Shield для Ядро Linux предоставляет более полные реализации. Патч Exec Shield для Linux предоставляет 19 бит энтропии стека на периоде 16 байтов и 8 битов рандомизации базы mmap на периоде 1 страницы размером 4096 байт. При этом основание стека размещается в области шириной 8 МБ, содержащей 524 288 возможных позиций, а база mmap - в области шириной 1 МБ, содержащей 256 возможных позиций.

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

Рандомизацию можно отключить для конкретного процесса, изменив его домен выполнения, используя личность (2).

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

Рандомизация структуры адресного пространства ядра (KASLR ) включает рандомизацию адресного пространства для образа ядра Linux путем рандомизации места размещения кода ядра во время загрузки. KASLR был объединен с основной веткой ядра Linux в версии ядра 3.14, выпущенной 30 марта 2014 года. После компиляции его можно отключить во время загрузки, указав nokaslr в качестве одного из параметров загрузки ядра.

Существует несколько атак по побочному каналу в процессорах x86, которые могут привести к утечке адресов ядра. В конце 2017 года для предотвращения этих атак была разработана изоляция таблиц страниц ядра (KPTI aka KAISER). Однако этот метод не может защитить от атак по побочным каналам с использованием коллизий в структурах предиктора ветвления.

Microsoft Windows

Microsoft Windows Vista (выпущено в январе 2007) и более поздних версиях ASLR включен только для исполняемых файлов и библиотек динамической компоновки, которые специально связаны для включения ASLR. Для совместимости он по умолчанию не включен для других приложений. Обычно несовместимо только старое программное обеспечение, и ASLR можно полностью включить, отредактировав запись реестра «HKLM \ SYSTEM \ CurrentControlSet \ Control \ Session Manager \ Memory Management \ MoveImages» или установив Microsoft Enhanced Mitigation Experience Toolkit.

Расположение кучи, стека, блока среды процесса и блока среды потока также рандомизируется. В техническом документе по безопасности от Symantec отмечалось, что ASLR в 32-битной Windows Vista может быть не столь надежным, как ожидалось, и Microsoft признала слабость в его реализации.

Хост-системы системы предотвращения вторжений такие как WehnTrust и Ozone также предлагают ASLR для операционных систем Windows XP и Windows Server 2003. WehnTrust имеет открытый исходный код. Полная информация о реализации Ozone недоступна.

В феврале 2012 года было отмечено, что ASLR в 32-битных системах Windows до Windows 8 может снизить эффективность в ситуациях с нехваткой памяти. Аналогичный эффект был достигнут и в Linux в том же исследовании. Тестовый код вызвал в системе Mac OS X 10.7.3 панику ядра, поэтому осталось неясным, как работает ASLR в этом сценарии.

NetBSD

Поддержка ASLR в пользовательской среде появилась в NetBSD 5.0 (выпущена в апреле 2009 г.) и была включена по умолчанию в текущей версии NetBSD в апреле 2016 г.

Поддержка ASLR ядра на amd64 была добавлена ​​в NetBSD-current в октябре 2017 года, что сделало NetBSD первой системой BSD, поддерживающей KASLR.

OpenBSD

В 2003 году OpenBSD стала первой основной операционной системой, которая поддерживает сильную форму ASLR и активирует ее по умолчанию. OpenBSD завершила поддержку ASLR в 2008 году, добавив поддержку двоичных файлов PIE. malloc (3) OpenBSD 4.4 был разработан для повышения безопасности за счет использования преимуществ ASLR и функций страницы пробелов, реализованных как часть системного вызова OpenBSD mmap и для обнаружения ошибок использования после освобождения. Выпущенная в 2013 году, OpenBSD 5.3 была первой основной операционной системой, которая включила независимые от позиции исполняемые файлы по умолчанию на нескольких аппаратных платформах, а OpenBSD 5.7 активировала независимые от позиции статические двоичные файлы (Static-PIE) по умолчанию.

macOS

В Mac OS X Leopard 10.5 (выпущена в октябре 2007 г.) Apple ввела рандомизацию для системных библиотек.

В Mac OS X Lion 10.7 (выпущен в июле 2011 г.) Apple расширила их реализацию, чтобы охватить все приложения, заявив, что «рандомизация разметки адресного пространства (ASLR) была улучшена для всех приложений. Теперь она доступна для 32-разрядных приложений. (как и защита кучи памяти), что делает 64-битные и 32-битные приложения более устойчивыми к атакам. "

Начиная с OS X Mountain Lion 10.8 (выпущено в июле 2012 г.) и позже, вся система, включая ядро, а также kexts и зоны случайным образом перемещаются во время загрузки системы.

Solaris

ASLR был представлен в Solaris, начиная с Solaris 11.1 (выпущен в октябре 2012 г.). ASLR в Solaris 11.1 может быть установлен в масштабе всей системы, для каждой зоны или для каждого двоичного кода.

Использование

A атаки по побочному каналу с использованием целевого буфера перехода было продемонстрировал обход защиты ASLR. В 2017 году была продемонстрирована атака под названием «ASLR⊕Cache», которая могла победить ASLR в веб-браузере с помощью JavaScript.

См. Также
Ссылки
Внешние ссылки
Последняя правка сделана 2021-06-10 00:18:26
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте