ASLR (ASLR)

Перейти к навигации Перейти к поиску

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

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

Реализации

[править | править код]

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

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

Для работы ASLR (для размещения исполняемых файлов в памяти по случайным адресам) исполняемые файлы должны быть скомпилированы в режиме position-independent executable (разновидность позиционно-независимого кода для исполняемых файлов).

В ОС Windows технология ASLR поддерживается, начиная с Windows Vista (2007 год) [4] для исполнимых файлов и библиотек, собранных сo специальными флагами.

ASLR также поддерживается в более поздних версиях Windows, таких как Windows Server 2008, Windows 7, Windows Server 2008 R2, Windows 8, Windows 8.1, Windows 10, Windows 11.

ASLR не используется для приложений, собранных без специальных флагов, и при работе в режиме совместимости с более ранними версиями Windows.

В ОС Windows XP и Windows Server 2003 ASLR можно включить для любых выбранных приложений с помощью набора средств Microsoft EMET[5] (Enhanced Mitigation Experience Toolkit).

Некоторая случайность при загрузке библиотек добавлена в ОС Mac OS X v10.5 Leopard (2007 год)[6]. В OS X 10.8 Mountain Lion (2012) ASLR является частью ядра системы[7].

В ОС iOS технология ASLR используется начиная с версии 4.3[8]. Для ядра используется с iOS 6[9].

Влияние ASLR на виртуальную память

[править | править код]

ASLR представляет собой компромисс между повышенной безопасностью и сокращением объема доступного 24-битного, 31-битного и 64-битного частного хранилища. При включении 24- и 31-разрядного виртуального хранилища размер доступного частного хранилища будет уменьшен до 63 страниц и 255 страниц соответственно. Запрошенный размер области задания должен по-прежнему удовлетворяться из уменьшенной частной области, чтобы задание могло быть запущено. Задания, размер области которых, не может быть удовлетворен, приведут к ошибке ABEND 822. Если запрошенный размер области задания удовлетворяет, возможно, что уменьшенный размер частного хранилища препятствует завершению задания, что приводит к ошибке ABEND 878.

Один из способов определить, не смогут ли задания выполняться при ограниченном размере 24- или 31-разрядного частного хранилища, которое возникнет при включенном ASLR, — указать большее значение параметра CSA в parmlib. Увеличение размеров как 24-, так и 31-разрядного CSA на 1M эффективно уменьшает размеры 24- и 31-разрядного частного хранилища на 1M, что больше, чем максимальное уменьшение, которое произойдет при ASLR[10].

Недостатки

[править | править код]

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

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

Кроме того, защиту можно обойти через истощение памяти[11] или методы Heap Spray[12].

Примечания

[править | править код]
  1. Theo De Raadt. Exploit Mitigation Techniques (updated to include random malloc and mmap) at OpenCON 2005 (2005). Дата обращения: 26 августа 2009. Архивировано 16 июля 2012 года.
  2. 1 2 Kurt Miller. OpenBSD's Position Independent Executable (PIE) Implementation (2008). Дата обращения: 22 июля 2011. Архивировано 12 июня 2011 года.
  3. libc/stdlib/malloc.c. BSD Cross Reference, OpenBSD src/lib/. Дата обращения: 12 сентября 2016. Архивировано 26 декабря 2014 года.
  4. Windows ISV Software Security Defenses. Msdn.microsoft.com. Дата обращения: 10 апреля 2012. Архивировано 18 апреля 2012 года.
  5. Windows Internals: Including Windows Server 2008 and Windows Vista, Fifth Edition (PRO-Developer) ISBN 978-0-7356-2530-3
  6. Memory randomization (ASLR) coming to Mac OS X Leopard | ZDNet. Дата обращения: 5 января 2018. Архивировано 15 августа 2020 года.
  7. OS X Mountain Lion Core Technologies Overview (июнь 2012). Дата обращения: 25 июля 2012. Архивировано 10 июля 2012 года.
  8. Pwn2Own day 2: iPhone, BlackBerry beaten; Chrome, Firefox no-shows. — «iOS 4.3 introduces Address Space Layout Randomization (ASLR)». Дата обращения: 18 сентября 2014. Архивировано 27 февраля 2017 года.
  9. Yeongjin Jang's Homepage. Дата обращения: 5 января 2018. Архивировано 21 сентября 2020 года.
  10. Address space layout randomization (амер. англ.). www.ibm.com. Дата обращения: 12 сентября 2022.
  11. Простой обход защиты ASLR в Windows 7/8. Дата обращения: 2 марта 2015. Архивировано 19 апреля 2018 года.
  12. Архивированная копия. Дата обращения: 13 ноября 2016. Архивировано 20 апреля 2018 года.

Литература

[править | править код]
  • Фленов М. Е. Программирование на C++ глазами хакера. 2 изд.. — БХВ-Петербург, 2011. — С. 53. — ISBN 978-5-9775-0303-7.
  • Саша Голдштейн, Дима Зурбалев, Идо Флатов. Оптимизация приложений на платформе .NET с использованием языка C#. — ДМК Пресс, 2014. — С. 524. — ISBN 978-5-457-83128-5.