Meltdown (уразливість)

Логотип, створений для позначення цієї вразливості

Meltdown — уразливість типу атаки сторонніми каналами в сучасних мікропроцесорах виробництва компанії Intel, яка дозволяє несанкційований доступ до захищеної віртуальної пам'яті[1]. У мікропроцесорах виробництва компанії AMD цю вразливість виявити не вдалось[2][3][4][5][6]. Проте варіант цієї вразливості було знайдено в деяких мікропроцесорах архітектури ARM сімейства Cortex[7].

Уразливість Meltdown отримала код CVE-2017-5754 [Архівовано 5 січня 2018 у Wayback Machine.].

Була незалежно відкрита командами дослідників з Google Project Zero, Cyberus Technology, та Ґрацького технологічного університету (Австрія)[8]. Широкому загалу була відкрита разом із пов'язаною (але дещо відмінною) уразливістю Spectre 3 січня 2018 року.

Значення[ред. | ред. код]

За даними дослідників ця вразливість наявна в усіх процесорах виробництва Intel, в яких реалізовано позачергове виконання інструкцій. Тобто, ця вразливість може бути в процесорах виготовлених з 1995 року (але вона відсутня в процесорах Intel Itanium та Intel Atom виготовлених до 2013 року)[8].

Ця вразливість також може бути використана у віртуальних машинах (хмарні обчислення), системах паравіртуалізації (наприклад, Xen) та контейнерах (наприклад, Docker, LXC та OpenVZ) що працюють на мікропроцесорах із цією вадою[9]. Втім, атака на повністю віртуальну систему дозволяє процесу рівня користувача зчитувати пам'ять ядра лише гостьової операційної системи, а не системи-господаря.

Мікропроцесори виробництва AMD не мають уразливості Meltdown через відмінність мікроархітектури: перевірка рівнів доступу до сторінок пам'яті відбувається іще до початку спекулятивного виконання інструкцій. Таким чином, процеси з меншим рівнем доступу не можуть отримати жодного (навіть прихованого у спекулятивному виконанні) доступу до сторінок вищого рівня[10][11].

Алгоритм реалізації[ред. | ред. код]

Уразливість Meltdown (CVE-2017-5754) та пов'язана з нею вразливість Spectre (CVE-2017-5753 та CVE-2017-5715) покладаються на вади реалізації механізмів спекулятивного виконання в сучасних мікропроцесорах.

Заради підвищення швидкодії програм сучасні мікропроцесори можуть виконувати деякі інструкції поза чергою, спираючись на певні припущення. Під час спекулятивного виконання процесор перевіряє дані припущення. Якщо вони виявляються вірними, то виконання продовжується далі. Якщо ж вони виявляються хибними, то процес виконання зупиняється й відбувається повернення до вірної послідовності команд. Однак, у деяких випадках спекулятивне виконання може мати побічні ефекти, які не усуваються під час повернення до нормальної послідовності команд, що може призводити до витоку даних (так звані сторонні канали інформації)[12].

Загальна схема основної частини алгоритму реалізації уразливості має такий вигляд (у псевдокоді):[13]

 01  $A = expr();  02  якщо ($A дорівнює 1)  03  {  04      $B = зчитати_пам'ять(адреса);  05      $C = зчитати_пам'ять($B);  06  } 

Тобто, програма виконує певну дію (обчислює $A) та залежно від отриманого значення робить умовний перехід. Далі програма виконує два зчитування пам'яті (рядки 04 та 05) та запам'ятовує отриманий результат у змінній $C (рядок 05). Першим кроком програма зчитує значення, що зберігається за деякою адресою (вказівник «адреса») і запам'ятовує в змінній $B. Другим кроком вона зчитує значення, що зберігається за щойно обчисленою адресою (значення змінної $B, рядок 05).

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

Однак, мікропроцесори зі спекулятивним виконанням інструкцій заради економії часу виконують інструкції поза чергою. Виконання інструкції розподілене на етапи, останнім з яких є завершення (англ. resolution). У випадку виявленої уразливості було з'ясовано, що побачивши подібну послідовність інструкцій, мікропроцесор може розпочати виконання наступних інструкцій до завершення виконання першого рядка.

Тобто, опинившись на рядку 01 процесор почне у фоновому режимі зчитування пам'яті на рядках 04 та 05 (тим більше, що зчитування пам'яті відбирає багато часу і виконавши його наперед можливо виграти у швидкодії). При цьому, в кеш процесора буде зчитано сегменти пам'яті, близькі до адрес «адреса» та $B. Якщо всі адреси були доступними, то процесор завершуватиме виконання інструкцій одна за одною у вказаному порядку, хоча виконувати їх він почав наперед. Якщо ж на якомусь із рядків сталась помилка зчитування, то на етапі завершення мікропроцесор повернеться до вірного внутрішнього стану й перейде до її обробки.

Для реалізації уразливості зловмисник робить такі дії:[13]

  • спочатку вводить в оману модуль передбачення переходів тим, що кілька раз повторює описані операції з виконанням тіла умовного переходу (тобто, $A дорівнює 1, а використана адреса не спричиняє помилки);
  • потім очищує кеш процесора;
  • далі змінює значення вказівника «адреса», аби він вів до захищеної області пам'яті (наприклад, ядра) і виконує програму знову;
  • мікропроцесор спекулятивно виконує інструкції в рядках 04 та 05, а коли дійде черга до їхнього завершення виявить помилку в рядку 04 та передасть управління в обробник помилок. Однак, мікропроцесор завантажить блок пам'яті, який перебуває за адресою $B, у кеш мікропроцесора. Оскільки перед тим кеш було очищено, то тепер звернення до пам'яті за адресою $B триватимуть менше часу, ніж до інших ділянок пам'яті;
  • проте зловмисник ще не знає цієї адреси. Щоб визначити її, він послідовно звертається до сторінок пам'яті та вимірює час звертання за високоточними таймерами;
  • звертання до блоку пам'яті, який завантажено в кеш, буде найшвидшим, і так зловмисник визначає цю адресу;
  • таким чином зловмисник дізнається значення $B, яке зберігалось у комірці захищеної пам'яті за вказівником «адреса». Іншими словами, виконавши цю послідовність дій зловмисник через сторонній канал дізнався вміст одного байта із захищеної пам'яті.

Аби зчитати певний масив даних із захищеної області пам'яті зловмисник повторює перелічені вище кроки необхідну кількість раз.

Наведений опис досить високого рівня. Конкретні програмні реалізації дбають про коректну роботу з кешем, з обробкою помилок доступу до пам'яті, та обчисленням вказівників із урахуванням особливостей архітектури мікропроцесора і його кешу.

Захист[ред. | ред. код]

Докладніше: KPTI

Операційні системи використовують таблиці сторінок (віртуальної пам'яті) для пошуку адрес в просторі процесу або ядра та фізичної пам'яті. Зазвичай доступна процесу пам'ять поділена на дві частини: нижня частина, з окремою таблицею сторінок на кожен процес, належить самому процесу. Верхня частина належить ядру операційної системи з єдиною таблицею для всіх процесів. Оскільки мікропроцесор має спеціальний кеш для таблиць сторінок, то такий підхід підвищує швидкодію, а також спрощує взаємодію між процесом та ядром[11].

Захист від уразливості Meltdown полягає у суворішому поділі адресного простору. Запропоновані латки роблять так, що коли виконується код користувача то таблиця сторінок простору ядра порожня. Таким чином програми втрачають можливість спекулятивно звертатись до даних в просторі ядра[11].

На відміну від Spectre, для захисту від якої необхідні і латки в програмах і в мікропроцесора, захист від Meltdown реалізується латками операційних систем. Проте посилення ізоляції пам'яті ядра позначиться на швидкодії системи, оскільки системні виклики тепер забиратимуть більше часу. Саме тому існують різні оцінки падіння швидкодії, що істотно залежать від способу використання системи. Так, звичайні офісні програми, комп'ютерні ігри, або взагалі там, де основне навантаження припадає на обчислення чи очікування на дію користувача, або не зазнають відчутних змін, або ж падіння швидкодії не перевищить кількох відсотків. Натомість файлові сервери, сервери баз даних, вебсервери, та інші програми, які виконують взаємодію з ядром операційної системи (доступ до файлової системи, мережі, тощо) можуть зазнати відчутне падіння швидкодії у 12-30 %[11].

На початку 2018 року було випущено латки для популярних операційних систем та ядра Linux, які здійснювали ізоляцію таблиці сторінок пам'яті ядра (англ. Kernel page-table isolation, KPTI; раніше відома як KAISER).

Розробники веббраузерів Mozilla, Chromium та Microsoft Edge підтвердили, що цю вразливість можливо реалізувати скриптами JavaScript та WebAssembly, завантаженими з інтернету. У наступних версіях цих браузерів буде вжито низку заходів для посилення захисту. Зокрема, буде обмежено доступ до високоточних таймерів, посилено ізоляцію даних, тощо[14][15][16].

Подальші дослідження[ред. | ред. код]

Transient Execution of Non-Canonical Accesses[ред. | ред. код]

Наприкінці серпня 2021 року група дослідників з технічного університету Дрездена оприлюднили доповідь про виявлений ними варіант уразливості типу Meltdown у мікропроцесорах архітектури AMD Ryzen та Epyc[17].

Даний варіант отримав позначення CVE-2020-12965 та назву англ. Transient Execution of Non-Canonical Accesses[17][18].

Відтворити уразливість значно складніше за оригінальну Meltdown та вона надає менше можливостей для зловмисника[17].

Примітки[ред. | ред. код]

  1. A Critical Intel Flaw Breaks Basic Security for Most Computers. Wired. 3 січня 2018. Архів оригіналу за 3 січня 2018. Процитовано 4 січня 2018.
  2. Metz, Cade; Perlroth, Nicole (2018). Researchers Discover Two Major Flaws in the World’s Computers. The New York Times (амер.). ISSN 0362-4331. Архів оригіналу за 3 січня 2018. Процитовано 3 січня 2018.
  3. Intel’s processors have a security bug and the fix could slow down PCs. The Verge. Архів оригіналу за 3 січня 2018. Процитовано 3 січня 2018.
  4. Linux Gaming Performance Doesn't Appear Affected By The x86 PTI Work - Phoronix. www.phoronix.com (англ.). Архів оригіналу за 20 лютого 2021. Процитовано 3 січня 2018.
  5. Gleixner, Thomas (3 січня 2018). x86/cpu, x86/pti: Do not enable PTI on AMD processors. Архів оригіналу за 28 червня 2020. Процитовано 4 січня 2018.
  6. Lendacky, Tom. [tip:x86/pti] x86/cpu, x86/pti: Do not enable PTI on AMD processors. lkml.org. Архів оригіналу за 3 серпня 2020. Процитовано 3 січня 2018.
  7. Vulnerability of Speculative Processors to Cache Timing Side-Channel Mechanism. Arm Processor Security Update. 03/Jan/2018. Архів оригіналу за 4 квітня 2018. Процитовано 5 січня 2018.
  8. а б Meltdown and Spectre: Which systems are affected by Meltdown?. meltdownattack.com (англ.). Архів оригіналу за 3 січня 2018. Процитовано 3 січня 2018.
  9. Архівована копія. Архів оригіналу за 4 січня 2018. Процитовано 4 січня 2018.{{cite web}}: Обслуговування CS1: Сторінки з текстом «archived copy» як значення параметру title (посилання)
  10. Mark Papermaster (11 січня 2018). An Update on AMD Processor Security. AMD. Архів оригіналу за 17 березня 2018. Процитовано 15 січня 2018.
  11. а б в г PETER BRIGHT (11 січня 2018). Here’s how, and why, the Spectre and Meltdown patches will hurt performance. Ars Technica. Архів оригіналу за 12 січня 2018. Процитовано 12 січня 2018.
  12. Matt Linton, Pat Parseghian (3 січня 2018). Today's CPU vulnerability: what you need to know. Google Security Blog. Архів оригіналу за 15 березня 2018. Процитовано 4 січня 2018.
  13. а б Matt Tait (4 січня 2018). Time-travelling exploits with Meltdown. Medium. Архів оригіналу за 12 січня 2018. Процитовано 11 січня 2018.
  14. Luke Wagner (3 січня 2018). Mitigations landing for new class of timing attack. Mozilla Security Blog. Архів оригіналу за 4 січня 2018. Процитовано 4 січня 2018.
  15. Actions Required to Mitigate Speculative Side-Channel Attack Techniques. The Chromium Projects. Архів оригіналу за 4 січня 2018. Процитовано 4 січня 2018.
  16. Mitigating speculative execution side-channel attacks in Microsoft Edge and Internet Explorer. Windows Blogs. 3 січня 2018. Архів оригіналу за 4 січня 2018. Процитовано 4 січня 2018.
  17. а б в Mark Mantel (31 серпня 2021). CPU-Sicherheitslücke: AMD Ryzen und Epyc per Seitenkanal verwundbar. Heise security. Архів оригіналу за 31 серпня 2021. Процитовано 31 серпня 2021.
  18. Saidgani Musaev, Christof Fetzer. Transient Execution of Non-Canonical Accesses (PDF). arXiv. Архів оригіналу (PDF) за 31 серпня 2021. Процитовано 31 серпня 2021.

Див. також[ред. | ред. код]

Посилання[ред. | ред. код]