Тавис Орманди, исследователь безопасности из Google, опубликовал детали аппаратной уязвимости в процессорах AMD. Уязвимость актуальна для процессоров серии Zen 2, впервые они были представлены в 2019 году. Хотя это и уже устаревшая архитектура, процессоры на ее основе выпускались вплоть до начала 2021 года. В их число входят как модели для персональных компьютеров (например, популярный Ryzen 5 3600), так и для ноутбуков, а самое главное — для серверов (процессоры AMD EPYC «Rome» ). Полный список серий процессоров, подверженных Zenbleed, есть в статье издания Ars Technica.
Уязвимость образовалась из комбинации достаточно безобидных особенностей работы процессоров AMD. Оказывается, определенный способ взаимодействия с процессорными регистрами и вполне нормальная система спекулятивного выполнения инструкций в комбинации могут приводить к утечке секретных данных. Теоретически кражу информации с использованием этой уязвимости (получившей универсальный идентификатор CVE-2023-20593) достаточно легко организовать, и происходить она будет с довольно высокой скоростью — до 30 килобайт в секунду для каждого из процессорных ядер. Случаев реальной эксплуатации проблемы пока не зафиксировано, но и патчи (обновления микрокода процессоров) пока доступны не для всех затронутых процессоров. AMD обещает полностью решить проблему до конца 2023 года.
Подробности эксплуатации Zenbleed
Zenbleed существует благодаря системе спекулятивного выполнения инструкций. Разобраться детально в этой уязвимости нелегко. Тавис Орманди в своем блог-посте приводит сухие факты, разобраться в которых может только специалист с опытом низкоуровневого программирования. Если совсем коротко, один из тестовых наборов команд для эксплуатации Zenbleed представлен вот в этом куске кода:
Чуть подробнее суть проблемы раскрывается в описании на GitHub команды Google Information Security. Уже 15 лет в процессорах Intel и AMD используется расширение системы команд AVX. Эти инструкции в том числе предполагают работу с векторными регистрами шириной 128 и 256 бит. Если предельно упростить, процессорные регистры используются для временного хранения данных в ходе выполнения инструкций. Возможность сохранить достаточно большой объем данных в векторных регистрах в некоторых случаях позволяет серьезно повысить производительность. 128-битные регистры (обозначаемые как XMM) и 256-битные (YMM) задействуются повсеместно, в самых рутинных задачах, например связанных с чтением и записью данных в оперативную память.
Одновременное использование 128- и 256-битных регистров приносит свой набор проблем. Если в определенной задаче они используются одновременно, регистры типа XMM автоматически конвертируются в регистры типа YMM. Рутинной задачей в такой ситуации является обнуление, очистка верхней «половины» регистра YMM. Для этого существует специальная инструкция vzeroupper. Все регистры хранятся в так называемом регистровом файле и попеременно используются разными программами, выполняемыми на компьютере.
Что общего у Zenbleed и Use After Free?
Если создать условия, при которых инструкция vzeroupper будет выполнена спекулятивно, в процессорах AMD Zen 2 это будет сделано некорректно. Процессоры могут выполнять инструкции, не дожидаясь результата предыдущих вычислений, на основе системы предсказания ветвлений. Это значительно ускоряет работу, но может приводить к ситуации, когда инструкции выполняются «зря», по логике выполнения программы они не требуются. В таком случае должен происходить откат результатов выполнения инструкции. В том случае, если выполнение vzeroupper произошло напрасно, обнуление половины регистра YMM должно быть отменено.
И вот здесь как раз и происходит ошибка в логике работы процессоров Zen 2. Регистр остается в так называемом «неопределенном» состоянии. Это значит, что в нем могут остаться куски данных других программ, использующих общий для всех регистровый файл. В нормальной ситуации доступа к этим данным не должно быть ни у кого. Уязвимость Zenbleed обеспечивает условия, при которых вредоносная программа может «отслеживать» информацию, проходящую через векторные регистры процессора.
В некотором смысле такое неверное поведение процессора очень похоже на типичную программную ошибку, известную как use after free. Речь идет о ситуации, когда одна программа использует определенную область оперативной памяти, хранит там какие-то данные, а потом освобождает эту область, делая ее доступной для других приложений. В результате посторонняя программа может прочитать эти данные, в которых может храниться секретная информация. Только в случае Zenbleed речь идет не о программной, а об аппаратной ошибке.
Оценка последствий
Zenbleed в теории позволяет читать секреты напрямую и с достаточно высокой скоростью. Но само по себе это ничего не дает: какие данные удастся прочитать, можно ли использовать их во вред — зависит от конкретной ситуации. Пострадать от этой уязвимости могут только приложения, которые используют XMM и YMM. В первую очередь это системные библиотеки и само ядро Linux, а также криптографические библиотеки и системы вроде OpenSSL. Кроме того, для получения информации необходимо, чтобы приложение интенсивно работало с данными. Чтобы атакующий смог добыть что-то действительно полезное, нужно, чтобы на компьютере производилось шифрование или кто-то активно пользовался браузером, в противном случае эксплуатация уязвимости ничего не даст.
Нам был показан только демонстрационный код, proof of concept. В задачи автора работы, естественно, не входила демонстрация по-настоящему вредоносного сценария. По предположению специалистов из компании Cloudflare, эксплуатировать проблему достаточно легко. Это возможно чуть ли не из браузера. Можно пофантазировать и представить, что злоумышленник присылает жертве ссылку на подготовленную веб-страницу и похищает из кэш-памяти пароли к важным сервисам. Что самое неприятное, такая кража даже не будет оставлять следов. Получится ли так сделать в реальности? Пока не известно.
Точно известно, что наибольшую опасность Zenbleed представляет в корпоративном окружении. Представьте себе ситуацию, когда арендатор виртуального сервера без особых проблем, с высокой скоростью может считывать данные других серверов и даже гипервизора, если они используют те же процессорные ядра. Именно поэтому в первую очередь был выпущен патч для серверных процессоров AMD EPYC.
Будущее аппаратной безопасности
В заключительной части статьи Тавис Орманди сообщает, что нашел данную проблему благодаря использованию фаззинга. Применительно к тестированию программного обеспечения фаззинг обычно предполагает «скармливание» программе произвольных данных, в поиске ситуации, когда определенный набор этих данных вызывает аномальное поведение. Здесь же мы имеем дело с более сложной задачей: аппаратный фаззинг (назовем его так) предполагает создание программ из случайного набора инструкций в поисках аномальной реакции процессора. Падение такой программы само по себе не обязательно сигнализирует о проблеме. Орманди предлагает несколько методик определения аномалий. Например — запуск одинакового кода на разных процессорах. Если поведение одинаковых программ отличается — это повод расследовать, почему так вышло, нет ли здесь какой-то ошибки в логике работы процессора.
Опыт предыдущих работ по аппаратным уязвимостям показывает, что закрыть одну проблему часто бывает недостаточно. После применения патча может быть найден способ обойти новую систему защиты, ведь речь идет о фундаментальных принципах работы процессора. Тавис Орманди не только нашел уязвимость в процессорах AMD Zen 2, но и предложил интересные методики поиска других потенциальных ошибок.
Маловероятно, что Zenbleed при всей потенциальной его опасности будет использоваться в атаках на пользователей. Серверная инфраструктура организаций — другое дело. В данном конкретном случае можно сказать, что «обошлось» — нашли проблему, которую смогли закрыть обновлением микрокода, с незначительным падением производительности. Внедрить этот патч, если в вашей серверной инфраструктуре использованы процессоры AMD Zen 2, нужно обязательно. Но есть также вероятность, что за этим исследованием последуют и другие. Возможно, нас ждет некий пересмотр отношения к безопасности аппаратного обеспечения, будут предложены новые комплексные тесты на безопасность (использующие и фаззинг, и другие методики). Будем надеяться, что их возьмут на вооружение производители железа. Но и организациям следует учитывать риск появления новых подобных уязвимостей в своей модели безопасности.