Retbleed – нова атака на механізм спекулятивного виконання CPU Intel та AMD

Група дослідників із Швейцарської вищої технічної школи Цюріха виявила новий варіант атаки на механізм спекулятивного виконання непрямих переходів у CPU, що дозволяє витягти інформацію з пам'яті ядра або організувати атаку на хост-систему з віртуальних машин. Вразливості отримали кодове ім'я Retbleed (CVE-2022-29900, CVE-2022-29901) та близькі за своєю суттю до атак Spectre-v2. Відмінність зводиться до організації спекулятивного виконання довільного коду при обробці інструкції «ret» (return), яка отримує адресу для переходу зі стека, замість непрямого переходу за допомогою інструкції «jmp» із завантаженням адреси з пам'яті або регістру CPU.

Атакуючий може створити умови для невірного передбачення переходу та організувати цілеспрямований спекулятивний перехід на блок коду, який не передбачений логікою виконання програми. У кінцевому рахунку, процесор визначить, що прогноз розгалуження не виправдалося і відкотить операцію у вихідний стан, але оброблені в процесі спекулятивного виконання дані осядуть в кеші та мікроархітектурних буферах. Якщо помилково виконаний блок здійснює звернення до пам'яті, його спекулятивне виконання призведе до осідання в загальному кеші і даних, прочитаних з пам'яті.

Для визначення даних, що залишилися в кеші після спекулятивного виконання операцій, атакуючий може використовувати методи визначення залишкових даних сторонніх каналів, наприклад, аналізувати зміни часу доступу до прокешованих і не прокешованих даних. Для цілеспрямованого вилучення інформації з областей іншому рівні привілеїв (наприклад, з пам'яті ядра) використовуються «гаджети» — присутні у ядрі послідовності команд, придатні спекулятивного читання даних із пам'яті залежно від зовнішніх умов, які може впливати атакуючий.

Для захисту від класичних атак класу Spectre, в яких використовуються інструкції умовного та непрямого переходу, у більшості операційних систем застосовується техніка «retpoline», заснована на заміні операцій непрямого переходу на інструкцію «ret», для якої в процесорах застосовується окремий блок передбачення стану стека, що не використовує блок передбачення переходів. При впровадженні retpoline у ​​2018 році вважалося, що схожі на Spectre маніпуляції з адресами не застосовуються на практиці для спекулятивного переходу за допомогою інструкції «ret».

Дослідники, які розробили метод атаки Retbleed, продемонстрували можливість створення мікроархітектурних умов для ініціювання спекулятивного переходу за допомогою інструкції «ret» та опублікували готовий інструментарій для виявлення в ядрі Linux придатних для експлуатації вразливості послідовностей інструкцій (гаджетів), в яких виявляються подібні умови.

У ході дослідження підготовлений робочий експлоїт, що дозволяє на системах з CPU Intel з непривілейованого процесу в просторі користувача витягувати довільні дані з пам'яті ядра зі швидкістю 219 байт на секунду та точністю 98%. На процесорах AMD ефективність роботи експлоїту набагато вища – швидкість витоку становить 3.9 КБ в секунду. Як практичний приклад показано, як за допомогою запропонованого експлоїту визначити вміст файлу /etc/shadow. На системах із CPU Intel атака для визначення хеша пароля користувача root була проведена за 28 хвилин, а на системах із CPU AMD – за 6 хвилин.

Можливість здійснення атаки підтверджена для 6-8 поколінь процесорів Intel, які випускалися до 3 кварталу 2019 року (включаючи Skylake), та процесорів AMD на базі мікроархітектур Zen 1, Zen 1+ та Zen 2, які випускалися до другого кварталу 2021 року. У нових моделях процесорів, таких як AMD Zen3 і Intel Alder Lake, а також в процесорах ARM, проблема блокується наявними механізмами захисту. Наприклад, застосування інструкцій IBRS (Indirect Branch Restricted Speculation) допомагає захиститись від атаки.

Для ядра Linux і гепервізора Xen підготовлено набір змін, які на старих CPU блокують проблему програмним шляхом. Запропонований для ядра Linux патч змінює 68 файлів, додає 1783 рядків та видаляє 387 рядків. На жаль, захист призводить до суттєвих накладних витрат — у проведених текстах на процесорах AMD та Intel зниження продуктивності оцінюється від 14% до 39%. Більш переважним є застосування захисту на основі інструкцій IBRS, доступних у нових поколіннях CPU Intel та підтримуваних починаючи з ядра Linux 4.19.

На процесорах Intel підстановка адреси для спекулятивного непрямого переходу здійснюється завдяки особливості, що проявляється при переповненні через нижню межу (underflow) у буфері передбачення вмісту стека (Return Stack Buffer). При виникненні подібних умов для інструкції «ret» починає застосовуватися логіка вибору адреси, аналогічна до тієї, що використовується при звичайних непрямих переходах. У ядрі Linux знайдено більше тисячі місць, які створюють умови ініціювання подібного зворотного переповнення та доступні через системні виклики.

На процесорах AMD спекулятивне виконання інструкції «ret» здійснюється без прив'язки до специфічного для стека буфера (Return Address Stack) і блок передбачення переходів розглядає інструкцію «ret» не як повернення управління, а як непрямий перехід, і, відповідно, використовує дані для непрямих переходів. За подібних умов фактично будь-яка операція «ret», яка може бути досягнута через системний виклик, може використовуватися для експлуатації.

Додатково, в CPU AMD також виявлено ще одну проблему (CVE-2022-23825, Branch Type Confusion), пов'язану із здійсненням фіктивних переходів - умови для передбачення переходу можуть виникати навіть без необхідних інструкцій розгалуження, що дозволяє впливати на буфер передбачення переходів без інструкції ret». Дана особливість істотно ускладнює реалізацію захисту та вимагає більш активного очищення буфера передбачанні переходів. Очікується, що додавання повного захисту до ядра призведе до збільшення накладних витрат на 209%.

Джерело: opennet.ru

Додати коментар або відгук