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

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до навігації Перейти до пошуку
Логотип, створений для позначення даної вразливості

Spectre — уразливість у модулях передбачення переходів сучасних мікропроцесорів з технологією спекулятивного виконання команд,[1] яка дозволяє зловмисникам отримати несанкційований доступ до віртуальної пам'яті інших процесів.[2][3][4] Відомо щонайменше два методи реалізації цієї вразливості, які отримали коди CVE-2017-5753 та CVE-2017-5715.

Уразливість Spectre була виявлена та задокументована декількома групами дослідників, зокрема: Яном Хорном з Google Project Zero та Полом Кохером у співпраці з низкою дослідників з різних установ.

Згодом було встановлено, що розкриті спочатку два способи реалізації цієї уразливості є лише окремими представниками цілого сімейства подібних атак із використанням витоків інформації через сторонні канали[5].

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

Станом на 2018 рік уразливості сімейства Spectre наявні майже в усіх сучасних мікропроцесорах, зокрема, у десктопах, ноутбуках, смартфонах, тощо. Були створені та успішно здійснені демонстраційні атаки на мікропроцесорах виробництва Intel, AMD, та сімейства ARM.[6][7]

Уразливість також була виявлена і підтверджена в процесорах IBM Power: Power7+, Power8 та Power9, Fujitsu SPARC64 XII та SPARC64 X+[8]. Існують відомості, що уразливість вдалось відтворити в мікропроцесорах Power6, хоча в них конвеєр виконує команди за чергою, але спекулятивно[9].

Уразливість була виявлена в мікропроцесорах MIPS P5600 та P6600[9].

Уразливість мікропроцесорів сімейства ARM залежить від конкретної версії архітектури та реалізації ядра конкретним виробником[8]. Відомо та підтверджено наявність уразливості в мікропроцесорах з ядрами: Cortex-R7, Cortex-R8, Cortex-A8, Cortex-A9, Cortex-A15, Cortex-A17, Cortex-A57, Cortex-A72, Cortex-A73 та ARM Cortex-A75[10]. В той же час деякі смартфони і комп'ютери з простішими (часто дешевшими) варіантами, в яких відсутня суперскалярність, не мають цієї вразливості. Наприклад, всі варіанти Raspberry Pi не уражені ані Meltdown, ані Spectre[11].

Станом на початок 2018 року вдалось створити атаки із використанням уразливості Spectre між процесами рівня користувача[8].

Реалізація вразливості Spectre набагато складніша за Meltdown, але й захиститись від неї важче.

Крім того, Spectre може становити більшу загрозу хмарним обчисленням, оскільки, на відміну від Meltdown, може спонукати гіпервізор передавати дані гостьовій системі[12].

Однак найбільшу загрозу для звичайних користувачів становить варіант CVE-2017-5753 (доступ за межі масиву), який може бути реалізований скриптами JavaScript та призводити до викрадення даних із веб-браузера. Проте і захист від нього найпростіший, без помітної втрати швидкодії і вимагає лише оновлення веб-браузера[13].

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

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

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

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

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

Уразливість Spectre основана на тому, аби примусити процесор спекулятивно виконати такі послідовності інструкцій, які було би неможливо виконати за коректної роботи програми. Дослідники назвали такі інструктції проміжними (англ. transient instructions). Шляхом правильного підбору проміжних інструкцій зловмисник здатен створити виток із пам'яті жертви через сторонній канал[15].

Уразливість Spectre має два можливі алгоритми реалізації:[13]

  • шляхом введення в оману модуля передбачення переходів, аби той спекулятивно виконав захищений код жертви зі стороннім каналом. Цей варіант діє між процесами та навіть між гіперпотоками в середині одного мікропроцесора й може бути використаний для атаки проти ядра операційної системи чи гіпервізора віртуальної машини. Дана уразливість має код CVE-2017-5715.
  • введення в оману мікропроцесора для спекулятивного завантаження даних за межами масиву. Цей варіант діє в межах одного процесу. Дана уразливість має код CVE-2017-5753.

Читання за межами масиву (CVE-2017-5753)[ред. | ред. код]

Дана уразливість є спрощеним варіантом Meltdown (або навпаки, Meltdown є розвиненим варіантом даної уразливості).

Уразливість CVE-2017-5753 основана на введенні модуля передбачення переходів у оману аби примусити його спекулятивно зчитати дані за межами масиву. В результаті, зловмисник здатен зчитати всі дані в межах одного процесу (на відміну від Meltdown без виходу у зони з вищим рівнем захисту). Дослідники назвали цей варіант уразливості англ. Exploiting Conditional Branch Misprediction — атака із використанням невірного передбачення умовного переходу.

Для успішної реалізації даної уразливості зловмисник має примусити жертву виконати спеціальну послідовність інструкцій в просторі атакованого процесу. Це можуть бути або вже наявні в коді атакованого процесу інструкції, або ж атакований процес може виконувати інструкції зловмисника у JiT-компіляторі[16].

Дослідникам вдалось показати приклади успішної атаки із використанням даної уразливості проти ядра Linux через систему eBPF,[16] а також на сучасні веб-браузери які виконують сценарії JavaScript у рушіях з JiT-компіляцією. Крім того, була представлена проста програма-демонстратор написана мовою C, яка зчитує «приховані» дані в межах власного процесу[15].

Атака із використанням цієї уразливості була показана на основі функції, сторонній канал в якій був створений кодом:

if (x < array1_size)
  y = array2[array1[x] * 256];

Умовний перехід гарантує, що звернення до array1 буде завжди коректним й не виходитиме за межі масиву. Тим не менш, при спекулятивному виконанні команд мікропроцесор може виконати ці інструкції в конвеєрі, залишивши сторонній канал у вигляді кешованих фрагментів масиву array2. В цьому прикладі значення змінної x визначає адресу в пам'яті, яку прагне зчитати зловмисник (зі зсувом від адреси масиву array1). Значення комірки пам'яті за адресою array1 + x буде відновлено на основі інформації про кешований фрагмент масиву array2[15].

Маніпуляція модулем передбачення переходів (CVE-2017-5715)[ред. | ред. код]

Дослідниками також був представлена інша уразливість, так звана англ. Branch Target Injection (BTI) або англ. Poisoning Indirect Branches — маніпуляція непрямими переходами. Уразливість знаходиться в модулі передбачення переходів і може бути використана для атаки між процесами різного рівня[15].

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

Інші варіанти[ред. | ред. код]

Група дослідників з Прінстонського університету і компанії NVIDIA в лютому 2018 відкрили нові способи атак з використанням цих вразливостей. Вони отримали назви MeltdownPrime і SpectrePrime відповідно, від уже відомих методів відрізняються іншим способом відтворення інформації з процесорного кешу[17][18].

Обидві атаки побудовані на роботі з двома ядрами багатоядерного процесора і використовують особливості роботи протоколу узгодження вмісту кеша для різних ядер CPU (Invalidation-Based Coherence Protocol). Якщо в уже відомих атаках сторонніми каналами служило відновлення вмісту кеша на основі техніки FLUSH + RELOAD, то в нових застосований метод «Prime and Probe»[17].

Однак поточні програмні латки, що випускаються виробниками, забезпечують захист і від нових атак[17].

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

Ризики[ред. | ред. код]

Оскільки Spectre являє собою ціле сімейство вразливостей, єдиного способу захисту, імовірно, знайдено не буде. Проте, було розроблено механізми захисту (латки операційних систем, веб-браузерів, оновлення мікрокоду мікропроцесорів, тощо) від відомих конкретних атак в яких використано цю вразливість.

На відміну від Meltdown, уразливості сімейства Spectre потребують не лише латок програмного забезпечення, але й мікропроцесорів[13].

Розробники операційних систем, прикладного програмного забезпечення випустили оновлення своїх продуктів, що мають захистити або зменшити ризик успішної атаки з використанням цих уразливостей. Деякі виробники мікропроцесорів також випустили оновлені версії мікрокоду, покликані або захистити від відомих варіантів реалізації, або ж зменшити ризик успішної атаки[13].

Для успішного використання уразливості зловмисник має виконати свій код на комп'ютері жертви. Таким чином найбільшу небезпеку уразливості Spectre становлять для постачальників хмарних обчислень, коли на одному фізичному комп'ютері можуть водночас працювати декілька віртуальних машин різних клієнтів. Звичайним користувачам найбільшу небезпеку може представляти варіант CVE-2017-5753 (доступ за межі масиву), який може бути реалізований скриптами JavaScript у веб-браузері[13].

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

Проте, як виявилось, від варіанту CVE-2017-5753 найпростіше захиститись із майже непомітними наслідками для швидкодії. Відповідні оновлення для своїх веб браузерів уже підготували розробники Mozilla Firefox та WebKit (рушій, яким користується Chromium, сучасні версії Opera, тощо)[13].

На початку лютого 2018 року компанія AV-Test повідомила, що нею зафіксовано 140 різних вірусів та зразків шкідливого програмного забезпечення, в якому було використано вразливості Spectre та Meltdown. Проте, досі не було зрозуміло, як широко поширені дані зразки в реальному світі[19].

Латки програмного забезпечення[ред. | ред. код]

Розробники сімейства компіляторів GCC додали механізм Retpoline в релізи версії 8 та новіше. Через велике значення цих латок їх було також застосовано і до релізу версії 7.3[20]

Розробники компанії Microsoft запропонували нову версію компілятора MSVC з новою опцією /Qspectre, яка додає в компільовані програми захист від уразливості Spectre варіант «Читання за межами масиву» (англ. Bounds Check Bypass, CVE-2017-5753). Якщо дана опція увімкнута, компілятор під час компіляції шукає потенційно вразливі фрагменти коду та додає інструкцію, що виконує функцію бар'єра для спекулятивного виконання команд. Для x86-сумісних мікропроцесорів (Intel та AMD) це інструкція lfence, для ARM — csdb. Таким чином, при компіляції такого коду:

if (untrusted_index < array1_length) {
    // спекулятивний доступ до елементів масиву
    unsigned char value = array1[untrusted_index];
    // використати ці спекулятивно отримані дані аби
    // змінити стан кешу процесора
    unsigned char value2 = array2[value * 64];
}

компілятор додає бар'єр спекулятивного виконання на початку тіла циклу, фактично, генеруючи код:

if (untrusted_index < array1_length) {
    // переконатись, що процесор спочатку перевірить
    // умову, і лише тоді звертатиметься за даними
    speculation_barrier();
    // ці інструкції вже не будуть виконуватись
    // спекулятивно
    unsigned char value = array1[untrusted_index];
    unsigned char value2 = array2[value * 64];
}

Недоліком такого підходу є істотне падіння швидкодії програм. Слід звернути увагу на те, що насправді захисту потребують лише ті частини коду, в яких зловмисник може задати індекс елемента в масиві. Компілятор, попри реалізовані евристичні правила, відокремити такі фрагменти не здатен, тому він може додавати захист навіть там, де він зайвий[21][22].

У червні 2018 року проект OpenBSD повідомив про рішення учасників проекту вимикати функції Hyper-threading при роботі цієї операційної системи на мікропроцесорах виробництва Intel[23].

Проте, група дослідників компанії Google дійшла висновку, що лише програмними заходами повністю захиститись від витоків інформації через сторонні канали при спекулятивному виконанні програм неможливо, а відмова від спекулятивного виконання недоцільна з точки зору ефективності роботи мікропроцесорів[5][24].

Латки процесорів[ред. | ред. код]

Невдовзі після оприлюднення інформації про уразливості розробники операційних систем і виробники мікропроцесорів почали випускати оновлення з латками. Проте у деяких випадках оновлення спричиняли іще більше проблем. Так, наприклад, оновлення мікрокоду випущені Intel спричиняли випадкові перезавантаження системи. Тому 23 січня компанія порадила відтермінувати оновлення мікрокоду для систем на мікропроцесорах сімейства Broadwell, Haswell, Coffee Lake, Kaby Lake, Skylake і Ivy Bridge. Сервери на багатьох моделях Xeon і Ivy Bridge також мали цю проблему[25].

Компанії Intel та AMD мають намір додати три нові інструкції: Branch Restricted Speculation (IBRS), Single Thread Indirect Branch Predictors (STIBP) та Indirect Branch Predictor Barrier (IBPB) до набору інструкцій своїх мікропроцесорів. Нові інструкції будуть додані шляхом завантаження оновлень мікрокоду для процесорів Intel виробництва 2013 року і новіше, а також в нових процесорах AMD. Інформація про ці інструкції оприлюднена в документі з ідентифікатором 336996-001[26][9].

Латки для нових мікропроцесорів ARM64 Qualcomm Centriq 2400 (Falkor) та Cavium ThunderX2 будуть додані в нових релізах ядра Лінукс[9].

Компанія AMD, натомість, стверджує, що реалізація атаки сімейства Spectre CVE-2017-5715 (Branch Target Injection/BTI) надзвичайно ускладнена на мікропроцесорах її виробництва. Тому компанія має великий сумнів у потребі щось виправляти. Проте, заради збереження сумісності будуть випущені латки, в яких буде додано підтримку інструкцій Indirect Branch Control[27]. Також компанія оприлюднила докладну доповідь про уразливості Spectre у її процесорах[28].

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

Spectre NG[ред. | ред. код]

Докладніше: Spectre NG

3 травня 2018 року журнал c't[de] першим оприлюднив інформацію про виявлення сімейства з восьми уразливостей в процесорах Intel, що отримали загальну назву Spectre NG (англ. New Generation — нове покоління)[29].

За повідомленням журналу, уразливостям вже виділений блок номерів у базі даних CVE, і найближчим часом (згадується дата 7 травня 2018) буде оголошено про їх назви[29]. Компанія Intel у прес-релізі не заперечила дані факти, і порекомендувала користувачам вчасно встановлювати оновлення програмного забезпечення[30].

За даними видання c't одна з уразливостей істотно спрощує атаку на основну систему з боку гостьової. Вона навіть дозволяє одній гостьовій системі атакувати іншу гостьову систему, що працює на тій же фізичній машині[29].

Spoiler[ред. | ред. код]

1 березня 2019 року групою дослідників була оприлюднена наукова доповідь про відкриту ними уразливість, названу ними SPOILER[31]. І хоча формально вона не є варіантом уразливостей сімейства Spectre, вона використовує вади в реалізації модуля таблиць пам'яті у всіх сучасних мікропроцесорах фірми Intel, починаючи з Intel Core. Дану ваду дослідникам не вдалось виявити в мікропроцесорах фірми AMD або сімейства ARM.

Дана уразливість дозволяє істотно пришвидшити атаку Rowhammer[32].

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

  1. Greenberg, Andy (January 3, 2018). A Critical Intel Flaw Breaks Basic Security for Most Computers. Wired (magazine). Процитовано January 3, 2018. 
  2. Staff (2018). Meltdown and Spectre. Graz University of Technology. Процитовано January 3, 2018. 
  3. Metz, Cade; Perlroth, Nicole (January 3, 2018). Researchers Discover Two Major Flaws in the World’s Computers. The New York Times (en-US). ISSN 0362-4331. Процитовано January 3, 2018. 
  4. Warren, Tom (January 3, 2018). Intel’s processors have a security bug and the fix could slow down PCs. The Verge. Процитовано January 3, 2018. 
  5. а б Bright, Peter (2019-02-23). Google: Software is never going to be able to fix Spectre-type bugs. Ars Technica. 
  6. Staff (2018). Meltdown and Spectre-faq-systems-spectre. Graz University of Technology (en). Процитовано January 4, 2018. 
  7. Busvine, Douglas; Nellis, Stephen (January 3, 2018). Security flaws put virtually all phones, computers at risk. Reuters. Thomson-Reuters. Процитовано January 3, 2018. 
  8. а б в Christof Windeck (2018-01-11). Spectre-Lücke: Auch Server mit IBM POWER, Fujitsu SPARC und ARMv8 betroffen. Heise online. 
  9. а б в г Christof Windeck (2018-01-29). Spectre-Lücken: auch MIPS P5600 und IBM POWER6 betroffen, Intel erklärt IBC. Heise Security. 
  10. Arm Processor Security Update. ARM Developer. ARM Ltd. January 3, 2018. Процитовано 2018-01-05. 
  11. Eben Upton (2018-01-05). Why Raspberry Pi isn’t vulnerable to Spectre or Meltdown. Raspberry Pi Blog. 
  12. Fox-Brewster, Thomas (January 3, 2018). Massive Intel Vulnerabilities Just Landed -- And Every PC User On The Planet May Need To Update. Forbes. Forbes Media LLC. Процитовано January 3, 2018. 
  13. а б в г д е ж PETER BRIGHT (2018-01-11). Here’s how, and why, the Spectre and Meltdown patches will hurt performance. Ars Technica. 
  14. Matt Linton, Pat Parseghian (January 3, 2018). Today's CPU vulnerability: what you need to know. Google Security Blog. 
  15. а б в г д е ж Paul Kocher, Daniel Genkin, Daniel Gruss, Werner Haas, Mike Hamburg, Moritz Lipp, Stefan Mangard, Thomas Prescher, Michael Schwarz, Yuval Yarom. Spectre Attacks: Exploiting Speculative Execution. 
  16. а б Jann Horn (2018-01-03). Reading privileged memory with a side-channel. Project Zero. 
  17. а б в Обнаружены новые способы атак MeltdownPrime и SpectrePrime, но переживать за безопасность не стоит. ITC.ua. 2018-02-19. 
  18. Caroline Trippel, Daniel Lustig, Margaret Martonosi (2018-02-11). MeltdownPrime and SpectrePrime: Automatically-Synthesized Attacks Exploiting Invalidation-Based Coherence Protocols. Cornell University Library. arXiv:1802.03802. 
  19. Fabian A. Scherschel (2018-02-02). Meltdown & Spectre: Immer mehr Malware, echte Angriffe unklar. Heise online. 
  20. Retpoline Support Backport Lands In GCC 7 Written by Michael Larabel in GNU. Phoronix. 2018-01-16. 
  21. Peter Bright (2018-02-14). Microsoft’s compiler-level Spectre fix shows how hard this problem will be to solve. Ars Technica. 
  22. Andrew Pardoe (2018-02-15). Spectre mitigations in MSVC. Visual C++ Team Blog. 
  23. Catalin Cimpanu (2018-06-19). OpenBSD Disables Intel CPU Hyper-Threading Due to Security Concerns. Bleeping Computer. 
  24. Mcilroy, Ross; Sevcik, Jaroslav; Tebbi, Tobias; Titzer, Ben L.; Verwaest, Toon (2019-02-13). Spectre is here to stay: An analysis of side-channels and speculative execution. arXiv:1902.05178 [cs]. 
  25. Владимир Скрипин (2018-01-23). Intel выяснила причину более частых перезагрузок ПК и теперь рекомендует повременить с установкой заплаток против Spectre и Meltdown. ITC.ua. 
  26. Speculative Execution Side Channel Mitigations. 1.0. Intel. January 2018. 
  27. Christof Windeck (2018-01-26). Spectre-Lücke: AMD-Prozessoren unter Windows bislang ungeschützt. Heise security. 
  28. Software Techniques for managing Speculation on AMD Processors. AMD. Архів оригіналу за 1 лютий 2018. Процитовано 5 лютий 2018. 
  29. а б в Exclusive: Spectre-NG - Multiple new Intel CPU flaws revealed, several serious. c't (Heise online). (англ.)
  30. Spectre-NG: Intel-Prozessoren von neuen hochriskanten Sicherheitslücken betroffen (Update). (нім.)
  31. Islam, Saad; Moghimi, Ahmad; Bruhns, Ida; Krebbel, Moritz; Gulmezoglu, Berk; Eisenbarth, Thomas; Sunar, Berk (2019-03-01). SPOILER: Speculative Load Hazards Boost Rowhammer and Cache Attacks. 
  32. SPOILER alert, literally: Intel CPUs afflicted with simple data-spewing spec-exec vulnerability (en). The Register. 2019-03-05. 

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

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