Рандомизация структуры адресного пространства ( ASLR ) — это метод компьютерной безопасности , используемый для предотвращения использования уязвимостей , связанных с повреждением памяти . [1] Чтобы злоумышленник не смог надежно перейти, например, к определенной эксплуатируемой функции в памяти, ASLR случайным образом распределяет позиции в адресном пространстве ключевых областей данных процесса , включая базу исполняемого файла и позиции стек , куча и библиотеки .
Проект Linux PaX впервые ввел термин «ASLR» и опубликовал первый проект и реализацию ASLR в июле 2001 года как патч для ядра Linux. Это рассматривается как полная реализация, включающая также патч для рандомизации стека ядра с октября 2002 года. [2]
Первой основной операционной системой, поддерживающей ASLR по умолчанию, была OpenBSD версии 3.4 в 2003 году, [3] [4], за которой в 2005 году последовала Linux.
Рандомизация адресного пространства препятствует некоторым типам атак на безопасность, усложняя злоумышленнику предсказание целевых адресов. Например, злоумышленники, пытающиеся выполнить атаку с возвратом в библиотеку, должны найти код, который будет выполнен, в то время как другие злоумышленники, пытающиеся выполнить шелл-код, внедренный в стек, должны сначала найти стек. В обоих случаях система скрывает от злоумышленников соответствующие адреса памяти. Эти значения необходимо угадать, а ошибочное предположение обычно невозможно исправить из-за сбоя приложения.
Рандомизация макета адресного пространства основана на низкой вероятности того, что злоумышленник угадает расположение случайно расположенных областей. Безопасность повышается за счет увеличения пространства поиска. Таким образом, рандомизация адресного пространства более эффективна, когда в случайных смещениях присутствует большая энтропия . Энтропия увеличивается либо за счет увеличения объема области виртуальной памяти , в которой происходит рандомизация, либо за счет уменьшения периода, в течение которого происходит рандомизация. Период обычно реализуется как можно меньшим, поэтому большинство систем должны увеличить рандомизацию пространства VMA.
Чтобы обойти рандомизацию, злоумышленники должны успешно угадать позиции всех областей, которые они хотят атаковать. Для таких областей данных, как стек и куча, куда можно загрузить собственный код или полезные данные, можно атаковать более одного состояния с помощью слайдов NOP для кода или повторяющихся копий данных. Это позволяет атаке добиться успеха, если область рандомизирована по одному из нескольких значений. Напротив, такие области кода, как база библиотеки и основной исполняемый файл, должны быть точно обнаружены. Часто эти области смешиваются, например, в стек вставляются кадры стека , а в него возвращается библиотека.
Могут быть объявлены следующие переменные:
mmap()
базы)mmap()
базовой энтропии)Чтобы вычислить вероятность успеха злоумышленника, необходимо принять количество попыток α , выполненных без прерывания сигнатурной IPS, правоохранительными органами или другим фактором; в случае брутфорса демон не может быть перезапущен. Также необходимо рассчитать количество соответствующих битов и количество атакуемых в каждой попытке, оставив столько битов, которые атакующий должен уничтожить.
Следующие формулы представляют вероятность успеха для данного набора α -попыток на N битах энтропии.
Во многих системах их число может исчисляться тысячами или миллионами; в современных 64-битных системах эти числа обычно достигают как минимум миллионов, Гектор Марко-Гисберт и Исмаэль Риполл показали в 2014 году, как обойти ASLR в 64-битных системах менее чем за одну секунду при определенных обстоятельствах. [5] Для 32-битных систем на компьютерных скоростях 2004 года, которые имеют 16 бит для рандомизации адресов, Шачам и его коллеги утверждают, что «... 16 бит рандомизации адресов можно преодолеть с помощью грубой атаки за считанные минуты». [6] Утверждение авторов зависит от возможности атаковать одно и то же приложение несколько раз без каких-либо задержек. Правильные реализации ASLR, например, включенные в grsecurity, предоставляют несколько способов сделать такие атаки методом перебора невозможными. Один из методов предполагает предотвращение выполнения исполняемого файла в течение настраиваемого периода времени, если он произошел сбой определенное количество раз.[update]
Android, [7] [ необходим неосновной источник ] и, возможно, другие системы, [ какие? ] реализовать рандомизацию порядка загрузки библиотек — форму ASLR, которая рандомизирует порядок загрузки библиотек. Это обеспечивает очень небольшую энтропию. Ниже приведено приблизительное количество бит энтропии, предоставленной для каждой необходимой библиотеки; это еще не учитывает различные размеры библиотек, поэтому фактическая полученная энтропия действительно несколько выше. Злоумышленникам обычно нужна только одна библиотека; математика более сложна с несколькими библиотеками и также показана ниже. Случай, когда злоумышленник использует только одну библиотеку, представляет собой упрощение более сложной формулы для .
Эти значения имеют тенденцию быть низкими даже для больших значений l , что наиболее важно, поскольку злоумышленники обычно могут использовать только стандартную библиотеку C , и поэтому часто можно предположить, что . Однако даже для небольшого количества библиотек здесь можно получить некоторый выигрыш в энтропии; Таким образом, потенциально интересно объединить рандомизацию порядка загрузки библиотеки со рандомизацией адресов VMA, чтобы получить несколько дополнительных бит энтропии. Эти дополнительные биты энтропии не будут применяться к другим сегментам mmap(), а только к библиотекам.
Злоумышленники могут использовать несколько методов для уменьшения энтропии, присутствующей в рандомизированном адресном пространстве, начиная от простых утечек информации и заканчивая атакой на несколько битов энтропии за атаку (например, путем распыления кучи ). С этим мало что можно сделать.
Возможна утечка информации о структуре памяти с использованием уязвимостей форматной строки . Функции форматирования строк, такие как printf, для выполнения своей работы используют список переменных аргументов ; спецификаторы формата описывают, как выглядит список аргументов. Из-за того, как обычно передаются аргументы, каждый спецификатор формата перемещается ближе к вершине кадра стека. В конце концов, указатель возврата и указатель кадра стека могут быть извлечены, обнаруживая адрес уязвимой библиотеки и адрес известного кадра стека; это может исключить рандомизацию библиотеки и стека как препятствие для злоумышленника.
Также можно уменьшить энтропию в стеке или куче. Стек обычно должен быть выровнен по 16 байтам, поэтому это наименьший возможный интервал рандомизации; в то время как куча должна быть выровнена по страницам, обычно 4096 байт. При попытке атаки можно согласовать повторяющиеся атаки с этими интервалами; слайд NOP может использоваться с внедрением шелл-кода, а строка ' /bin/sh
' может быть заменена на ' ////////bin/sh
' для произвольного количества косых черт при попытке вернуться в систему . Количество удаленных битов соответствует ровно n атакуемым интервалам.
Такое уменьшение ограничено объемом данных в стеке или куче. Например, стек обычно ограничен8 МБ [8] и становится намного меньше; это позволяет максимум19 бит , хотя более консервативная оценка будет около 8–10 бит соответствуют 4–16 КБ [8] начинки стека. С другой стороны, куча ограничена поведением распределителя памяти; в случае с glibc выделения размером более 128 КБ создаются с использованием mmap , что ограничивает злоумышленников сокращением до 5 бит. Это также является ограничивающим фактором при брутфорсе; хотя количество атак можно сократить, размер атак увеличивается настолько, что в некоторых обстоятельствах поведение может стать очевидным для систем обнаружения вторжений .
Адреса, защищенные ASLR, могут просочиться по различным боковым каналам, что приведет к удалению утилиты предотвращения. В недавних атаках использовалась информация, утекшая из буфера прогнозирования целевых объектов ветки ЦП (BTB) или блоков управления памятью (MMU) в таблицах проходящих страниц. Неясно, можно ли смягчить этот класс атак ASLR. Если они не могут этого сделать, преимущества ASLR уменьшаются или исключаются.
Несколько основных операционных систем общего назначения реализуют ASLR.
Android 4.0 Ice Cream Sandwich обеспечивает рандомизацию расположения адресного пространства (ASLR), чтобы помочь защитить систему и сторонние приложения от эксплойтов, связанных с проблемами управления памятью. Поддержка исполняемых файлов, не зависящих от позиции, была добавлена в Android 4.1. [9] В Android 5.0 прекращена поддержка отличных от PIE и требуется, чтобы все динамически связанные двоичные файлы были независимыми от позиции. [10] [11] Рандомизация порядка загрузки библиотеки была принята в проект Android с открытым исходным кодом 26 октября 2015 года, [7] [ необходим неосновной источник ] и включена в версию Android 7.0.
DragonFly BSD имеет реализацию ASLR, основанную на модели OpenBSD, добавленной в 2010 году. [12] По умолчанию она отключена, и ее можно включить, установив для sysctl vm.randomize_mmap значение 1.
Поддержка ASLR появилась во FreeBSD 13.0. [13] [14] Он включен по умолчанию, начиная с версии 13.2. [15]
Apple представила ASLR в iOS 4.3 (выпущенной в марте 2011 г.). [16]
KASLR был представлен в iOS 6. [17] Рандомизированная база ядра — это 0x01000000 + ((1+0xRR) * 0x00200000)
случайный 0xRR
байт из SHA1 (случайные данные), сгенерированный iBoot (загрузчиком iOS 2-го этапа). [18]
Ядро Linux по умолчанию включает слабую форму ASLR, начиная с версии ядра 2.6.12, выпущенной в июне 2005 года. [19] Наборы исправлений PaX и Exec Shield для ядра Linux обеспечивают более полную реализацию. Патч Exec Shield для Linux обеспечивает 19 бит энтропии стека за период 16 байт и 8 бит базовой рандомизации mmap за период 1 страницы размером 4096 байт. Это помещает базу стека в область шириной 8 МБ, содержащую 524 288 возможных позиций, а базу mmap в область шириной 1 МБ, содержащую 256 возможных позиций.
Позиционно-независимый исполняемый файл (PIE) реализует случайный базовый адрес для основного двоичного файла и существует с 18 апреля 2004 года. Он обеспечивает ту же случайность адреса для основного исполняемого файла, что и для общих библиотек. Функцию PIE нельзя использовать вместе с функцией предварительной ссылки для одного и того же исполняемого файла. Инструмент предварительной компоновки реализует рандомизацию во время предварительной компоновки, а не во время выполнения, поскольку по своей конструкции prelink предназначен для обработки перемещения библиотек до того, как это сделает динамический компоновщик, что позволяет перемещению происходить один раз для многих запусков программы. В результате реальная рандомизация адресного пространства противоречит цели предварительного связывания.
Рандомизацию можно отключить для конкретного процесса, изменив его область выполнения, используя personality(2)
. [20]
Ядро Linux 5.18, выпущенное в мае 2022 года, снизило эффективность как 32-битных, так и 64-битных реализаций из-за выравнивания памяти, в результате чего в некоторых дистрибутивах libc было исправлено для 32-битных приложений, а 9-битный ASLR libc для 64-битных приложений был потерян. . [21]
8 января 2024 года Джастин Миллер опубликовал уязвимость: [22]
Итак, подведем итог: основные файловые системы вызывают thp_get_unmapped_area, этот патч делает его настолько регулярным, что проходящие сопоставления с поддержкой файлов
thp_get_unmapped_area
могут поддерживаться огромными страницами, а некоторые библиотеки libc (недавно) превысили 2 МБ. Все это совпало так, что в некоторых дистрибутивах libc исправлено для 32-битных приложений, а 9-битный ASLR libc для 64-битных приложений был потерян (опять же, влияние будет различаться в зависимости от дистрибутива). Я подчеркиваю libc только потому, что он используется очень многими приложениями и имеет все необходимые ROP-гаджеты, но просто чтобы внести ясность: это не только libc, потенциально затронута любая библиотека> = 2 МБ, и даже анонимные сопоставления> = 2 МБ. в моей системе Ubuntu 22.04 выравниваются по 2 МБ, хотя я до сих пор не понимаю, о чем идет речь…
Рандомизация макета адресного пространства ядра (KASLR) позволяет рандомизировать адресное пространство для образа ядра Linux путем рандомизации места размещения кода ядра во время загрузки. [23] KASLR был объединен с основной веткой ядра Linux в версии ядра 3.14, выпущенной 30 марта 2014 года. [24] При компиляции его можно отключить во время загрузки, указав nokaslr в качестве одного из параметров загрузки ядра. [25]
В процессорах x86 существует несколько атак по побочным каналам , которые могут привести к утечке адресов ядра. [26] [27] В конце 2017 года для защиты от этих атак была разработана изоляция таблиц страниц ядра (KPTI, также известная как KAISER). [28] [29] Однако этот метод не может защитить от атак по побочным каналам, использующих коллизии в структурах прогнозирования ветвей . [30]
С 2021 года [update]более детальная рандомизация макета адресного пространства ядра (или гранулярная функция KASLR, FGKASLR) является запланированным расширением KASLR для рандомизации до функционального уровня. [31]
В Windows Vista от Microsoft (выпущенной в январе 2007 г.) и более поздних версиях ASLR включена только для исполняемых файлов и динамически подключаемых библиотек , которые специально связаны с поддержкой ASLR. [32] В целях совместимости по умолчанию для других приложений эта функция не включена. Обычно несовместимо только старое программное обеспечение, и ASLR можно полностью включить, отредактировав запись реестра HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management\MoveImages
[ 33] или установив Microsoft Enhanced Mitigation Experience Toolkit .
Расположение кучи , стека , блока среды процесса и блока среды потока также рандомизировано. В техническом документе по безопасности от Symantec отмечается, что ASLR в 32-битной Windows Vista может быть не столь надежным, как ожидалось, и Microsoft признала слабость его реализации. [34]
Системы предотвращения вторжений на базе хоста, такие как WehnTrust [35] и Ozone [36], также предлагают ASLR для операционных систем Windows XP и Windows Server 2003 . WehnTrust имеет открытый исходный код. [37] Полная информация о реализации Озона недоступна. [38]
В феврале 2012 года [39] было отмечено , что эффективность ASLR в 32-битных системах Windows до Windows 8 может снижаться в ситуациях с нехваткой памяти. В том же исследовании аналогичный эффект был достигнут и на Linux. Тестовый код вызвал панику ядра в системе Mac OS X 10.7.3 , поэтому оставалось неясным поведение ASLR в этом сценарии.
Поддержка ASLR в пользовательском пространстве появилась в NetBSD 5.0 (выпущенной в апреле 2009 г.) [40] и была включена по умолчанию в NetBSD-current в апреле 2016 г. [41]
Поддержка Kernel ASLR на amd64 была добавлена в NetBSD-current в октябре 2017 года, что сделало NetBSD первой системой BSD, поддерживающей KASLR. [42]
В 2003 году OpenBSD стала первой основной операционной системой, поддерживающей надежную форму ASLR и активирующей ее по умолчанию. [3]
OpenBSD завершила поддержку ASLR в 2008 году, когда добавила поддержку двоичных файлов PIE . [43] Функция malloc(3) OpenBSD 4.4 была разработана для повышения безопасности за счет использования преимуществ ASLR и функций пробельных страниц, реализованных как часть mmap
системного вызова OpenBSD , а также для обнаружения ошибок использования после освобождения. [44] Выпущенная в 2013 году, OpenBSD 5.3 стала первой основной операционной системой, которая по умолчанию включала независимые от позиции исполняемые файлы на нескольких аппаратных платформах , а OpenBSD 5.7 по умолчанию активировала независимые от позиции статические двоичные файлы (Static-PIE). [43]
В Mac OS X Leopard 10.5 (выпущенной в октябре 2007 г.) Apple представила рандомизацию для системных библиотек. [45]
В Mac OS X Lion 10.7 (выпущенной в июле 2011 г.) Apple расширила свою реализацию, чтобы охватить все приложения, заявив, что «рандомизация макета адресного пространства (ASLR) была улучшена для всех приложений. Теперь она доступна для 32-битных приложений (как и куча). защита памяти), что делает 64-битные и 32-битные приложения более устойчивыми к атакам». [46]
Начиная с OS X Mountain Lion 10.8 (выпущенной в июле 2012 г.) и более поздних версиях, вся система, включая ядро, а также кексты и зоны, перемещается случайным образом во время загрузки системы. [47]
ASLR был представлен в Solaris, начиная с Solaris 11.1 (выпущен в октябре 2012 г.). ASLR в Solaris 11.1 можно настроить для всей системы, для каждой зоны или для каждого двоичного файла. [48]
Было продемонстрировано, что атака по побочному каналу с использованием целевого буфера ветвления позволяет обойти защиту ASLR. [30] В 2017 году была продемонстрирована атака под названием «ASLR⊕Cache», которая могла победить ASLR в веб-браузере с использованием JavaScript. [49]