Intel собирается бороться с эксплойтами на уровне микропроцессора

    Компания 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.
    ESET NOD32 99,35
    Компания
    Поделиться публикацией
    Комментарии 21
    • 0
      В случае своей активности, CET будет реагировать на следующие инструкции микропроцессора, которые изменяют поток выполнения кода: CALL, INT n/INTO/INT3, JMP, RET, SYSCALL, SYSENTER, SYSEXIT, SYSRET, IRET/IRETD.

      А при чём тут JMP? Он же не изменяет стек.
      • 0
        Имеется ввиду JMP r/m. Цель такой инструкции должна начинаться с ENDBRANCH.
      • +2
        В статье только половина информации, нет ничего про Endbranch. Лучше почитать оригинальный документ.

        Вот ещё интересное мнение.
        • 0
          Через всего каких-то 20 лет после того, как я сказал «если мы хотим безопасности, стек данных и стек адресов возврата должны стать двумя отдельными стеками», до ведущих производителей наконец-то дошло…
          • +1
            Они видимо ждали, пока их поисковики не проиндексируют Вашу мысль. Мои поисковики её до сих пор не проиндексировали.
            • 0
              AltaVista проиндексировала, но за это время умерла. Не дождалась, бедняжка…
            • 0
              >> до ведущих производителей наконец-то дошло

              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»;
              • 0
                ну так, это вообще то накладные расходы, это раз. обратная совместимость это два.
                • 0
                  В Форт (Forth) языке и процессорах (MISC архитектура) этому принципу уже много больше 40лет…
                • 0
                  Рис. Элементы таблиц страниц Extended Page Table (EPT), в которых страница теневого стека помечена 59-м битом SSS. Используется для идентификации страниц теневого стека на уровне таблиц страниц.


                  Мне кажется, или на рисунке таки выделен 60-й бит?
                  • 0
                    А как будут обстоять дела с программами, в которых ROP зашит в логику? Я понимаю, что это крайне редкое явление, но такое вполне может использоваться в ручных оптимизациях «горячих» участков кода.
                    • 0
                      Я думаю, как и DEP. В заголовке исполняемого файла Windows (Portable Executable) есть флаг — включить DEP. У старых бинарников он выключен, а новые бинарники будут компилироваться со включенным флагом. При желании, разработчик модуля сможеть опцией линкера выключить флаг. Но обычно так делать не будут, а защита начнёт постепенно работать.
                    • 0
                      А что насчет Return-oriented Programming without Returns cseweb.ucsd.edu/~hovav/dist/noret.pdf? И как насчет setjmp/longjmp, будет ли это вообще работать при таком подходе? Придется вручную по-честному раскручивать стек вызовов вместо того, чтобы мгновенно перепрыгнуть?
                      • +3
                        Есть шанс, что эта концепция сделает нерабочей большинство программ с защитой от взлома и реверс-инжиниринга.
                        • 0
                          именно для этого генерируется исключения, чтобы можно было сделать настройку ос, для каких приложений включать эту защиту
                          • +2
                            то есть во всех эксплоитах страны…
                        • 0
                          Ещё немного (ведь уже больше 45 лет прошло), и Форт захватит десктопы.
                          • 0
                            Не надо путать, у форта стеки независимые, а здесь второй является контрольной копией главного, на случай порчи.
                            • +1
                              Ну это не требование, а метод обеспечения обратной совместимости.
                              • 0
                                Именно поэтому не «уже», а «ещё немного».
                            • +1
                              Ох, чувствую, с этой новой защитой в процессоре у кого-то с треском костыли отвалятся.

                              Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                              Самое читаемое