Эксплоит в процессорах AMD Zen2 позволяет определять содержимое регистров

gqg8oueevfcbpqyu9-neh__wyl0.png

Специалист по ИБ из Google, Тэвис Орманди, обнаружил уязвимость (CVE-2023–20593) в процессорах AMD, использующих микроархитектуру Zen2. Эта уязвимость позволяет отслеживать содержание регистров в процессе выполнения других задач на одном и том же ядре процессора. Атаки могут быть выполнены с использованием виртуальных машин и изолированных сред.

Демонстрация уязвимости, известной под кодовым названием Zenbleed, включала в себя прототип эксплоита. Этот эксплоит позволяет непривилегированным пользователям определять данные, обрабатываемые инструкциями AES-NI или REP-MOVS (обычно используемые в функции memcpy). Это может привести к возможности восстановления шифрованных ключей и паролей пользователей, обрабатываемых в других процессах, включая привилегированные.
Процессоры AMD следующих серий подвержены этой проблеме: Ryzen 3000, Ryzen PRO 3000, Ryzen Threadripper 3000, Ryzen 4000 с графикой Radeon, Ryzen PRO 4000, Ryzen 5000 с графикой Radeon, Ryzen 7020 с графикой Radeon и EPYC 7002.

В основе этой проблемы лежит ситуация, аналогичная классическим уязвимостям типа «использование после освобождения» (use-after-free), когда происходит доступ к памяти после её освобождения. В процессорах для хранения содержимого регистров используется файл (RF, Register File) — массив, который делится между всеми задачами на одном ядре CPU. Распределение конкретных именованных регистров к ресурсам из файла регистров осуществляется с помощью таблицы распределения (RAT, Register Allocation Table). Стоит отметить, что хранение нулевого значения в регистре не производится через сохранение пустого значения в файле, а осуществляется через установку флага z-bit в таблице RAT. Проблема заключается в том, что если z-bit установлен во время спекулятивного выполнения инструкций, недостаточно просто сбросить его в случае ошибочного прогнозирования ветвления, так как пространство в файле регистров может быть перераспределено после спекулятивного выполнения. Обнаруженная проблема возникает при одновременном переименовании регистра, применении инструкции, которая использует оптимизацию слияния, и спекулятивном выполнении векторной инструкции VZEROUPPER, которая устанавливает z-bit и освобождает ресурсы из файла регистров. Если прогноз ветвления оказывается неверным и спекулятивная операция VZEROUPPER откатывается в исходное состояние, содержимое векторных регистров может быть повреждено, так как z-bit сбрасывается, но освобожденный ресурс остается доступным.

Манипулирование инструкцией VZEROUPPER может привести к контролируемому утечке данных, обрабатываемых в векторных регистрах YMM, используемых в режимах AVX (Advanced Vector Extensions) и SSE (Streaming SIMD Extensions). Эти регистры широко используются в функциях копирования памяти и обработки строк, например, в библиотеке Glibc, где они задействованы в функциях memcpy, strcmp и strlen.

Хотя эксплоит может обеспечить утечку данных со скоростью только около 30 КБ/с, уязвимость уже была исправлена с помощью обновления микрокода. Для ядра Linux был создан патч для загрузки исправленного микрокода, который был включен в обновления ядра 6.4.6, 6.1.41, 5.15.122, 5.10.187, 5.4.250 и 4.19.289. Вы можете отследить обновления микрокода в различных дистрибутивах, посетив следующие страницы: Debian, Ubuntu, Gentoo, RHEL, SUSE, Fedora, Arch, OpenBSD, FreeBSD, NetBSD.

Если обновление микрокода недоступно, существует альтернативный метод блокировки уязвимости, который, однако, снижает производительность. Это включает установку управляющего бита DE_CFG[9] в процессоре с помощью команды Linux «wrmsr -a 0xc0011029 $(($(rdmsr -c 0xc0011029) | (1<<9)))». Отключение режима SMT не помогает в блокировке этой уязвимости.


vk9oqepl_skihp9evixwo7ounsg.jpeg

© Habrahabr.ru