Для демонстрации уязвимости, которой присвоено кодовое имя Zenbleed, подготовлен прототип эксплоита, позволяющий непривилегированному пользователю определить данные, обрабатываемые в инструкциях AES-NI или REP-MOVS (обычно применяется в функции memcpy), что может быть использовано для реконструкции ключей шифрования и паролей пользователей, обрабатываемых в других процессах, в том числе привилегированных. Производительность утечки данных при работе эксплоита составляет приблизительно 30КБ в секунду.
Проблема проявляется в сериях процессоров AMD Ryzen 3000, Ryzen PRO 3000, Ryzen Threadripper 3000, Ryzen 4000 с графикой Radeon, Ryzen PRO 4000, Ryzen 5000 с графикой Radeon, Ryzen 7020 с графикой Radeon и EPYC 7002. Уязвимость устранена на уровне обновления микрокода. Для ядра Linux подготовлен патч для загрузки исправленного микрокода. В случае невозможности обновить микрокод имеется обходной способ блокирования уязвимости, приводящий к снижению производительности — необходимо выставить в CPU управляющий бит DE_CFG[9], используя в Linux команду «wrmsr -a 0xc0011029 $(($(rdmsr -c 0xc0011029) | (1‹‹9)))». Отключение режима SMP не блокирует уязвимость.
По своей сути проблема напоминает классические уязвимости 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.
Источник: http://www.opennet.ru/opennews/art.shtml?num=59491