Тэвис Орманди (Tavis Ormandy), исследователь безопасности из компании Google, выявил уязвимость (CVE-2023-20593) в процессорах AMD на базе микроархитектуры Zen2, которая может быть использована для отслеживания содержимого регистров во время выполнения других процессов на том же ядре CPU. Среди прочего атака может быть осуществлена из виртуальных машин и изолированных окружений.
Для демонстрации уязвимости, которой присвоено кодовое имя Zenbleed, подготовлен прототип эксплоита, позволяющий непривилегированному пользователю определить данные, обрабатываемые в инструкциях AES-NI или REP-MOVS (обычно применяется в функции memcpy), что может быть использовано для реконструкции ключей шифрования и паролей пользователей, обрабатываемых в других процессах, в том числе привилегированных.
Проблема проявляется в сериях процессоров AMD Ryzen 3000, Ryzen PRO 3000, Ryzen Threadripper 3000, Ryzen 4000, Ryzen PRO 4000, Ryzen 5000, Ryzen 7020 и EPYC 7002. Уязвимость устранена на уровне обновления микрокода. Для ядра Linux подготовлен патч для загрузки исправленного микрокода. В случае невозможности обновить микрокод имеется обходной способ блокирования уязвимости, приводящий к снижению производительности – необходимо выставить в CPU управляющий бит DE_CFG[9], используя в Linux команду “wrmsr -a 0xc0011029 $(($(rdmsr -c 0xc0011029) | (1По своей сути проблема напоминает классические уязвимости use-after-free, вызванные обращением к памяти после её освобождения. В процессорах для хранения содержимого регистров применяется регистровый файл (RF), представляющий собой массив, который совместно используется во всех задачах на том же ядре CPU. За прикрепление конкретных именованных регистров к ресурсам из регистрового файла отвечает таблица распределения регистров (RAT). При этом хранение в регистре нулевого значения осуществляется не через сохранение пустого значения в регистровом фале, а через выставление флага z-bit в таблице RAT.
Уязвимость вызвана тем, что если z-bit установлен в ходе спекулятивного выполнения инструкций, недостаточно просто сбросить его в случае неверного предсказания ветвления, так как пространство в регистровом файле могло быть перераспределено с момента спекулятивного выполнения. Выявленный эффект возникает при одновременном переименовании регистра, использовании инструкции, для которой применяется оптимизация слияния, и спекулятивном выполнении векторной инструкции VZEROUPPER. Если предсказание ветвления не оправдалось и выполнен откат спекулятивной операции VZEROUPPER в исходное состояние, может произойти повреждение содержимого векторных регистров.
Через манипуляции с инструкцией VZEROUPPER можно добиться управляемой утечки данных, обрабатываемых в векторных регистрах YMM, используемых в режимах AVX (Advanced Vector Extensions) и SSE (Streaming SIMD Extensions). Указанные регистры активно применяются в функциях копирования памяти и обработки строк, например, в библиотеке Glibc они задействованы в функциях memcpy, strcmp и strlen.