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 transfer control operations, in addition to the traditional stack used for transfer control 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 to control з'явилися 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.
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.