Дослідники з масачусетського технологічного інституту виявили техніку атаки TONTOU (Time-of-Neutralization to Time-of-Use), що пропонує новий спосіб експлуатації мікроархітектурних уразливостей класу Spectre v2. Вразливість дає можливість визначити вміст пам'яті ядра під час виконання експлоїту у просторі користувача. Код для блокування експлуатації вразливості прийнято до складу ядра Linux 5 серпня та включений до складу випусків 7.1.7, 6.18.43, 6.12.102, 6.6.149, 6.1.181, 5.15.214 та 5.10.263.
Дослідниками продемонстровано можливість здійснення атаки локальним непривілейованим користувачем для визначення хеша пароля користувача root, що зберігається у файлі /etc/shadow та завантаженого в пам'ять при виконанні автентифікації в системі. Дослідникам вдалося досягти витоку даних з пам'яті ядра з продуктивністю 5.47 байт на секунду і точністю 91.97%. З 10 тестових запусків експлоїту, що в середньому тривали 18 хвилин, у половині випадків вдалося успішно визначити наявність у пам'яті файлу /etc/shadow і витягти його вміст.
Експлоїт продемонстрований на системах з процесорами AMD і може застосовуватись із CPU AMD сімейств Zen 1-4. На системах Intel атака також здійсненна, але експлуатація складніша. Для захисту від переповнення стека адрес повернення та блокування вразливості SRSO (Speculative Return Stack Overflow) в процесорах AMD застосовується механізм захисту Safe-RET, який очищує буфер передбачення переходів після кожного використання та звужує вікно проведення атаки до 2 інструкцій, що виконуються кілька десятків наноунд.
Для обходу даного захисту та розширення вікна здійснення атаки реалізована техніка уповільнення CPU, що дозволила встигнути виконати підстановку переривання в потрібний момент для перенаправлення потоку виконання в ядрі та використання обробника переривання для спотворення запису в буфері передбачення переходів. Для експлуатації вразливості SRSO атакуючий може створити умови, коли блок передбачення переходів спекулятивно виконає велику кількість некоректно передбачуваних викликів CALL, достатню для того, щоб переповнити стек адрес повернення і перезаписати коректно передбачені точки повернення, розміщені на початку стека. У результаті початкові елементи стека можуть бути перезаписані на обрані атакуючим значення, що в подальшому призведе до використання цих замінених значень при спекулятивному виконанні інструкції RET в контексті іншого процесу.
Процесор визначить, що прогноз розгалуження не виправдалося і відкотить операцію у вихідний стан, але оброблені в процесі спекулятивного виконання дані осядуть у кеші та мікроархітектурних буферах. Якщо помилково виконаний блок здійснює звернення до пам'яті, його спекулятивне виконання призведе до осідання в загальному кеші і даних, прочитаних з пам'яті. Для отримання інформації з кешу може застосовуватися один із способів визначення вмісту кешу на основі аналізу зміни часу доступу до прокешованих та не прокешованих даних.
Джерело: opennet.ru
