The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

Проект OpenBSD представил технику защиты RETGUARD

21.08.2017 12:25

Тео де Раадт (Theo de Raadt) представил предварительную реализацию техники защиты RETGUARD, которую планируется интегрировать в OpenBSD для усложнения выполнения эксплоитов, построенных с использованием заимствования кусков кода и приёмов возвратно-ориентированного программирования (ROP, Return-Oriented Programming).

Суть метода защиты 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) - атакующий не пытается разместить свой код в памяти, а оперирует уже имеющимися в загруженных библиотеках кусками машинных инструкций, завершающихся инструкцией возврата управления (как правило, это окончания библиотечных функций). Работа эксплоита сводится к построению цепочки вызовов подобных блоков ("гаджетов") для получения нужной функциональности. Для автоматизации выявления гаджетов применяются специальные инструменты. Используя готовые блоки машинных инструкций (гаджеты) можно организовать достаточно сложные операции, в том числе организовать работу условных операторов и циклов.

  1. Главная ссылка к новости (http://undeadly.org/cgi?action...)
  2. OpenNews: В OpenBSD добавлена новая защита от атак на основе заимствования кусков кода
  3. OpenNews: Проект grsecurity представил защиту от атак с использованием заимствования кусков кода
  4. OpenNews: Разработчики OpenBSD подготовили для libc механизм защиты anti-ROP
  5. OpenNews: Проект grsecurity опубликовал реализацию механизма защиты RAP для ядра Linux
  6. OpenNews: Для OpenBSD представлена новая техника рандомизации адресного пространства ядра
Лицензия: CC-BY
Тип: Программы
Короткая ссылка: https://opennet.ru/47060-openbsd
Ключевые слова: openbsd, exploit
При перепечатке указание ссылки на opennet.ru обязательно
Обсуждение (41) Ajax | 1 уровень | Линейный | +/- | Раскрыть всё | RSS
  • 1.7, бедный буратино (ok), 14:08, 21/08/2017 [ответить] [﹢﹢﹢] [ · · · ]  
  • –1 +/
    короче, 6.2 будет суперзащищённой, но половина портов работать не будет :)

    ещё после перехода на clang не все порты работоспособны, а тут ещё и это.

     
  • 1.9, Аноним (-), 15:13, 21/08/2017 [ответить] [﹢﹢﹢] [ · · · ]  
  • +5 +/
    > "xorl %rsp,(%rsp)" для x86_64 или "xorl %esp,(%rsp)" для 32-разрядных систем x8

    Здесь какой-то берд написан. XORL - 32-битная инструкция, она не может применяться к %rsp. Адресация с ипользование 64-битного %rsp на 32-битных системах тоже сомнительна.

     
     
  • 2.10, Аноним (-), 15:18, 21/08/2017 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Аффтар, ты бы хоть патч посмотрел: https://marc.info/?l=openbsd-tech&m=150317547021396&w=2

    Пеши исчо!

     
     
  • 3.36, pavlinux (ok), 17:44, 23/08/2017 [^] [^^] [^^^] [ответить]  
  • +3 +/
    Сам-то смотрел?




    +#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



     
     
  • 4.42, pavlinux (ok), 01:14, 24/08/2017 [^] [^^] [^^^] [ответить]  
  • +/



    > +#ifdef _KERNEL /* 32 bit */
    > +#define RETGUARD_START RETGUARD_CFI; xorl %esp,(%rsp)
    > +#define RETGUARD_END xorl %esp,(%rsp)



    Ну чаво, хацкеры, кто ответит, чо занах 32-бита и rsp ?


     
     
  • 5.45, pavlinux (ok), 04:17, 26/08/2017 [^] [^^] [^^^] [ответить]  
  • +/
    >


    >> +#ifdef _KERNEL /* 32 bit */
    >> +#define RETGUARD_START RETGUARD_CFI; xorl %esp,(%rsp)
    >> +#define RETGUARD_END xorl %esp,(%rsp)
    >


    > Ну чаво, хацкеры, кто ответит, чо занах 32-бита и rsp ?

    Панятно.
    Кароч это кусок для 32-битных бинарников работающих в 64-битной ОСи.

     

  • 1.11, Аноним (-), 15:27, 21/08/2017 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Да сделайте уже отдельный стек для данных и отдельный - для адресов возврата!
     
     
  • 2.13, Аноним (-), 16:29, 21/08/2017 [^] [^^] [^^^] [ответить]  
  • +2 +/
    > Да сделайте уже отдельный стек для данных и отдельный - для адресов возврата!

    Т.е. предлагаете сменить архитектуру процессора? "За чей счёт этот банкет? Кто оплачивать будет?" (С)

     
     
  • 3.14, Аноним (-), 16:36, 21/08/2017 [^] [^^] [^^^] [ответить]  
  • +/
    Системные администраторы скинутся :)
     
     
  • 4.15, мимо крокодил (?), 16:44, 21/08/2017 [^] [^^] [^^^] [ответить]  
  • +1 +/
    ну, кстати, да. Куда заносить?
     
     
  • 5.19, Аноним (-), 18:41, 21/08/2017 [^] [^^] [^^^] [ответить]  
  • +2 +/
    Сюда: http://www.openbsd.org/donations.html
     
     
  • 6.20, A.Stahl (ok), 18:49, 21/08/2017 [^] [^^] [^^^] [ответить]  
  • +/
    Не несите туда деньги! Они будут потрачены на БСД! А может и на что ещё похуже...
     
     
  • 7.30, Аноним (-), 09:45, 22/08/2017 [^] [^^] [^^^] [ответить]  
  • –2 +/
    На БДСМ
     
     
  • 8.34, Аноним (-), 14:15, 22/08/2017 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Он разве собрался нести деньги платиновому партнеру лапчатых ... текст свёрнут, показать
     
  • 2.38, pavlinux (ok), 18:11, 23/08/2017 [^] [^^] [^^^] [ответить]  
  • +2 +/
    > Да сделайте уже отдельный стек для данных и отдельный - для адресов возврата!

    И зашифровать.


     
  • 2.41, alex53 (ok), 22:16, 23/08/2017 [^] [^^] [^^^] [ответить]  
  • +/

    У есть, называется Intel MPX.
     

  • 1.16, Kodir (ok), 17:16, 21/08/2017 [ответить] [﹢﹢﹢] [ · · · ]  
  • –4 +/
    Ф*у*фло, а не защита. Это далеко не самая проблемная часть кода! Первый эшелон - это бестолковейшие функции приёма данных (scanf, recv, etc) - там вся жесть, переполнения, переходы на код и т.п. Потом идут крuв@рукие системные функции, которые как кисейные барышни - верят любой ш*н%яге, которую ей передают и не проверяют. ВОТ ЭТО всё надо категорически разгромить (через написание новой ОС), а потом уже играть в "угадай, кто тебя вызвал".
     
     
  • 2.17, Аноним (-), 17:50, 21/08/2017 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Разгроми, напиши. Посмотрим, что получится.
     
  • 2.18, Аноним123 (?), 18:04, 21/08/2017 [^] [^^] [^^^] [ответить]  
  • +4 +/
    Денис, это ты?
     
     
  • 3.47, Аноним (-), 06:58, 29/08/2017 [^] [^^] [^^^] [ответить]  
  • +/
    > Денис, это ты?

    Написано "Кирилл Муковников". Приятно когда ламеры подписываются чтобы все знали кто это.

     
  • 2.21, ZloySergant (ok), 20:20, 21/08/2017 [^] [^^] [^^^] [ответить]  
  • +3 +/
    >Первый эшелон - это бестолковейшие функции приёма данных (scanf, recv, etc) - там вся жесть, переполнения, переходы на код и т.п.

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

     
     
  • 3.37, pavlinux (ok), 18:02, 23/08/2017 [^] [^^] [^^^] [ответить]  
  • +2 +/
    >>Первый эшелон - это бестолковейшие функции приёма данных (scanf, recv, etc) - там вся жесть, переполнения, переходы на код и т.п.
    > Первый эшелон - это "острое высказывание в рамках несодержательного комментария, проявляющее
    > неуважение к собеседнику и его коллегам, не умеющим пользоваться низкоуровневыми функциями"

    Да он сам-то не понимает, скопипастил то, что в интернетах начитался.  


     
  • 2.25, z (??), 21:41, 21/08/2017 [^] [^^] [^^^] [ответить]  
  • +/
    Gharik, это ты?
     
     
  • 3.26, Панин (?), 21:52, 21/08/2017 [^] [^^] [^^^] [ответить]  
  • +/
    Ану иди сюда!
     

  • 1.22, Аноним (-), 20:36, 21/08/2017 [ответить] [﹢﹢﹢] [ · · · ]  
  • –1 +/
    Лучше бы криптозащиту от Дэна ввиди MAC для адресов возврата допилили до продакшна. Да и вообще не нужно, у интела есть технология control flow guard.
     
     
  • 2.23, A.Stahl (ok), 20:39, 21/08/2017 [^] [^^] [^^^] [ответить]  
  • +3 +/
    >ввиди

    :)

     
     
  • 3.43, pavlinux (ok), 01:17, 24/08/2017 [^] [^^] [^^^] [ответить]  
  • +1 +/
    >>ввиди
    > :)

    пака ление айфон падрастает.  

     
  • 2.35, Аноним (-), 00:58, 23/08/2017 [^] [^^] [^^^] [ответить]  
  • +/
    > Лучше бы криптозащиту от Дэна ввиди MAC для адресов возврата допилили до
    > продакшна. Да и вообще не нужно, у интела есть технология control
    > flow guard.

    Control Flow Guard про другое, он не защищает от ROP — а retguard именно про это.

    MAC для адресов возврата, если не ошибаюсь, дороговато выходит в плане потребления CPU...

     

  • 1.24, Baz (?), 21:03, 21/08/2017 [ответить] [﹢﹢﹢] [ · · · ]  
  • +2 +/
    на взлом защиты "Ретгард" надо первый эксплоит назвать "Данмер", "Аргонианин"...
     
     
  • 2.31, Старый одмин (?), 10:10, 22/08/2017 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Там был Редгард.
     

  • 1.27, Аноним (-), 04:11, 22/08/2017 [ответить] [﹢﹢﹢] [ · · · ]  
  • –1 +/
    А что меняет сплойту инвертировать самостоятельно?
     
     
  • 2.28, Аноним (-), 08:36, 22/08/2017 [^] [^^] [^^^] [ответить]  
  • +3 +/
    Если эксплоит может выполнить любой код, то ему вся это свистопляска с гаджетами и вызовом чужого кода не нужна. Но обычно он имеет возможность только поменять указать для переброса управления, т.е. может выстроить цепочку вызовов, но не может произвольно выполнить определённые инструкции из-за noexec на стеке.
     
     
  • 3.29, Аноним (-), 09:43, 22/08/2017 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Что мешает найти в коде инстукции pop... xor ... ret?
     
     
  • 4.32, Аноним (-), 14:07, 22/08/2017 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Ничего не мешает, ищи.
     
  • 4.33, Аноним84701 (ok), 14:12, 22/08/2017 [^] [^^] [^^^] [ответить]  
  • +1 +/
    > Что мешает найти в коде инстукции pop... xor ... ret?

    Зачем их искать? Их теперь встраивать будут.
    Искать, как и раньше, можно <нужная инструкция/и, подготовка retaddr, ret>  

    А тут задумка, как я понимаю, как раз в том чтобы усложнить использование "штатных" ret (со всеми "гаджетами"), генерированных компилятором.

     
     
  • 5.48, Аноним (-), 07:03, 29/08/2017 [^] [^^] [^^^] [ответить]  
  • +/
    > Искать, как и раньше, можно <нужная инструкция/и, подготовка retaddr, ret>

    Такая конструация обычно будет перед ret. Гаджет который сделает только ret - малополезен. В диком виде такое сочетание команд встречается не часто. Так что любителям гаджетов добавится долботни.

     
  • 4.39, pavlinux (ok), 18:13, 23/08/2017 [^] [^^] [^^^] [ответить]  
  • +3 +/
    > Что мешает найти в коде инстукции pop... xor ... ret?

    Точка старта не известна. Cдвиг на 1 бит превратит xor в скажем в mul  

     
     
  • 5.40, АБВ (?), 20:25, 23/08/2017 [^] [^^] [^^^] [ответить]  
  • –2 +/
    молодец, выделился.
     
  • 5.46, xor (??), 19:47, 27/08/2017 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Но если посмотреть патч - там не очень много вариантов инструкций получается. Если только получится реализовать базовую булевую операцию...
     
  • 5.49, Аноним (-), 07:04, 29/08/2017 [^] [^^] [^^^] [ответить]  
  • +/
    > Точка старта не известна. Cдвиг на 1 бит превратит xor в скажем в mul

    Один _бит_? Как эксплойт позиционировать в памяти побитово, для начала?

     

  • 1.44, Аноним (-), 14:21, 24/08/2017 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    RETARD :)
     

     Добавить комментарий
    Имя:
    E-Mail:
    Текст:



    Спонсоры:
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2021 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру