SWAPGS - нова вразливість у механізмі спекулятивного виконання CPU

Дослідники з компанії Bitdefender виявили нову вразливість (CVE-2019-1125) у механізмі спекулятивного виконання інструкцій сучасних CPU, яка отримала ім'я SWAPGS, що відповідає назві процесорної інструкції, що викликає проблему. Вразливість дозволяє непривілейованому атакуючій визначити вміст областей пам'яті ядра або запущених віртуальних машин. Проблема підтверджена у процесорах Intel (x86_64) та частково торкається процесори AMD, котрим не проявляється основний вектор атаки. Раніше реалізовані методи протидії вразливості Spectre та Meltdown не захищають від атаки SWAPGS при використанні процесорів Intel, але для Linux, ChromeOS, Android та Windows вже запропоновані виправлення.

Вразливість відноситься до класу Spectre v1 і ґрунтується на ідеї відновлення даних із процесорного кешу, що залишилися після спекулятивного виконання інструкцій. Блоки передбачення переходів сучасних CPU підвищення продуктивності застосовують попереджувальне виконання деяких інструкцій, які найімовірніше будуть виконані, але не чекаючи обчислення всіх чинників, визначальних їх виконання (наприклад, коли ще обчислені умови переходу чи параметри доступу). Якщо прогноз не підтверджується, процесор відкидає результат спекулятивного виконання, але оброблені в його ході дані осідають у процесорному кеші і можуть бути відновлені за допомогою методів визначення вмісту кешу по стороннім каналам, що аналізують зміну часу доступу до прокешованих та не прокешованих даних.

Особливість нової атаки у використанні витоку, що виникає в ході спекулятивного виконання інструкції SWAPGS, яка застосовується в операційних системах для заміни значення регістру GS при переході управління з простору користувача в ядро ​​ОС ). У ядрі Linux в GS зберігається покажчик per_cpu, використовуваний доступу до даних ядра, а просторі користувача покажчики на TLS (Thread Local Storage).

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

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

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

Виправлення вимагає встановлення оновлення ядра як в основній системі, так і в гостьових оточеннях з наступним перезавантаженням системи. Для відключення захисту в Linux можна використовувати опцію «nospectre_v1», яка також відключає заходи для блокування вразливості SWAPGS. Виправлення доступне у вигляді патча для ядра Linux, яке вже включено до складу випусків 4.19.65, 5.2.7, 4.14.137, 4.9.188 та 4.4.188. Оновлення для дистрибутивів Linux поки не випущено (Debian, RHEL, Fedora, Arch Linux, SUSE/openSUSE, Ubuntu). У Windows проблема без зайвого розголосу була усунена в липневому оновленні. Компанія Google підготувала виправлення для ядра 4.19, що постачається в ChromeOS та Android.

За заявою дослідників із компанії Bitdefender, Intel був поінформований про проблему ще у серпні минулого року. Проблему було вирішено усунути програмно, для чого до скоординованого вироблення виправлення були залучені розробники з Microsoft, Google та ядра Linux. Старі процесори Intel до Ivy Bridge атакувати значно важче через відсутність підтримки інструкції WRGSBASE, використаної в експлоїті. Системи ARM, POWER, SPARC, MIPS та RISC-V не схильні до проблеми, оскільки не підтримують інструкцію SWAPGS.

Проблема загрожує головним чином власникам процесорів Intel.
на системах AMD вдалося відтворити лише другий сценарій атаки, що обмежується спекулятивною обробкою базового значення регістру GS, що можна використовувати для пошуку певних значень у випадкових областях пам'яті. Для блокування цього варіанта атаки досить існуючих методів захисту від уразливостей Spectre v1.

Джерело: opennet.ru

Додати коментар або відгук