Проект OpenBSD представил технику защиты RETGUARD
Суть метода защиты RETGUARD заключается в искажении адреса возврата обработчиков типовых функций системных библиотек и ядра - перед началом обработчика и перед командой возврата управления (ret) добавляется вызов "xorq %rsp,(%rsp)" для x86_64 или "xorl %esp,(%esp)" для 32-разрядных систем x86. При штатном ходе выполнения первый xor инвертирует адрес возврата, а второй инвертирует его второй раз, возвращая к изначальному виду. При выполнении эксплоита осуществляется переход на составляющий эксплоит блок заимствованных машинных инструкций (гаджет), точка входа в который как правило не совпадает с началом функции. Так как управление передано не на начало, а в определённую часть тела функции, первый "xor" будет пропущен и "xor" перед выходом исказит переданный эксплоитом адрес возврата.
Метод реализован в виде патча к компилятору clang, который на этапе компиляции производит автоматическую подстановку кода инвертирования адреса возврата во все функции. Для функций системной библиотеки и ядра, написанных на языке ассемблер, подготовлены отдельные патчи, в которых команды "xor" добавлены вручную. Для активации нового метода защиты в приложениях не требуется отдельных действий, достаточно наложить патч, после чего пересобрать gnu/usr.bin/clang и затем этим clang пересобрать систему.
Код пока оценивается как экспериментальный и предлагается для тестирования перед включением в основной состав OpenBSD. При этом работа базовой системы и большинства портов с предложенным патчем отмечается как не вызывающая нареканий. Тем не менее выявлены отдельные проблемы при сборке нескольких крупных портов, в коде которых используются прямые манипуляции с адресами возврата. В дальнейшем после отладки и интеграции защиты адресов возврата планируется реализовать похожую технику для усложнения использования гаджетов, в которых возврат управления обеспечен через подстановку адреса для команды jmp (pop/jmp или JOP).
Напомним, что техника заимствования кусков кода используется для эксплуатации переполнений буфера в условиях, когда в страницах памяти стека и буфера установлен запрет на исполнение кода. Для организации выполнения кода атакующего в таких условиях логика выполнения shell-кода формируется с использованием методов возвратно-ориентированного программирования (ROP) - атакующий не пытается разместить свой код в памяти, а оперирует уже имеющимися в загруженных библиотеках кусками машинных инструкций, завершающихся инструкцией возврата управления (как правило, это окончания библиотечных функций). Работа эксплоита сводится к построению цепочки вызовов подобных блоков ("гаджетов") для получения нужной функциональности. Для автоматизации выявления гаджетов применяются специальные инструменты. Используя готовые блоки машинных инструкций (гаджеты) можно организовать достаточно сложные операции, в том числе организовать работу условных операторов и циклов.
Источник: http://www.opennet.ru/opennews/art.shtml?num=47060
|
0 | Tweet | Нравится |
|