|
Исследователи из массачусетского технологического института выявили технику атаки TONTOU (Time-of-Neutralization to Time-of-Use), предлагающую новый способ эксплуатации микроархитектурных уязвимостей класса Spectre v2. Уязвимость даёт возможность определить содержимое памяти ядра при выполнении эксплоита в пространстве пользователя. Код для блокирования эксплуатации уязвимости принят в состав ядра Linux 5 августа и включён в состав выпусков 7.1.7, 6.18.43, 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 в контексте другого процесса.
Процессор определит, что предсказание ветвления не оправдалось и откатит операцию в исходное состояние, но обработанные в процессе спекулятивного выполнения данные осядут в кэше и микроархитектурных буферах. Если ошибочно выполненный блок осуществляет обращение к памяти, то его спекулятивное выполнение приведёт к оседанию в общем кэше и данных, прочитанных из памяти. Для извлечения информации из кэша может применяться один из способов определения содержимого кэша на основе анализа изменения времени доступа к прокэшированным и не прокэшированным данным.
|