Spectre (уразливість)Spectre — уразливість у модулях передбачення переходів сучасних мікропроцесорів з технологією спекулятивного виконання команд,[1] яка дозволяє зловмисникам отримати несанкційований доступ до віртуальної пам'яті інших процесів.[2][3][4] Відомо щонайменше два методи реалізації цієї вразливості, які отримали коди CVE-2017-5753 [Архівовано 11 січня 2018 у Wayback Machine.] та CVE-2017-5715 [Архівовано 11 січня 2018 у Wayback Machine.]. Уразливість 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]. В квітні 2021 року компанія AMD повідомила, що її фахівці виявили уразливість подібну до Spectre v4 в підсистемі Predictive Store Forwarding (PSF) мікропроцесорів архітектури Zen 3. На їхню думку ця уразливість не становить небезпеки для більшості користувачів, а за бажання її можна вимкнути налаштуваннями процесора[14]. Алгоритм реалізаціїУразливість Spectre та пов'язана з нею уразливість Meltdown (CVE-2017-5754) покладаються на вади реалізації механізмів спекулятивного виконання в сучасних мікропроцесорах. Заради підвищення швидкодії програм сучасні мікропроцесори можуть виконувати деякі інструкції поза чергою, спираючись на певні припущення. Під час спекулятивного виконання процесор перевіряє припущення і якщо вони виявляються вірними, то виконання продовжується далі. Якщо ж вони виявилися хибними, то процес виконання зупиняється й відбувається повернення до вірної послідовності інструкцій. Однак, у деяких випадках спекулятивне виконання може мати сторонні ефекти, які не усуваються під час повернення до нормальної послідовності інструкцій, що може призводити до витоку даних (так звані сторонні канали інформації)[15]. Наприклад, якщо виконання програми залежить від даних у загальній пам'яті, процесор може зробити певні припущення про подальший перебіг подій і заради економії декількох сотень циклів перемістити ці дані в кеш процесора наперед. Якщо припущення були невірними, загальна швидкість виконання програми виявляється такою самою, якби процесор виконував інструкції за їхньою чергою та простоював при звертаннях до оперативної пам'яті. Проте, якщо припущення були вірними, виконання програми істотно прискорюється завдяки ефективнішому використанню ресурсів системи. Оскільки замість простоїв корисна робота процесора не припиняється[16]. З погляду інформаційної безпеки спекулятивність може призводити до некоректного виконання програми. Інженери раніше вважали що, оскільки за невірних припущень процесор автоматично повертається до коректного стану, ці помилки не становлять загрози[16]. Уразливість Spectre основана на тому, аби примусити процесор спекулятивно виконати такі послідовності інструкцій, які було би неможливо виконати за коректної роботи програми. Дослідники назвали такі інструкції перехідними (англ. transient instructions). Шляхом правильного підбору перехідних інструкцій зловмисник здатен створити виток із пам'яті жертви через сторонній канал[16]. Уразливість Spectre має два можливі алгоритми реалізації:[13]
Читання за межами масиву (CVE-2017-5753)Уразливість CVE-2017-5753 є спрощеним варіантом Meltdown (або навпаки, Meltdown є розвиненим варіантом даної уразливості). Уразливість CVE-2017-5753 основана на введенні в оману модуля передбачення переходів аби змусити його спекулятивно зчитати дані за межами масиву. У результаті, зловмисник здатен зчитати всі дані в межах одного процесу (на відміну від Meltdown без виходу у зони з вищим рівнем захисту). Дослідники назвали цей варіант уразливості англ. Exploiting Conditional Branch Misprediction — атака з використанням невірного передбачення умовного переходу. Для успішної реалізації цієї вразливості зловмисник має примусити жертву виконати спеціальну послідовність інструкцій у просторі атакованого процесу. Це можуть бути або вже наявні в коді атакованого процесу інструкції, або ж атакований процес може виконувати інструкції зловмисника у JiT-компіляторі[17]. Дослідникам вдалось показати приклади успішної атаки із використанням цієї вразливості проти ядра Linux через систему eBPF,[17] а також на сучасні веббраузери, які виконують сценарії JavaScript у рушіях з JiT-компіляцією. Крім того, була представлена проста програма-демонстратор написана мовою C, яка зчитує «приховані» дані в межах власного процесу[16]. Атака з використанням цієї вразливості була показана на основі функції, сторонній ефект у якій створено таким кодом: if (x < array1_size)
y = array2[array1[x] * 256];
Умовний перехід гарантує, що звернення до array1 буде завжди коректним й не виходитиме за межі масиву. Тим не менш, при спекулятивному виконанні команд мікропроцесор може виконати ці інструкції в конвеєрі, залишивши сторонній канал у вигляді кешованих фрагментів масиву array2. У цьому прикладі значення змінної x визначає адресу в пам'яті, яку прагне зчитати зловмисник (зі зсувом від адреси масиву array1). Значення комірки пам'яті за адресою array1 + x буде відновлено на основі інформації про кешований фрагмент масиву array2[16]. Маніпуляція модулем передбачення переходів (CVE-2017-5715)Дослідниками також був представлена інша уразливість, так звана англ. Branch Target Injection (BTI) або англ. Poisoning Indirect Branches — маніпуляція непрямими переходами. Уразливість розміщена в модулі передбачення переходів і може бути використана для атаки між процесами різного рівня[16]. На відміну від прямого, при непрямому переході адреса переходу наперед не відома, а має бути отримана з регістра, комірки пам'яті чи обчислена в якийсь інший спосіб. Якщо отримання адреси для переходу потребуватиме істотного часу, то модуль передбачення переходів може вирішити спекулятивно виконати перехід за невірною адресою. Зловмисник здатен підлаштувати модуль передбачення переходів так, що адресу переходу для спекулятивного виконання визначатиме він. Таким чином, буде спекулятивно виконано інструкції, які ніколи б не були виконані за нормальних умов. Така ситуація створює істотну вразливість, якщо спекулятивне виконання цих інструкцій залишає помітні сторонні ефекти (наприклад, варіації часу виконання залежно від параметра, який задає зловмисник)[16]. Інші варіантиГрупа дослідників з Прінстонського університету і компанії NVIDIA в лютому 2018 відкрили нові способи атак з використанням цих вразливостей. Вони отримали назви MeltdownPrime і SpectrePrime відповідно, від уже відомих методів відрізняються іншим способом відтворення інформації з процесорного кешу[18][19]. Обидві атаки побудовані на роботі з двома ядрами багатоядерного процесора і використовують особливості роботи протоколу узгодження вмісту кешу для різних ядер CPU (Invalidation-Based Coherence Protocol). Якщо в уже відомих атаках сторонніми каналами служило відновлення вмісту кешу на основі техніки FLUSH + RELOAD, то в нових застосований метод «Prime and Probe»[18]. Однак поточні програмні латки, що випускаються виробниками, забезпечують захист і від нових атак[18]. ЗахистРизикиОскільки 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. Проте, досі не було зрозуміло, як широко поширені дані зразки в реальному світі[20]. Латки програмного забезпеченняРозробники сімейства компіляторів GCC додали механізм Retpoline в релізи версії 8 та новіше. Через велике значення цих латок їх було також застосовано і до релізу версії 7.3[21] Розробники компанії 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];
}
Недоліком такого підходу є істотне падіння швидкодії програм. Слід звернути увагу на те, що насправді захисту потребують лише ті частини коду, в яких зловмисник може задати індекс елемента в масиві. Компілятор, попри реалізовані евристичні правила, відокремити такі фрагменти не здатен, тому він може додавати захист навіть там, де він зайвий[22][23]. У червні 2018 року проект OpenBSD повідомив про рішення учасників проекту вимикати функції Hyper-threading при роботі цієї операційної системи на мікропроцесорах виробництва Intel[24]. Проте, група дослідників компанії Google дійшла висновку, що лише програмними заходами повністю захиститись від витоків інформації через сторонні канали при спекулятивному виконанні програм неможливо, а відмова від спекулятивного виконання недоцільна з точки зору ефективності роботи мікропроцесорів[5][25]. Латки процесорівНевдовзі після оприлюднення інформації про уразливості розробники операційних систем і виробники мікропроцесорів почали випускати оновлення з латками. Проте у деяких випадках оновлення спричиняли іще більше проблем. Так, наприклад, оновлення мікрокоду випущені Intel спричиняли випадкові перезавантаження системи. Тому 23 січня компанія порадила відтермінувати оновлення мікрокоду для систем на мікропроцесорах сімейства Broadwell, Haswell, Coffee Lake, Kaby Lake, Skylake і Ivy Bridge. Сервери на багатьох моделях Xeon і Ivy Bridge також мали цю проблему[26]. Компанії Intel та AMD мають намір додати три нові інструкції: Branch Restricted Speculation (IBRS), Single Thread Indirect Branch Predictors (STIBP) та Indirect Branch Predictor Barrier (IBPB) до набору інструкцій своїх мікропроцесорів. Нові інструкції будуть додані шляхом завантаження оновлень мікрокоду для процесорів Intel виробництва 2013 року і новіше, а також в нових процесорах AMD. Інформація про ці інструкції оприлюднена в документі з ідентифікатором 336996-001[27][9]. Латки для нових мікропроцесорів ARM64 Qualcomm Centriq 2400 (Falkor) та Cavium ThunderX2 будуть додані в нових релізах ядра Лінукс[9]. Компанія AMD, натомість, стверджує, що реалізація атаки сімейства Spectre CVE-2017-5715 (Branch Target Injection/BTI) надзвичайно ускладнена на мікропроцесорах її виробництва. Тому компанія має великий сумнів у потребі щось виправляти. Проте, заради збереження сумісності будуть випущені латки, в яких буде додано підтримку інструкцій Indirect Branch Control[28]. Також компанія оприлюднила докладну доповідь про уразливості Spectre у її процесорах[29]. Подальші дослідженняSpectre NG3 травня 2018 року журнал c't[de] оприлюднив інформацію про виявлення сімейства з восьми уразливостей в процесорах Intel, що отримали загальну назву Spectre NG (англ. New Generation — нове покоління)[30]. За повідомленням журналу, уразливостям було виділено блок номерів у базі даних CVE, і 7 травня 2018 року мало бути оголошено їх назви[30]. Компанія Intel у прес-релізі не заперечувала наведені факти, і рекомендувала користувачам вчасно встановлювати оновлення програмного забезпечення[31]. За даними видання c't одна з уразливостей істотно спрощує атаку на основну систему з боку гостьової. Вона навіть дозволяє одній гостьовій системі атакувати іншу гостьову систему, що працює на тій же фізичній машині[30]. Усі вісім уразливостей ґрунтуються на тих самих прорахунках у дизайні процесорів, що й Spectre 1 и 2, а також Meltdown. [32]. Станом на 12 липня 2018 року було відомо про чотири з восьми уразливостей, що були раніше об'єднані спільною назвою «Specrte NG»:
Spoiler1 березня 2019 року була оприлюднена наукова доповідь про уразливість, яку назвали SPOILER[35]. І хоча формально вона не є варіантом уразливостей сімейства Spectre, вона використовує вади в реалізації модуля таблиць пам'яті у всіх сучасних мікропроцесорах фірми Intel, починаючи з Intel Core. Цю уразливість не було виявлено в мікропроцесорах фірми AMD або сімейства ARM. Уразливість дозволяє істотно пришвидшити атаку Rowhammer[36]. CacheOutВ січні 2020 року стало відомо про відкриття чергового варіанту атаки на сучасні мікропроцесори виробництва Intel (окрім виготовлених після четвертого кварталу 2019 року). Варіант отримав неформальну назву «CacheOut» та формальний ідентифікатор CVE-2020-0549/INTEL-SA-00329. Цей варіант використовує комбінацію вибіркового дослідження мікроархітектурного стану (англ. Microarchitectural Data Samping, MDS) мікропроцесора та примусового скасування транзакції в оперативній пам'яті (англ. Transactional Asynchronous Abort, TAA; див. транзакційна пам'ять). У випадку успішного застосування зловмисник може отримати доступ до даних інших процесів, віртуальних машин, подолати захист ASLR, а також зламати захист системи Intel SGX[37][38]. Примітки
Див. такожПосилання
|