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

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

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

Значення

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

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

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

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

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

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

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

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

В квітні 2021 року компанія AMD повідомила, що її фахівці виявили уразливість подібну до Spectre v4 в підсистемі Predictive Store Forwarding (PSF) мікропроцесорів архітектури Zen 3. На їхню думку ця уразливість не становить небезпеки для більшості користувачів, а за бажання її можна вимкнути налаштуваннями процесора.

Алгоритм реалізації

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

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

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

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

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

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

Читання за межами масиву (CVE-2017-5753)

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

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

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

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

Атака з використанням цієї вразливості була показана на основі функції, сторонній ефект у якій створено таким кодом: if (x < array1_size) y = array2[array1[x] * 256]; Умовний перехід гарантує, що звернення до array1 буде завжди коректним й не виходитиме за межі масиву. Тим не менш, при спекулятивному виконанні команд мікропроцесор може виконати ці інструкції в конвеєрі, залишивши сторонній канал у вигляді кешованих фрагментів масиву array2. У цьому прикладі значення змінної x визначає адресу в пам'яті, яку прагне зчитати зловмисник (зі зсувом від адреси масиву array1). Значення комірки пам'яті за адресою array1 + x буде відновлено на основі інформації про кешований фрагмент масиву array2.

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

Дослідниками також був представлена інша уразливість, так звана (BTI) або  — маніпуляція непрямими переходами. Уразливість розміщена в модулі передбачення переходів і може бути використана для атаки між процесами різного рівня.

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

Інші варіанти

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

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

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

Захист

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

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

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

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

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

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

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

Латки програмного забезпечення

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