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.

Див. також

  • KPTI
  • Spectre (уразливість)

Посилання

  • Офіційний вебсайт створений для документації вразливостей Meltdown та Spectre [Архівовано 3 січня 2018 у Wayback Machine.]
  • Доповідь про вразливість Meltdown [Архівовано 4 січня 2018 у Wayback Machine.]
  • Матеріал Google Project Zero [Архівовано 7 січня 2018 у Wayback Machine.]
  • Проект спільноти програмістів з документації виявлених уразливостей CPU security bugs caused by speculative execution [Архівовано 9 січня 2018 у Wayback Machine.]
  • Meltdown and Spectre Critical Vulnerabilities (PDF) (Звіт) (вид. v1.0). CERT-EU. 8 січня 2018. Security Advisory 2018-001. Архів оригіналу (PDF) за 9 січня 2018. Процитовано 9 січня 2018.
  • CVE-2017-5754 [Архівовано 11 січня 2018 у Wayback Machine.] на сайті NIST


Замок Це незавершена стаття з інформаційної безпеки.
Ви можете допомогти проєкту, виправивши або дописавши її.
{{{alt}}} Це незавершена стаття про апаратне забезпечення.
Ви можете допомогти проєкту, виправивши або дописавши її.
  • п
  • о
  • р
Історичні
Орієнтовані на ДДК (4-біт)
4004 • 4040
До x86 (8-біт)
8008 • 8080 • 8085
x86 (16 біт)
8086 • 8088 • 80186 • 80188 • 80286
x87 (зовнішні математичні
співпроцесори)
8/16-біт шина даних 8087; 16-біт шина даних 80187 80287 80387SX; 32-біт шина даних 80387DX 80487
x86/IA32 (32 біт)
80386 • 80486 • Pentium (Pro • II • III • 4 • M • Dual-Core) • Celeron (D • M) • Centrino • Core (Solo • Duo) • Xeon (PII • PIII • P4 • Core) • Quark
x86-64/EM64T (64 біт)
Pentium 4 (деякі) (D • EE • Dual-Core) • Celeron (D • Dual-Core • Intel Atom (SoC • CE) • Core (2 • Nehalem • Sandy Bridge • Ivy Bridge • Haswell • Broadwell • Skylake • Kaby Lake • Coffee Lake • Coffee Lake Refresh) • Xeon (Nehalem • Sandy Bridge • Ivy Bridge • Haswell • Broadwell • Skylake)
Інші
8048 • 8051 • MCS-96
Сучасні
Celeron • Pentium • Atom • Xeon • Core (Ice Lake • Tiger Lake • Alder Lake)
Списки

Роз'єми процесорів (сокети) • Чипсети • Мікроархітектури • Процесори • Кодові імена

Atom • Celeron • Core • Core 2 • Core i7 • Itanium • Pentium • Pentium Pro • Pentium II • Pentium III • Pentium 4 • Pentium D • Pentium Dual-Core • Pentium M • Xeon
Мікроархітектури
x86/IA32 (32 біт)
P5 • P6 • NetBurst • Core • Nehalem • Westmere • Sandy Bridge • Ivy Bridge • Haswell • Broadwell • Skylake • Cannon Lake • Sunny Cove • Cypress Cove • Willow Cove • Golden Cove
x86-64/EM64T (64 біт)
Core • Nehalem • Westmere • Sandy Bridge • Ivy Bridge • Haswell • Broadwell • Skylake • Kaby Lake • Coffee Lake • Goldmont
x86 ULV
Bonnell • Silvermont • Airmont • Goldmont • Goldmont Plus • Tremont • Gracemont
  • п
  • о
  • р
Архітектура
Архітектура системи команд
Розрядність
Виконання інструкцій
Паралельні обчислення
Багатонитевість
Таксономія Флінна
Типи
Складові
Управління живленням[en]
  • APM
  • ACPI
  • Динамічна зміна частоти[en]
  • Динамічна зміна напруги[en]
  • Clock gating

П:  Портал «Програмування» П:  Портал «Інформаційні технології»