Тео де Раадт (Theo de Raadt) представил (https://marc.info/?l=openbsd-tech&m=150317547021396&w=2) предварительную реализацию техники защиты RETGUARD, которую планируется интегрировать в OpenBSD для усложнения выполнения эксплоитов, построенных с использованием заимствования кусков кода (https://ru.wikipedia.org/wiki/%D0%92%D0%... и приёмов возвратно-ориентированного программирования (ROP, Return-Oriented Programming).Суть метода защиты RETGUARD заключается в искажении адреса возврата обработчиков типовых функций системных библиотек и ядра - перед началом обработчика и перед командой возврата управления (ret) добавляется вызов "xorl %rsp,(%rsp)" для x86_64 или "xorl %esp,(%rsp)" для 32-разрядных систем x86. При штатном ходе выполнения первый xor инвертирует адрес возврата, а второй инвертирует второй раз, приведя его к изначальному виду. При выполнении эксплоита осуществляется
переход на составляющий эксплоит блок заимствованных машинных инструкций (гаджет), точка входа в который как правило не совпадает с началом функции. Так как управление передано не на начало, а в определённую часть тела функции, первый "xor" будет пропущен и "xor" перед выходом исказит переданный эксплоитом адрес возврата.
Метод реализован в виде патча к компилятору clang, который на этапе компиляции производит автоматическую подстановка кода инвертирования адреса возврата во все функции. Для функций системной библиотеки и ядра, написанных на языке ассемблер, подготовлены отдельные патчи, в которых команды "xor" добавлены вручную. Для активации нового метода защиты в приложениях не требуется отдельных действий, достаточно наложить патч, после чего пересобрать gnu/usr.bin/clang и затем этим clang пересобрать систему.
Код пока оценивается как экспериментальный и предлагается для тестирования перед включением в основной состав OpenBSD. При этом работа базовой системы и большинства портов с предложенным патчем отмечается как не вызывающая нареканий. Тем не менее пока имеются отдельные проблемы при сборке нескольких крупных портов, в коде которых используются прямые манипуляции с адресами возврата.После отладки и интеграции защиты адресов возврата планируется реализовать похожую технику для усложнения использования гаджетов, в которых возврат управления обеспечен через подстановку адреса для команды jmp (pop/jmp или JOP).
Напомним, что техника заимствования кусков кода используется для эксплуатации переполнений буфера в условиях, когда в страницах памяти стека и буфера установлен запрет на исполнение кода. Для организации выполнения кода атакующего в таких условиях логика выполнения shell-кода формируется с использованием методов возвратно-ориентированного программирования (ROP) - атакующий не пытается разместить свой код в памяти, а оперирует уже имеющимися в загруженных библиотеках кусками машинных инструкций, завершающихся инструкцией возврата управления (как правило, это окончания библиотечных функций). Работа эксплоита сводится к построению цепочки вызовов подобных блоков ("гаджетов") для получения нужной функциональности. Для автоматизации выявления гаджетов применяются специальные инструменты (https://github.com/JonathanSalwan/ROPgadget/). Используя готовые блоки машинных инструкций (гаджеты) можно организовать достаточно сложные операции, в том числе организовать работу условных операторов и циклов.
URL: http://undeadly.org/cgi?action=article&sid=20170819230157
Новость: http://www.opennet.me/opennews/art.shtml?num=47060
короче, 6.2 будет суперзащищённой, но половина портов работать не будет :)ещё после перехода на clang не все порты работоспособны, а тут ещё и это.
> "xorl %rsp,(%rsp)" для x86_64 или "xorl %esp,(%rsp)" для 32-разрядных систем x8Здесь какой-то берд написан. XORL - 32-битная инструкция, она не может применяться к %rsp. Адресация с ипользование 64-битного %rsp на 32-битных системах тоже сомнительна.
Аффтар, ты бы хоть патч посмотрел: https://marc.info/?l=openbsd-tech&m=150317547021396&w=2Пеши исчо!
Сам-то смотрел?
+#ifdef _KERNEL /* 32 bit */
+#define RETGUARD_CFI .cfi_escape 0x16, 0x10, 0x0d, 0x09, 0xf8, 0x22, 0x12, \
+ 0x06, 0x16, 0x0c, 0xff, 0xff, 0xff, 0xff, 0x1a, 0x27
+#define RETGUARD_START RETGUARD_CFI; xorl %esp,(%rsp)
+#define RETGUARD_END xorl %esp,(%rsp)
+#else
+#define RETGUARD_CFI .cfi_escape 0x16, 0x10, 0x06, 0x09, 0xf8, 0x22, 0x12, \
+ 0x06, 0x27
+#define RETGUARD_START RETGUARD_CFI; xorq %rsp,(%rsp)
+#define RETGUARD_END xorq %rsp,(%rsp)
+#endif
> +#ifdef _KERNEL /* 32 bit */
> +#define RETGUARD_START RETGUARD_CFI; xorl %esp,(%rsp)
> +#define RETGUARD_END xorl %esp,(%rsp)Ну чаво, хацкеры, кто ответит, чо занах 32-бита и rsp ?
>
>> +#ifdef _KERNEL /* 32 bit */
>> +#define RETGUARD_START RETGUARD_CFI; xorl %esp,(%rsp)
>> +#define RETGUARD_END xorl %esp,(%rsp)
>
> Ну чаво, хацкеры, кто ответит, чо занах 32-бита и rsp ?Панятно.
Кароч это кусок для 32-битных бинарников работающих в 64-битной ОСи.
Да сделайте уже отдельный стек для данных и отдельный - для адресов возврата!
> Да сделайте уже отдельный стек для данных и отдельный - для адресов возврата!Т.е. предлагаете сменить архитектуру процессора? "За чей счёт этот банкет? Кто оплачивать будет?" (С)
Системные администраторы скинутся :)
ну, кстати, да. Куда заносить?
Сюда: http://www.openbsd.org/donations.html
Не несите туда деньги! Они будут потрачены на БСД! А может и на что ещё похуже...
На БДСМ
> На БДСМОн разве собрался нести деньги платиновому партнеру лапчатых?
> Да сделайте уже отдельный стек для данных и отдельный - для адресов возврата!И зашифровать.
У есть, называется Intel MPX.
Ф*у*фло, а не защита. Это далеко не самая проблемная часть кода! Первый эшелон - это бестолковейшие функции приёма данных (scanf, recv, etc) - там вся жесть, переполнения, переходы на код и т.п. Потом идут крuв@рукие системные функции, которые как кисейные барышни - верят любой ш*н%яге, которую ей передают и не проверяют. ВОТ ЭТО всё надо категорически разгромить (через написание новой ОС), а потом уже играть в "угадай, кто тебя вызвал".
Разгроми, напиши. Посмотрим, что получится.
Денис, это ты?
> Денис, это ты?Написано "Кирилл Муковников". Приятно когда ламеры подписываются чтобы все знали кто это.
>Первый эшелон - это бестолковейшие функции приёма данных (scanf, recv, etc) - там вся жесть, переполнения, переходы на код и т.п.Первый эшелон - это "острое высказывание в рамках несодержательного комментария, проявляющее неуважение к собеседнику и его коллегам, не умеющим пользоваться низкоуровневыми функциями" . (точка)
>>Первый эшелон - это бестолковейшие функции приёма данных (scanf, recv, etc) - там вся жесть, переполнения, переходы на код и т.п.
> Первый эшелон - это "острое высказывание в рамках несодержательного комментария, проявляющее
> неуважение к собеседнику и его коллегам, не умеющим пользоваться низкоуровневыми функциями"Да он сам-то не понимает, скопипастил то, что в интернетах начитался.
Gharik, это ты?
Ану иди сюда!
Лучше бы криптозащиту от Дэна ввиди MAC для адресов возврата допилили до продакшна. Да и вообще не нужно, у интела есть технология control flow guard.
>ввиди:)
>>ввиди
> :)пака ление айфон падрастает.
> Лучше бы криптозащиту от Дэна ввиди MAC для адресов возврата допилили до
> продакшна. Да и вообще не нужно, у интела есть технология control
> flow guard.Control Flow Guard про другое, он не защищает от ROP — а retguard именно про это.
MAC для адресов возврата, если не ошибаюсь, дороговато выходит в плане потребления CPU...
на взлом защиты "Ретгард" надо первый эксплоит назвать "Данмер", "Аргонианин"...
Там был Редгард.
А что меняет сплойту инвертировать самостоятельно?
Если эксплоит может выполнить любой код, то ему вся это свистопляска с гаджетами и вызовом чужого кода не нужна. Но обычно он имеет возможность только поменять указать для переброса управления, т.е. может выстроить цепочку вызовов, но не может произвольно выполнить определённые инструкции из-за noexec на стеке.
Что мешает найти в коде инстукции pop... xor ... ret?
Ничего не мешает, ищи.
> Что мешает найти в коде инстукции pop... xor ... ret?Зачем их искать? Их теперь встраивать будут.
Искать, как и раньше, можно <нужная инструкция/и, подготовка retaddr, ret>А тут задумка, как я понимаю, как раз в том чтобы усложнить использование "штатных" ret (со всеми "гаджетами"), генерированных компилятором.
> Искать, как и раньше, можно <нужная инструкция/и, подготовка retaddr, ret>Такая конструация обычно будет перед ret. Гаджет который сделает только ret - малополезен. В диком виде такое сочетание команд встречается не часто. Так что любителям гаджетов добавится долботни.
> Что мешает найти в коде инстукции pop... xor ... ret?Точка старта не известна. Cдвиг на 1 бит превратит xor в скажем в mul
молодец, выделился.
Но если посмотреть патч - там не очень много вариантов инструкций получается. Если только получится реализовать базовую булевую операцию...
> Точка старта не известна. Cдвиг на 1 бит превратит xor в скажем в mulОдин _бит_? Как эксплойт позиционировать в памяти побитово, для начала?
RETARD :)