Уязвимость в CPU AMD, приводящая к переполнению микроархитектурного стека

Группа исследователей из Швейцарской высшей технической школы Цюриха выявила новую уязвимость (CVE-2023-20569) в реализации микроархитектурных структур процессоров AMD, получившую кодовое имя Inception. Уязвимость позволяет локальному непривилегированному пользователю определить содержимое памяти процессов других пользователей. При использовании систем виртуализации уязвимость даёт возможность извлечь информацию из других гостевых систем.

Исследователями подготовлен рабочий прототип эксплоита и продемонстрирована возможность его использования локальным непривилегированным пользователем для определения хэша пароля пользователя 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, влияние которой на буфер предсказания переходов напоминает рекурсивный вызов инструкция 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.

Release. Ссылка here.