Компания Intel опубликовала предварительную спецификацию новой концепции защиты от эксплойтов с привлечением микропроцессора. В своем посте, который посвящен новой технологии под названием Control-flow Enforcement Technology (CET), объясняется модель защиты от эксплойтов, которые так или иначе используют для своих целей методы ROP. Как правило, ROP используется для обхода DEP в системе. Эта защитная мера (DEP) также реализуется с привлечением микропроцессора и помечает RW-страницы данных виртуальной памяти как не подлежащие исполнению (NX).



CET вводит понятие теневого стека вызовов (shadow stack), который ведется самим микропроцессором и в котором сохраняется информация об адресах возврата для дальнейшего использования инструкцией ret. При возврате потока из той или иной функции, микропроцессор будет проверять адрес возврата, который сохранен на стеке потока с тем, который сохранен на теневом стеке и в случае их несоответствия будет генерировать исключение, обрабатываемое ОС. CET определяет интерфейсы для ОС, которые позволят автоматизировать этот процесс и эффективно бороться с эксплойтами, использующими ROP.

Под теневой стек будет выделен отдельный регион виртуальной памяти, который будет помечен таковым на уровне элементов PTE таблиц страниц. Таким образом, микропроцессор будет блокировать любые попытки того или иного кода получить доступ к этому стеку (например, через инструкцию mov). Указатель на теневой стек микропроцессор будет хранить в известной структуре сегмента состояния задачи (Task state segment) для отслеживания этого поля при переключении контекста потока и его процесса. Поля этой структуры также частично используются Windows для механизма обслуживания процессов и переключения контекста.

CET defines a second stack (shadow stack) exclusively used for control transfer operations, in addition to the traditional stack used for control transfer and data. When CET is enabled, CALL instruction pushes the return address into a shadow stack in addition to its normal behavior of pushing return address into the normal stack (no changes to traditional stack operation). The return instructions (e.g. RET) pops return address from both shadow and traditional stacks, and only transfers control to popped address if return addresses from both stacks match.

За активацию CET на уровне микропроцессора будет отвечать специальный флаг регистра cr4 под названием CR4.CET. Для него же будет выделен целый набор специальных MSR регистров, которые будут контролировать поведение CET: IA32_U_CET, IA32_S_CET, IA32_PL3_SSP, IA32_PL2_SSP, IA32_PL1_SSP, IA32_PL0_SSP, IA32_INTERRUPT_SSP_TABLE_ADDR. Текущий адрес теневого стека потока будет фиксироваться новым регистром микропроцессора под названием SSP (Shadow Stack Pointer).


Рис. Формат кода ошибки известного исключения page fault, которое генерируется микропроцессором при попытке доступа потока к не предназначенной для него странице. Установленный в результате исключения шестой бит говорит о попытке доступа потока к странице виртуальной памяти с теневым стеком.

Теневым стеком можно будет управлять с использованием инструкций микропроцессора, правила использования которыми регламентируется ОС. Некоторые из них указаны ниже.

  • INCSSP — увеличить указатель теневого стека SSP на один шаг, т. е. на 4 байта в 32-битной системе и на 8 байт в 64-битной.
  • RDSSP — прочитать значение указателя SSP в указанный регистр.
  • SAVESSP — сохранить текущий «контекст маркера теневого стека» на теневом стеке и выровнять указатель SSP на 8 байт.
  • RSTORSSP — команда аналогична предыдущий, т. е. записывает в SSP значение сохраненного маркера стека.
  • WRSS — записать по указателю SSP в виртуальной памяти значение переданного аргумента.

В случае своей активности, CET будет реагировать на следующие инструкции микропроцессора, которые изменяют поток выполнения кода: CALL, INT n/INTO/INT3, JMP, RET, SYSCALL, SYSENTER, SYSEXIT, SYSRET, IRET/IRETD. Как видно, эти инструкции относятся к механизмам вызова функций и выхода из них, а также к вызовам системных сервисов и выходу из них, вызову прерываний и выходу из них.


Рис. Часть псевдокода инструкции вызова функции call. Видно, что в случае активности CET, адрес возврата сохраняется на теневом стеке.


Рис. Часть псевдокода инструкции выхода из функции ret. Видно, что в случае несовпадения адресов на стеке потока и теневом стеке, генерируется исключение.


Рис. Элементы таблиц страниц Extended Page Table (EPT), в которых страница теневого стека помечена 59-м битом SSS. Используется для идентификации страниц теневого стека на уровне таблиц страниц.

Напомним, что специфические функции борьбы с ROP-эксплойтами содержаться в бесплатном инструменте EMET. Для этого используются такие настройки как Caller Check, SimExecFlow, MemProt, и StackPivot. Первые две позволяют EMET контролировать поток выполнения и вызова функций API Windows, а также проверить легитимность кода вызывающей стороны. Функция MemProt запрещает потоку модифицировать атрибуты защиты страницы стека, а StackPivot распознает ситуации модификации регистра esp методом stack pivoting.
Поделиться с друзьями
-->

Комментарии (21)


  1. DrZlodberg
    10.06.2016 17:57

    В случае своей активности, CET будет реагировать на следующие инструкции микропроцессора, которые изменяют поток выполнения кода: CALL, INT n/INTO/INT3, JMP, RET, SYSCALL, SYSENTER, SYSEXIT, SYSRET, IRET/IRETD.

    А при чём тут JMP? Он же не изменяет стек.


    1. a553
      10.06.2016 18:26

      Имеется ввиду JMP r/m. Цель такой инструкции должна начинаться с ENDBRANCH.


  1. a553
    10.06.2016 18:36
    +2

    В статье только половина информации, нет ничего про Endbranch. Лучше почитать оригинальный документ.

    Вот ещё интересное мнение.


  1. Wesha
    11.06.2016 00:24

    Через всего каких-то 20 лет после того, как я сказал «если мы хотим безопасности, стек данных и стек адресов возврата должны стать двумя отдельными стеками», до ведущих производителей наконец-то дошло…


    1. BiTHacK
      11.06.2016 00:43
      +1

      Они видимо ждали, пока их поисковики не проиндексируют Вашу мысль. Мои поисковики её до сих пор не проиндексировали.


      1. Wesha
        11.06.2016 00:48

        AltaVista проиндексировала, но за это время умерла. Не дождалась, бедняжка…


    1. beeruser
      11.06.2016 01:48

      >> до ведущих производителей наконец-то дошло

      Merced был анонсирован в 1997

      https://blogs.msdn.microsoft.com/oldnewthing/20050421-28/?p=35833

      Last year I alluded to the fact that the Itanium processor has two stacks.

      As already noted, one consequence of this dual-stack model is that a stack buffer overflow will not corrupt the return address, because the return address is not kept on «the stack»;


    1. interprise
      11.06.2016 11:48

      ну так, это вообще то накладные расходы, это раз. обратная совместимость это два.


    1. FForth
      13.06.2016 12:26

      В Форт (Forth) языке и процессорах (MISC архитектура) этому принципу уже много больше 40лет…


  1. Mingun
    11.06.2016 10:05

    Рис. Элементы таблиц страниц Extended Page Table (EPT), в которых страница теневого стека помечена 59-м битом SSS. Используется для идентификации страниц теневого стека на уровне таблиц страниц.


    Мне кажется, или на рисунке таки выделен 60-й бит?


  1. metopa
    11.06.2016 11:49

    А как будут обстоять дела с программами, в которых ROP зашит в логику? Я понимаю, что это крайне редкое явление, но такое вполне может использоваться в ручных оптимизациях «горячих» участков кода.


    1. qw1
      11.06.2016 16:07

      Я думаю, как и DEP. В заголовке исполняемого файла Windows (Portable Executable) есть флаг — включить DEP. У старых бинарников он выключен, а новые бинарники будут компилироваться со включенным флагом. При желании, разработчик модуля сможеть опцией линкера выключить флаг. Но обычно так делать не будут, а защита начнёт постепенно работать.


  1. j123123
    11.06.2016 11:49

    А что насчет Return-oriented Programming without Returns cseweb.ucsd.edu/~hovav/dist/noret.pdf? И как насчет setjmp/longjmp, будет ли это вообще работать при таком подходе? Придется вручную по-честному раскручивать стек вызовов вместо того, чтобы мгновенно перепрыгнуть?


  1. vstrange
    11.06.2016 11:49
    +3

    Есть шанс, что эта концепция сделает нерабочей большинство программ с защитой от взлома и реверс-инжиниринга.


    1. interprise
      11.06.2016 13:11

      именно для этого генерируется исключения, чтобы можно было сделать настройку ос, для каких приложений включать эту защиту


      1. Sergey6661313
        11.06.2016 14:03
        +2

        то есть во всех эксплоитах страны…


  1. kmeaw
    11.06.2016 15:35

    Ещё немного (ведь уже больше 45 лет прошло), и Форт захватит десктопы.


    1. qw1
      11.06.2016 16:11

      Не надо путать, у форта стеки независимые, а здесь второй является контрольной копией главного, на случай порчи.


      1. a553
        11.06.2016 16:24
        +1

        Ну это не требование, а метод обеспечения обратной совместимости.


      1. kmeaw
        11.06.2016 16:42

        Именно поэтому не «уже», а «ещё немного».


  1. LifeKILLED
    12.06.2016 13:44
    +1

    Ох, чувствую, с этой новой защитой в процессоре у кого-то с треском костыли отвалятся.