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

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

1011ca4cbd0f494b9c54363d17770275.jpeg

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).

d07caafb2b1b4ae0a7aca03a48177817.png
Рис. Формат кода ошибки известного исключения 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. Как видно, эти инструкции относятся к механизмам вызова функций и выхода из них, а также к вызовам системных сервисов и выходу из них, вызову прерываний и выходу из них.

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

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

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

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

© Habrahabr.ru