Исследователями подготовлен рабочий прототип эксплоита и продемонстрирована возможность его использования локальным непривилегированным пользователем для определения хэша пароля пользователя root, хранимого в файле /etc/shadow и загруженного в память при выполнении аутентификации в системе. Атака продемонстрирована на полностью обновлённой системе Ubuntu 22.04 с ядром 5.19 на компьютере с процессором семейства AMD Zen 4. Производительность утечки данных при работе эксплоита составляет 39 байт в секунду. Содержимое /etc/shadow успешно было определено в 6 из 10 попыток эксплуатации уязвимости. На проведение каждой попытки было затрачено приблизительно 40 минут.
Уязвимость позволяет вызвать переполнение стека адресов возврата (RAS, Return Address Stack), микроархитектурной структуры, которая обновляется в спекулятивном режиме на стадии, когда процессор лишь прогнозирует потенциальный вызов инструкции CALL. Стек RAS имеет фиксированный размер и является кольцевым, т.е. зациклен и после последнего элемента осуществляется переключение на начало. Атакующий может создать условия, когда блок предсказания переходов спекулятивно выполнит большое число некорректно предсказанных вызовов CALL, достаточное для того чтобы переполнить стек RAS и перезаписать корректно предсказанные точки возврата, размещённые в начале стека.
В итоге, начальные элементы стека могут быть перезаписаны на выбранные атакующим значения, что в дальнейшем приведёт к использованию этих заменённых значений при спекулятивном выполнении инструкции RET в контексте другого процесса (т.е. будет выполнен целенаправленный спекулятивный переход на блок кода, не предусмотренный логикой выполнения программы). После этого процессор определит, что предсказание ветвления не оправдалось и откатит операцию в исходное состояние, но обработанные в процессе спекулятивного выполнения данные осядут в кэше и микроархитектурных буферах. Если ошибочно выполненный блок осуществляет обращение к памяти, то его спекулятивное выполнение приведёт к оседанию в общем кэше и данных, прочитанных из памяти.
Для «отравления» предсказания переходов используется выявленная теми же исследователями уязвимость Phantom (CVE-2022-23825), которая позволяет создать условия для предсказания фиктивного перехода без инструкций ветвления и влиять на буфер предсказания переходов без инструкции «ret». Для инициирования ошибочного предсказания и переполнения стека RAS используется обычная инструкция XOR, влияние которой на буфер предсказания переходов при проведении атаки Phantom напоминает рекурсивный вызов инструкция CALL. Для управляемой подстановки необходимого значения в начало стека RAS предложен метод TTE (Training in Transient Execution), позволяющий повлиять на будущее предсказание переходов из предыдущих ошибочных предсказаний.
Уязвимость специфична для процессоров AMD и затрагивает все актуальные семейства процессоров EPYC и Ryzen на базе микроархитектур Zen1, Zen2, Zen3 и Zen4. Для процессоров на базе микроархитектур Zen1 и Zen2 для блокирования проявления уязвимости может применяться защита на основе инструкции IBPB (Indirect Branch Prediction Barriers), уже применяемой для защиты от атак Spectre (суть защиты в сбросе состояния блока предсказания переходов при каждом переключении контекста, что приводит к снижению производительности от 93.1% до 216.9%). Для процессоров семейств Zen3 and Zen4 обходные пути защиты отсутствуют и для блокирования уязвимостей в них необходима установка обновления микрокода.

Исправления для защиты от уязвимости и обновление микрокода включены в состав выпусков ядра Linux 6.4.9, 6.1.44, 5.15.125, 5.10.189, 5.4.252, 4.19.290, 4.14.321. В ядре Linux уязвимость блокирована через исключение кода, который может привести к спекулятивному переходу инструкции RET на контролируемое атакующим значение. После выхода обновлений ядра дополнительно предложен более эффективный переработанный вариант патчей, который ещё не принят в состав ядра. Проследить за появлением защиты от уязвимости в дистрибутивах можно на следующих страницах: Debian, Ubuntu, Gentoo, RHEL, SUSE, Fedora, Arch, OpenBSD, FreeBSD, NetBSD.
Источник: http://www.opennet.ru/opennews/art.shtml?num=59574