Слепое возвратно-ориентированное программирование - Blind return oriented programming

Слепое возвратно-ориентированное программирование (BROP) это метод эксплойта, который может успешно создать эксплойт, даже если злоумышленник не владеет целевым двоичным файлом. BROP-атаки, показанные Bittau et al. победили рандомизация разметки адресного пространства (ASLR) и стек канареек в 64-битных системах.

История ROP

Благодаря текущим улучшениям безопасности ОС и оборудования, такие функции безопасности, как Linux PAX проект, внедрение кода теперь невозможно. Затем исследователи безопасности разработали новую атаку, которую они назвали возвратно-ориентированное программирование победить NX (неисполняемая) память. Эта атака основана на воздействии на поток программы путем управления стеком, особенно адресами возврата. Гаджеты являются основными элементами этой атаки. Гаджеты - это группа последовательностей инструкций, заканчивающихся инструкцией возврата, вместе с определенным состоянием стека. Гаджет может выполнять такие операции, как загрузка слова из памяти в регистр, или выполнение более сложных операций, таких как условный переход. При достаточно большом целевом двоичном файле Полный по Тьюрингу может быть создана коллекция гаджетов, которой более чем достаточно для выполнения шеллкода. Одно из предположений, которое делает ROP, состоит в том, что злоумышленник обладает целевыми двоичными файлами и, следовательно, заранее знает адреса гаджетов.

Сценарии для BROP

Есть три новых сценария, которые BROP [1] может быть актуальным для. Они есть:
(i) В случае закрытых бинарных сервисов для обнаружения уязвимостей, в которых необходимо использовать такие методы, как нечеткое тестирование и тестирование на проникновение.
(ii) Известная уязвимость в библиотеке с открытым исходным кодом может использоваться для переноса эксплойта, даже если проприетарный двоичный файл, который ее использует, является закрытым исходным кодом.
(iii) Его также можно использовать для взлома сервера с открытым исходным кодом, двоичный файл которого неизвестен.
Атака предполагает, что на сервере есть служба, которая имеет известную уязвимость стека, а также что служба должна перезапускаться при сбое.

Фазы атаки

Чтение стека

Указатели команд возврата обычно защищены стековыми канарейками. Канарейка стека вызывает сбой программы, если ее значение изменяется из-за переполнения буфера. В модели атаки BROP переполнение буфера передается побайтно. Каждая попытка переполнения приводит либо к сбою программы, либо к продолжению выполнения. Сбой программы означает, что значение стека было неправильно угадано, поэтому за 256 попыток (средний случай - 128 попыток) значение стека, вероятно, можно оценить. На 64-битных машинах потребуется 4 таких чтения стека для утечки канарейки. После утечки канарейки указатель инструкции возврата может быть изменен таким же образом. Однако можно отметить, что хотя оценка канареечного стека точна, этого нельзя сказать об адресе инструкции возврата. Злоумышленник будет удовлетворен возможностью утечки любого адреса в текстовом сегменте адресного пространства.

Слепая ROP

Эта стадия - сердце атаки. Цель на этом этапе - запустить системный вызов записи, отправив злоумышленнику дамп двоичного файла. Системный вызов записи имеет три параметра: сокет, буфер и длину. Поскольку соглашения о вызовах x86-64 требуют, чтобы параметры передавались через регистры, для настройки аргументов для системного вызова записи потребуются соответствующие инструкции pop в rsi, rdi и rdx. Последовательности инструкций, такие как pop rdi, ret и т.п., были бы полезны в этом отношении. Простая ROP-версия системного вызова write:
(1) pop rdi; ret (сокет)
(2) pop rsi; ret (буфер)
(3) pop rdx; ret (длина)
(4) поп-ракс; ret (введите номер системного вызова)
(5) системный вызов

Одна из проблем этой методологии заключается в том, что даже если полезные гаджеты будут обнаружены в адресном пространстве после того, как они вернут адрес в стеке, с большой вероятностью это приведет к неисполняемому стеку. Чтобы исправить это, предлагающие BROP разработали устройства остановки. Гаджет остановки - это все, что может вызвать блокировку программы, например бесконечный цикл или блокирующий системный вызов (например, сон). При этом рабочие процессоры, затронутые атакой, застревают в бесконечном цикле, что позволяет злоумышленнику продолжить атаку.

То, что упоминалось выше, - это чистая методология атаки. На самом деле, можно провести несколько оптимизаций, которые помогут эффективно провести атаку. Основным из них является использование таблиц компоновщика процедур (PLT) для отслеживания системного вызова записи вместо передачи номера системного вызова функции syscall. Другие включают использование strcmp для заполнения регистра RDX, поскольку последовательности инструкций pop RDX и ret встречаются крайне редко.

Создайте эксплойт

Как только запись обнаружена в PLT, злоумышленник может сбросить содержимое целевого двоичного файла, чтобы найти больше гаджетов. Злоумышленник может использовать обычные методы поиска ROP-гаджетов, чтобы собрать достаточно и создать шелл-код. Получив шелл-код, взломанная система может быть взята под полный контроль с правами root.

Предотвращение BROP

Большое предположение в атаке BROP состоит в том, что сервер перезагружается после каждого сбоя и при перезапуске не повторно рандомизирует свое адресное пространство. Таким образом, включение повторной рандомизации адресного пространства при запуске может обеспечить почти полную защиту от BROP. Другой метод, используемый NetBSD и Linux, - это сон при сбое. Это значительно замедляет атаку и позволяет системному администратору отслеживать любую подозрительную активность. Помимо этой традиционной защиты от атак с перехватом управляющего потока в стиле ROP, Control Flow Integrity также может обеспечить доказуемую защиту, но со значительными накладными расходами.

Подобные атаки

Другая атака, которая по своей природе похожа на BROP, - это JIT (Just-In-Time) -ROP или JIT-ROP. Это еще одна атака, основанная на раскрытии информации, которая также может победить Рандомизация макета адресного пространства. И BROP, и JIT-ROP будут пытаться найти гаджеты в двоичном файле, чтобы инициировать ROP-атаку, целью которой является использование некоторого типа утечки данных. Однако, в отличие от BROP, JIT-ROP не является интерактивной атакой и пытается адаптироваться к ситуациям без сбоев / сбоев, а скорее, злоумышленник отправит сценарий, который обнаружит гаджеты, а затем создаст атаку для доставки. . Кроме того, JIT-ROP должен иметь две разные уязвимости (как кучу, так и стек), известные до атаки, в то время как BROP требует только осведомленности об уязвимости стека.[2]

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

  1. ^ «Программирование, ориентированное на слепой возврат (BROP)». Группа Stanford Secure Computer Systems. Получено 2016-02-24.
  2. ^ Кинер, Лоуренс (декабрь 2015 г.). «Оценка общности и пределов слепых программных атак, ориентированных на возврат» (PDF). Калхун: институциональный архив NPS: 26. Получено 28 февраля 2016.