Sigreturn-ориентированное программирование - Sigreturn-oriented programming

Sigreturn-ориентированное программирование (SROP) это эксплойт компьютерной безопасности метод, который позволяет злоумышленнику выполнить код при наличии таких мер безопасности, как неисполняемая память и подпись кода.[1] Он был впервые представлен на 35-й конференции IEEE по безопасности и конфиденциальности в 2014 году, где выиграл награда за лучшую студенческую работу.[2] В этом методе используются те же основные предположения, что и возвратно-ориентированное программирование (ROP) техника: злоумышленник контролирует стек вызовов, например через переполнение буфера стека, способен влиять на поток управления программы с помощью простых последовательностей инструкций, называемых гаджеты. Атака работает толкать кованый sigcontext структура[3] в стеке вызовов, перезаписывая исходный адрес возврата местоположением гаджета, что позволяет злоумышленнику вызвать сигнатура[4] системный вызов.[5] Часто для успешной реализации этой атаки требуется всего лишь один гаджет. Этот гаджет может находиться в фиксированном месте, что делает эту атаку простой и эффективной, с настройкой, как правило, более простой и переносимой, чем та, которая требуется для простого возвратно-ориентированное программирование техника.[1]

Sigreturn-ориентированное программирование можно считать странная машина поскольку он позволяет выполнять код за пределами исходной спецификации программы.[1]

Фон

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

Эксплойты с перескоком

Если такие механизмы, как Предотвращение выполнения данных используются, злоумышленник не сможет просто разместить шеллкод в стеке и заставит машину выполнить его, перезаписав адрес возврата. С такой защитой машина не будет выполнять какой-либо код, присутствующий в областях памяти, отмеченных как доступные для записи и неисполняемые. Следовательно, злоумышленнику необходимо будет повторно использовать код уже присутствует в памяти.

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

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

Механизм обработки сигналов

Содержимое стека при обработке сигнала (linux x86 / 64), включая структуру sigcontext

Эта атака стала возможной благодаря тому, как сигналы обрабатываются в большинстве POSIX -подобные системы. Каждый раз, когда доставляется сигнал, ядро ​​должно переключатель контекста к установленному обработчику сигналов. Для этого ядро ​​сохраняет текущий контекст выполнения в кадре в стеке.[5][6]Структура, помещенная в стек, является архитектурно-зависимым вариантом sigcontext структура, которая содержит различные данные, составляющие содержимое регистров на момент переключения контекста. Когда выполнение обработчика сигнала завершается, sigreturn () системный вызов вызывается.

Вызов сигнатура syscall означает возможность легко настроить содержимое регистров с помощью одного устройства, которое можно легко найти в большинстве систем.[1]

Отличия от ROP

Есть несколько факторов, которые характеризуют эксплойт SROP и отличают его от классического эксплойта, ориентированного на возврат.[7]

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

Несмотря на то что Полный по Тьюрингу Компиляторы ROP существуют,[8] Как правило, создание ROP-цепочки нетривиально.[7]

Эксплойты SROP обычно переносятся между различными двоичными файлами с минимальными усилиями или без них и позволяют легко настраивать содержимое регистров, что может быть нетривиальным или невозможным для эксплойтов ROP, если необходимые гаджеты отсутствуют.[6]Более того, SROP требует минимального количества устройств и позволяет создавать эффективные шелл-коды путем объединения системных вызовов. Эти гаджеты всегда присутствуют в памяти, а в некоторых случаях всегда находятся в фиксированных местах:[7]

список гаджетов для разных систем
Операционные системыASLRГаджетКарта памятиФиксированное расположение памяти
Linux i386дасигнатура[vdso]
Linux <3.11 ARMНетсигнатура[векторы]0xffff0000
Linux <3.3 x86-64Нетсистемный вызов и возврат[vsyscall]0xffffffffff600000
Linux ≥ 3.3 x86-64дасистемный вызов и возвратLibc
Linux x86-64дасигнатураLibc
FreeBSD 9.2 x86-64Нетсигнатура0x7ffffffff000
Mac OSX x86-64дасигнатураLibc
iOS ARMдасигнатураLibsystem
iOS ARMдасистемный вызов и возвратLibsystem

Атаки

Linux

Пример гаджета, необходимого для эксплойтов SROP, всегда можно найти в VDSO область памяти на x86-Linux системы:

__kernel_sigreturn proc около:поп     eaxmov     eax, 77чint     80ч  ; LINUX - sys_sigreturnнетлеа     ESI, [ESI+0]__kernel_sigreturn конец

На некоторых Ядро Linux версии, ASLR можно отключить, установив ограничение на размер стека на неограниченный,[9] эффективно обходя ASLR и обеспечивая легкий доступ к гаджету, присутствующему в VDSO.

Для ядер Linux до версии 3.3 также можно найти подходящий гаджет на странице vsyscall, которая является механизмом для ускорения доступа к определенным системным вызовам, часто используемым устаревшими программами, и всегда находится в фиксированном месте.

Полнота по Тьюрингу

Можно использовать гаджеты для записи содержимого фреймов стека, тем самым создавая самомодифицирующаяся программа. Используя эту технику, можно придумать простой виртуальная машина, который можно использовать как цель компиляции для Полный по Тьюрингу Пример такого подхода можно найти в статье Босмана, в которой демонстрируется построение интерпретатора для языка, подобного Язык программирования Brainfuck.В языке есть программный счетчик. ПК, указатель памяти п, и временный регистр, используемый для 8-битного сложения А. Это означает, что также сложные бэкдоры или обфусцированные атаки могут быть изобретены.[1]

Защита и смягчение

Существует ряд методов для смягчения атак SROP, основанных на рандомизация разметки адресного пространства, канарейки и печенье, или теневые стеки.

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

Рандомизация разметки адресного пространства затрудняет использование подходящих гаджетов, делая их местоположение непредсказуемым.

Сигнальные куки

Смягчение для SROP называется сигнальные файлы cookie было предложено. Он состоит из способа проверки того, что структура sigcontext не была изменена с помощью случайного файла cookie. XORed с адресом места стека, в котором он должен храниться. сигнатура syscall просто необходимо проверить существование файла cookie в ожидаемом месте, эффективно уменьшая SROP с минимальным влиянием на производительность.[1][10]

Vsyscall эмуляция

В версиях ядра Linux выше 3.3 эмулируется интерфейс vsyscall, и любая попытка напрямую запустить гаджеты на странице приведет к исключению.[11][12]

РЭП

Grsecurity - это набор патчей для Ядро Linux для усиления и повышения безопасности системы.[13] Он включает в себя так называемую защиту обратного адреса (RAP) для защиты от атак повторного использования кода.[14]

CET

Начиная с 2016 г. Intel разрабатывает Технология контроля потока (CET), чтобы помочь смягчить и предотвратить эксплойты со сменой стека. CET работает путем реализации теневого стека в ОЗУ, который будет содержать только адреса возврата, защищенные процессором. блок управления памятью.[15][16]

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

использованная литература

  1. ^ а б c d е ж Босман, Эрик; Бос, Герберт (2014). «Кадровые сигналы - возврат к портативному шеллкоду» (PDF). SP '14 Материалы симпозиума IEEE по безопасности и конфиденциальности: 243–358. Дои:10.1109 / SP.2014.23. ISBN  978-1-4799-4686-0. Получено 2016-06-16.
  2. ^ «Наградные документы Симпозиума IEEE 2014 г. по безопасности и конфиденциальности». Безопасность IEEE. Технический комитет IEEE Computer Society по безопасности и конфиденциальности. Получено 2016-06-17.
  3. ^ «Перекрестная ссылка Linux - sigcontext.h».
  4. ^ "SIGRETURN (2) - страница руководства Linux".
  5. ^ а б «Игра с сигналами: обзор программирования, ориентированного на возврат сигнатуры». Получено 2016-06-21.
  6. ^ а б c "Sigreturn-ориентированное программирование и его смягчение". Получено 2016-06-20.
  7. ^ а б c Босман, Эрик; Бос, Герберт. «Кадровые сигналы: возвращение к портативному шеллкоду» (PDF).
  8. ^ "ROPC - полный компилятор ROP по Тьюрингу (часть 1)".
  9. ^ «CVE-2016-3672 - снятие ограничения на стек больше не отключает ASLR». Получено 2016-06-20.
  10. ^ "Sigreturn-ориентированное программирование и его смягчение". Получено 2016-06-20.
  11. ^ "О vsyscalls и vDSO". Получено 2016-06-20.
  12. ^ «Hack.lu 2015 - Stackstuff 150: Почему и как работает эмуляция vsyscall». Получено 2016-06-20.
  13. ^ «Безопасность ядра Linux (SELinux против AppArmor против Grsecurity)».
  14. ^ «RAP: RIP ROP» (PDF). Получено 2016-06-20.
  15. ^ «RIP ROP: хитрый заговор Intel по уничтожению эксплойтов с перескакиванием стека на уровне процессора». Получено 2016-06-20.
  16. ^ «Предварительный просмотр технологии Control-Flow-Enforcement» (PDF).

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