Sigreturn-ориентированное программирование
Sigreturn-ориентированное программирование ( SROP ) — это метод использования компьютерной безопасности , который позволяет злоумышленнику выполнять код при наличии таких мер безопасности, как неисполняемая память и подпись кода. [1] Впервые он был представлен на 35-м симпозиуме IEEE по безопасности и конфиденциальности в 2014 году, где получил награду за лучшую студенческую работу . [2] В этом методе используются те же основные предположения, что и в методе возвратно-ориентированного программирования (ROP): злоумышленник, управляющий стеком вызовов , например, посредством переполнения буфера стека , может влиять на поток управления программой посредством простых последовательностей инструкций, называемых гаджетами . Атака работает путем внедрения поддельной sigcontext. структуры [3] в стеке вызовов, перезаписывая исходный обратный адрес местоположением гаджета, позволяющего злоумышленнику вызвать сигретурн [4] системный вызов . [5] Часто для успешной реализации этой атаки требуется всего один гаджет. Этот гаджет может находиться в фиксированном месте, что делает эту атаку простой и эффективной, а его настройка обычно проще и портативнее, чем та, которая необходима для простой техники возвратно-ориентированного программирования . [1]
Программирование, ориентированное на Sigreturn, можно считать странной машиной , поскольку оно позволяет выполнять код за пределами исходной спецификации программы. [1]
Фон
[ редактировать ]Sigreturn-ориентированное программирование (SROP) — это метод, аналогичный возвратно-ориентированному программированию (ROP), поскольку он использует повторное использование кода для выполнения кода за пределами исходного потока управления. В этом смысле злоумышленнику необходимо иметь возможность провести атаку разрушения стека , обычно через переполнение буфера стека , чтобы перезаписать адрес возврата, содержащийся внутри стека вызовов .
Эксплойты с переключением стека
[ редактировать ]Если используются такие механизмы, как предотвращение выполнения данных , злоумышленник не сможет просто поместить шелл-код в стек и заставить машину выполнить его, перезаписав обратный адрес. При наличии такой защиты машина не будет выполнять какой-либо код, присутствующий в областях памяти, помеченных как доступные для записи и неисполняемые. Следовательно, злоумышленнику придется повторно использовать код, уже присутствующий в памяти.
Большинство программ не содержат функций, которые позволят злоумышленнику напрямую выполнить нужное действие (например, получить доступ к оболочке ) , но необходимые инструкции часто разбросаны по памяти. [6]
Программирование, ориентированное на возврат, требует, чтобы эти последовательности инструкций, называемые гаджетами, заканчивались RET
инструкция. Таким образом, злоумышленник может записать в стек последовательность адресов этих гаджетов, и как только RET
инструкция в одном гаджете выполнена, поток управления перейдет к следующему гаджету в списке.
Механизм обработки сигнала
[ редактировать ]Эта атака стала возможной благодаря тому, как сигналы обрабатываются в большинстве POSIX -подобных систем.
Всякий раз при доставке сигнала ядру необходимо переключить контекст на установленный обработчик сигнала. Для этого ядро сохраняет текущий контекст выполнения в кадре стека. [5] [6]
Структура, помещаемая в стек, представляет собой специфичный для архитектуры вариант структуры sigcontext , который содержит различные данные, составляющие содержимое регистров в момент переключения контекста.
Когда выполнение обработчика сигнала завершено, sigreturn()
вызывается системный вызов.
Вызов системного вызова sigreturn означает возможность легко устанавливать содержимое регистров с помощью одного гаджета, который можно легко найти в большинстве систем. [1]
Отличия от РОП
[ редактировать ]Есть несколько факторов, которые характеризуют эксплойт SROP и отличают его от классического эксплойта возвратно-ориентированного программирования. [7]
Во-первых, ROP зависит от доступных гаджетов, которые могут сильно различаться в разных двоичных файлах , что делает цепочки гаджетов непереносимыми. Рандомизация расположения адресного пространства (ASLR) затрудняет использование гаджетов без утечки информации для получения их точного положения в памяти.
Хотя полные по Тьюрингу , существуют ROP-компиляторы, [8] обычно создать цепочку ROP нетривиально. [7]
Эксплойты SROP обычно переносятся между различными двоичными файлами с минимальными усилиями или вообще без них и позволяют легко настраивать содержимое регистров, что может быть нетривиальным или невозможным для эксплойтов ROP, если необходимые гаджеты отсутствуют. [6] Более того, SROP требует минимального количества гаджетов и позволяет создавать эффективные шеллкоды путем объединения системных вызовов. Эти гаджеты всегда присутствуют в памяти, а в некоторых случаях всегда находятся в фиксированных местах: [7]
ТЫ | АСЛР | Гаджет | Карта памяти | Фиксированное расположение памяти |
---|---|---|---|---|
Линукс i386 | Сигретерн | [вдсо] | ||
Linux <3.11 ARM | Сигретерн | [векторы] | 0xffff0000 | |
Linux < 3.3 x86-64 | системный вызов и возврат | [vsycall] | 0xffffffffff600000 | |
Linux ≥ 3,3 x86-64 | системный вызов и возврат | Либк | ||
Линукс х86-64 | Сигретерн | Либк | ||
FreeBSD 9.2 x86-64 | Сигретерн | 0x7ffffffff000 | ||
Mac OSX x86-64 | Сигретерн | Либк | ||
iOS ARM | Сигретерн | Либсистема | ||
iOS ARM | системный вызов и возврат | Либсистема |
Атаки
[ редактировать ]Линукс
[ редактировать ]Пример гаджета, необходимого для эксплойтов SROP, всегда можно найти в области памяти VDSO в системах x86- Linux :
__kernel_sigreturn proc near:
pop eax
mov eax, 77h
int 80h ; LINUX - sys_sigreturn
nop
lea esi, [esi+0]
__kernel_sigreturn endp
В некоторых версиях ядра Linux ASLR можно отключить, установив неограниченный размер стека. [9] эффективно обходя ASLR и обеспечивая легкий доступ к гаджету, присутствующему в VDSO.
Для ядер Linux до версии 3.3 также можно найти подходящий гаджет на странице vsyscall, который представляет собой механизм для ускорения доступа к определенным системным вызовам, часто используемым устаревшими программами, и всегда находится в фиксированном месте.
Тьюринг-полнота
[ редактировать ]Можно использовать гаджеты для записи в содержимое кадров стека, создавая тем самым самомодифицирующуюся программу . Используя этот метод, можно разработать простую виртуальную машину , которую можно использовать в качестве цели компиляции для полного по Тьюрингу языка.
Пример такого подхода можно найти в статье Босмана, в которой демонстрируется построение интерпретатора языка, похожего на язык программирования Brainfuck .
В языке предусмотрен счетчик программ PC
, указатель памяти P
и временный регистр, используемый для 8-битного сложения. A
. Это означает, что также сложные бэкдоры или запутанные атаки. могут быть разработаны [1]
Защита и смягчение последствий
[ редактировать ]Существует ряд методов для смягчения атак SROP, основанных на рандомизации структуры адресного пространства , канареечных файлах и файлах cookie или теневых стеках .
Рандомизация макета адресного пространства
[ редактировать ]Рандомизация расположения адресного пространства усложняет использование подходящих гаджетов, делая их местоположение непредсказуемым.
Сигнальные файлы cookie
[ редактировать ]средство смягчения последствий SROP, называемое сигнальными файлами cookie Было предложено . Он состоит из способа проверки того, что структура sigcontext не была изменена с помощью случайного файла cookie, соединенного с помощью XOR с адресом местоположения стека, в котором он должен храниться. Таким образом, системному вызову sigreturn достаточно просто проверить наличие файла cookie в ожидаемом месте, что эффективно снижает SROP с минимальным влиянием на производительность. [1] [10]
Эмуляция Vsyscall
[ редактировать ]В версиях ядра Linux выше 3.3 интерфейс vsyscall эмулируется, и любая попытка напрямую выполнить гаджеты на странице приведет к исключению. [11] [12]
РЭП
[ редактировать ]Grsecurity — это набор патчей для ядра Linux , призванный усилить и улучшить безопасность системы. [13] Он включает в себя так называемую защиту обратного адреса (RAP), которая помогает защититься от атак с повторным использованием кода. [14]
ЭТОТ
[ редактировать ]Начиная с 2016 года, Intel разрабатывает технологию обеспечения контроля потока управления ( CET ), которая поможет смягчить и предотвратить эксплойты с переключением стека. ЦП CET работает путем реализации теневого стека в оперативной памяти, который будет содержать только адреса возврата, защищенные блоком управления памятью . [15] [16]
См. также
[ редактировать ]- Интерфейсы ядра Linux
- Уязвимость (вычисления)
- Эксплойт (компьютерная безопасность)
- Переполнение буфера
- Рандомизация макета адресного пространства
- Исполняемая космическая защита
- NX-биты
Ссылки
[ редактировать ]- ^ Перейти обратно: а б с д и ж Босман, Эрик; Бос, Герберт (2014). «Формирование сигналов — возвращение к переносимому шеллкоду» (PDF) . Симпозиум IEEE 2014 по безопасности и конфиденциальности . стр. 243–358. дои : 10.1109/СП.2014.23 . ISBN 978-1-4799-4686-0 . S2CID 6153855 . Проверено 16 июня 2016 г.
- ^ «Наградные материалы симпозиума IEEE по безопасности и конфиденциальности 2014 г.» . IEEE-безопасность . Технический комитет по безопасности и конфиденциальности IEEE Computer Society . Проверено 17 июня 2016 г.
- ^ «Перекрестная ссылка Linux — sigcontext.h» .
- ^ «SIGRETURN(2) — страница руководства Linux» .
- ^ Перейти обратно: а б «Игра с сигналами: обзор Sigreturn-ориентированного программирования» . Проверено 21 июня 2016 г.
- ^ Перейти обратно: а б с «Программирование, ориентированное на Sigreturn, и его смягчение» . Проверено 20 июня 2016 г.
- ^ Перейти обратно: а б с Босман, Эрик; Бос, Герберт. «Обрамление сигналов: возвращение к переносимому шеллкоду» (PDF) .
- ^ «ROPC — Полный компилятор ROP по Тьюрингу (часть 1)» . 12 декабря 2013 г.
- ^ «CVE-2016-3672 — Ограничение стека больше не отключает ASLR» . Проверено 20 июня 2016 г.
- ^ «Программирование, ориентированное на Sigreturn, и его смягчение» . Проверено 20 июня 2016 г.
- ^ «О vsyscalls и vDSO» . Проверено 20 июня 2016 г.
- ^ «Hack.lu 2015 — Stackstuff 150: Почему и как работает эмуляция vsyscall» . Проверено 20 июня 2016 г.
- ^ «Безопасность ядра Linux (SELinux против AppArmor против Grsecurity)» .
- ^ «РЭП: РИП РОП» (PDF) . Проверено 20 июня 2016 г.
- ^ «RIP ROP: хитрый заговор Intel по устранению эксплойтов с переключением стека на уровне процессора» . Регистр . Проверено 20 июня 2016 г.
- ^ «Предварительный просмотр технологии Control-Flow-Enforcement» (PDF) .