Рандомизация разметки адресного пространства - Address space layout randomization

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

История

Linux PaX проект впервые ввел термин "ASLR", и опубликовал первый дизайн и реализация ASLR в июле 2001 г. пластырь для Ядро Linux. Он рассматривается как полная реализация, предоставляющая также исправление для рандомизации стека ядра с октября 2002 года.[1]

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

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

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

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

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

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

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

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

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

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

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

Во многих системах может быть в тысячах или миллионах; на современном 64-битный системы, эти числа обычно достигают как минимум миллионов, Гектор Марко-Гисберт и Исмаэль Риполл показали в 2014 году, как обойти ASLR в 64-битных системах менее чем за одну секунду при определенных обстоятельствах.[4] Шахам и его коллеги заявляют, что для 32-битных систем на скоростях компьютеров 2004 года, которые имеют 16 бит для рандомизации адресов, "... 16 бит рандомизации адресов могут быть побеждены атака грубой силой в течение нескольких минут."[5] Утверждение авторов зависит от возможности атаковать одно и то же приложение несколько раз без задержки. Правильные реализации ASLR, такие как включенный в grsecurity, предоставляют несколько методов, чтобы сделать такие атаки грубой силы невозможными. Один из методов включает в себя предотвращение выполнения исполняемого файла в течение настраиваемого количества времени, если он аварийно завершил работу определенное количество раз.

Android,[6][неосновной источник необходим ] и, возможно, другие системы,[который? ] воплощать в жизнь Рандомизация порядка загрузки библиотеки, форма ASLR, которая рандомизирует порядок, в котором загружаются библиотеки. Это дает очень мало энтропии. Примерное количество бит энтропии, предоставленное для необходимой библиотеки, показано ниже; это еще не учитывает различные размеры библиотек, поэтому фактическая полученная энтропия действительно несколько выше. Обратите внимание, что злоумышленникам обычно нужна только одна библиотека; математика более сложна с несколькими библиотеками, и она также показана ниже. Обратите внимание, что случай, когда злоумышленник использует только одну библиотеку, является упрощением более сложной формулы для .

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

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

Снижение энтропии

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

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

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

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

Ограничения

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

Реализации

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

Android

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

DragonFly BSD

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

FreeBSD

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

iOS (iPhone, iPod touch, iPad)

яблоко представил ASLR в iOS 4.3 (выпущен в марте 2011 г.).[13]

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

Linux

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

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

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

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

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

Есть несколько атаки по побочным каналам в процессорах x86, которые могут вызвать утечку адресов ядра.[21][22] В конце 2017 г. изоляция таблицы страниц ядра (KPTI aka KAISER) был разработан для отражения этих атак.[23][24] Однако этот метод не может защитить от атак по побочным каналам, использующих коллизии в предсказатель ветвления конструкции.[25]

Майкрософт Виндоус

Microsoft Виндоус виста (выпущено в январе 2007 г.) и позже включили ASLR только для исполняемых файлов и библиотеки динамической компоновки которые специально связаны с поддержкой ASLR.[26] Для совместимости он по умолчанию не включен для других приложений. Как правило, несовместимо только старое программное обеспечение, и ASLR можно полностью включить, отредактировав запись реестра «HKLM SYSTEM CurrentControlSet Control Session Manager Memory Management MoveImages»,[27] или установив Microsoft Расширенный набор инструментов для смягчения последствий.

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

На основе хоста системы предотвращения вторжений Такие как WehnTrust[29] и Озон[30] также предлагаем ASLR для Windows XP и Windows Server 2003 операционные системы. WehnTrust имеет открытый исходный код.[31] Полная информация о реализации Озона недоступна.[32]

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

NetBSD

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

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

OpenBSD

В 2003 г. OpenBSD стала первой основной операционной системой, которая поддерживает сильную форму ASLR и активирует ее по умолчанию.[2]OpenBSD завершила поддержку ASLR в 2008 году, когда добавила поддержку для ПИРОГ двоичные файлы.[37] OpenBSD 4.4's маллок (3) был разработан для повышения безопасности за счет использования преимуществ ASLR и функций страницы пропусков, реализованных как часть OpenBSD mmap системный вызов и для обнаружения ошибок использования после освобождения.[38] Выпущенная в 2013 году, OpenBSD 5.3 была первой основной операционной системой, которая позволила Независимые от позиции исполняемые файлы по умолчанию на нескольких аппаратные платформы, а OpenBSD 5.7 по умолчанию активировал не зависящие от положения статические двоичные файлы (Static-PIE).[37]

macOS

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

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

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

Солярис

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

Эксплуатации

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

Смотрите также

Рекомендации

  1. ^ Брэд Спенглер (октябрь 2003 г.). «PaX: гарантированный конец выполнения произвольного кода» (PDF). grsecurity.net. Слайды с 22 по 35. Получено 2015-08-20.
  2. ^ а б Тео Де Раадт (2005). «Методы защиты от эксплойтов (обновленные для включения случайных malloc и mmap) на OpenCON 2005». Получено 2009-08-26.
  3. ^ «Инновации OpenBSD». Проект OpenBSD. Получено 2016-09-12.
  4. ^ Марко-Гисберт, Гектор; Риполл, Исмаэль (20 ноября 2014 г.). «Об эффективности Full-ASLR в 64-битном Linux» (PDF).
  5. ^ Shacham, H .; Пейдж, М .; Pfaff, B .; Goh, E.J .; Modadugu, N .; Бонех, Д. (2004). Об эффективности рандомизации адресного пространства. 11-я конференция ACM по компьютерной и коммуникационной безопасности. С. 298–307.
  6. ^ а б «Реализовать рандомизацию порядка загрузки библиотеки». Получено 2017-06-26.
  7. ^ а б Транзисторная память, такая как размеры RAM, ROM, флэш-памяти и кеша, а также размеры файлов, указываются с помощью бинарные значения для K (10241), М (10242), G (10243), ...
  8. ^ «Безопасность Android». Разработчики Android. Получено 2012-07-07.
  9. ^ "осс-безопасность". Получено 2015-10-04.
  10. ^ «Вернуть» Повторное включение поддержки для исполняемых файлов, отличных от PIE"". Получено 2017-06-26.
  11. ^ mmap - добавить рандомизацию смещения mmap, DragonFly Gitweb, 25 ноября 2010 г.
  12. ^ «Внедрить рандомизацию разметки адресного пространства (ASLR)». Получено 2019-02-10.
  13. ^ Pwn2Own, день 2: iPhone, BlackBerry побеждены; Chrome, Firefox незаезды, Ars Technica, 11 марта 2011 г.
  14. ^ Стефан Эссер (2013-03-07). «Эксплуатация iOS 6 280 дней спустя». Слайд 19: «iOS 6 представляет KASLR».
  15. ^ Tarjei Mandt. "Атака на ядро ​​iOS: взгляд на 'evasi0n''" (PDF).
  16. ^ Бит NX и ASLR, Оборудование Тома, 25 марта 2009 г.
  17. ^ «личность - установить область выполнения процесса».
  18. ^ Джейк Эдж (09.10.2013). «Рандомизация компоновки адресного пространства ядра». LWN.net. Получено 2014-04-02.
  19. ^ «Ядро Linux 3.14, раздел 1.7. Рандомизация адресного пространства ядра». kernelnewbies.org. 2014-03-30. Получено 2014-04-02.
  20. ^ "kernel / git / torvalds / linux.git: x86, kaslr: вернуть местоположение из decopress_kernel (дерево исходных текстов ядра Linux)". kernel.org. 2013-10-13. Получено 2014-04-02.
  21. ^ KASLR мертв: да здравствует KASLR (PDF). Разработка безопасного программного обеспечения и систем 2017. 24 июня 2017 г.
  22. ^ Чан, Ёнджин; Ли, Санго; Ким, Тэсу (2016). «Нарушение рандомизации адресного пространства ядра с помощью Intel TSX» (PDF). Конференция ACM SIGSAC по компьютерной и коммуникационной безопасности, 2016 г.. CCS '16. Нью-Йорк, Нью-Йорк, США: ACM: 380–392. Дои:10.1145/2976749.2978321. ISBN  9781450341394.
  23. ^ Корбет, Джонатан (20 декабря 2017 г.). «Текущее состояние изоляции таблицы страниц ядра». LWN.net.
  24. ^ Корбет, Джонатан (15.11.2017). «KAISER: сокрытие ядра от пользовательского пространства». LWN.net.
  25. ^ а б Евтюшкин Дмитрий; Пономарев Дмитрий; Абу-Газале, Наэль (2016). «Перейти через ASLR: атаковать предикторы ветвления для обхода ASLR» (PDF). 2016 49-й ежегодный международный симпозиум IEEE / ACM по микроархитектуре (MICRO). С. 1–13. Дои:10.1109 / MICRO.2016.7783743. ISBN  978-1-5090-3508-3.
  26. ^ «Средства защиты программного обеспечения Windows ISV». Msdn.microsoft.com. Получено 2012-04-10.
  27. ^ Внутреннее устройство Windows: включая Windows Server 2008 и Windows Vista, Fifth Edition (PRO-Developer) ISBN  978-0-7356-2530-3
  28. ^ Олли Уайтхаус (февраль 2007 г.). «Анализ рандомизации адресного пространства в Windows Vista» (PDF). Архивировано из оригинал (PDF) на 2019-07-15. Получено 2009-01-18.
  29. ^ «ВенТраст». Codeplex.com. Получено 2012-04-10.
  30. ^ «Озон архитекторов безопасности». Архитекторы безопасности. Получено 2012-04-10.
  31. ^ "Исходный код WehnTrust". Получено 2013-11-15.
  32. ^ «Рандомизация адресного пространства для систем Windows» (PDF). Получено 2012-04-10.
  33. ^ Олли (2012-03-02). «Исследование, разработка, оценка, консультирование и обучение | Recx: частичный метод против ASLR - множественные O / S». Recxltd.blogspot.co.uk. Получено 2012-04-10.
  34. ^ «Анонс NetBSD 5.0». Получено 2016-04-25.
  35. ^ Христос Зулас (2016). «Двоичные файлы PIE и ASLR включены в сборке по умолчанию для amd64». Получено 2016-04-25.
  36. ^ "Ядро ASLR на amd64". 2017. Получено 2017-10-16.
  37. ^ а б Курт Миллер (2008). "Реализация независимого исполняемого файла OpenBSD (PIE)". В архиве из оригинала 2011-06-12. Получено 2011-07-22.
  38. ^ "libc / stdlib / malloc.c". Перекрестная ссылка BSD, OpenBSD src / lib /.
  39. ^ «Mac OS X - Безопасность - Защищает от вирусов и вредоносных программ». Яблоко. Архивировано из оригинал на 2011-05-25. Получено 2012-04-10.
  40. ^ "Безопасность". Apple Inc. Архивировано с оригинал на 2011-06-06. Получено 2011-06-06.
  41. ^ «Обзор основных технологий OS X Mountain Lion» (PDF). Июнь 2012 г.. Получено 2012-07-25.
  42. ^ Контроль доступа к машинным ресурсам, Oracle Information Library, 26 октября 2012 г.
  43. ^ AnC VUSec, 2017 г.

внешняя ссылка