Исследователи из Швейцарской высшей технической школы Цюриха выявили два способа обхода защиты от атак класса Spectre, основанной на использовании процессорных инструкций IBPB (Indirect Branch Prediction Barriers) для сброса состояния блока предсказания переходов при каждом переключении контекста (например, при передаче управления между пространством пользователя в ядром или между гостевой системой и хост окружением). Первый способ затрагивает процессоры Intel, а второй – процессоры AMD. Кроме того, исследователи впервые реализовали рабочий эксплоит, использующий уязвимость Spectre для организации утечки содержимого памяти между процессами, и продемонстрировали его применение для извлечения паролей из памяти suid-процессов, таких как sudo, su и polkit.
Первый способ обхода защиты от Spectre вызван ошибкой в микрокоде процессоров Intel и проявляется на системах с 12, 13 и 14 поколением процессоров Intel Core и 5 и 6 поколением процессоров Intel Xeon. Проблема устранена в обновлении микрокода, выпущенном компанией Intel в марте.
Из-за ошибки результаты предсказания переходов сохранялись после выполнения инструкции IBPB, которая должна была их аннулировать, что позволяло определить данные, оставшиеся после спекулятивного выполнения инструкций в других процессах или виртуальных машинах.
В ходе исследования отдельное внимание было уделено разработке метода для организации утечки содержимого памяти других процессов, в том числе привилегированных, таких как sudo. Так как до сих пор не существовало рабочих техник эксплуатации уязвимостей класса Spectre, нацеленных на преодоление изоляции между процессами, реализация защиты была сосредоточена главным образом на ядрах и гипервизоре, а связанные со спекулятивным выполнением проблемы в процессах, манипулирующих конфиденциальными данными, были оставлены без должного внимания. Таким образом, для атаки на процессы, как правило, не требуется обходить защиту на базе IBPB, так как подобная защита на уровне процессов применялась лишь в единичных случаях. Подготовленный в ходе исследования эксплоит продемонстрировал возможность применения уязвимостей Spectre для атаки на процессы, использующие suid-бит для выполнения с повышением привилегий.
Для эксплуатации уязвимостей Spectre на уровне процессов требуется наличие в коде процессов определённых последовательностей инструкций, приводящих к спекулятивному выполнению кода в зависимости от внешних условий, на которые может влиять атакующий. Возникающие спекулятивные обращения к памяти после определения неверного предсказания перехода отбрасываются процессором, но следы их выполнения оседают в процессорном кэше и могут затем быть извлечены из других процессов при помощи анализа по сторонним каналам, например, анализируя изменение времени доступа к прокэшированным и не прокэшированным данным.
Второй способ обхода защиты от Spectre вызван тем, что детали использования инструкций IBPB отличаются в процессорах от различных производителей и в разных поколениях процессоров одного производителя. Из-за того, что семантика IBPB в прошлых поколениях процессоров AMD отличается от семантики в CPU Intel и новых поколений CPU AMD, в ядре Linux имеющиеся отличия не были учтены и некоторые конфигурации были не защищены должным образом. Вероятно, аналогичные проблемы присутствуют в других операционных системах и в гипервизорах, но в ходе исследования было изучено только ядро Linux, в силу доступности его исходного кода. Проблема подтверждена в процессорах AMD поколения Zen, Zen2 и Zen3 (проблемы на системах с Zen3 не подтверждены исследователями, но упомянуты в отчёте AMD) и устраняется через установку обновления ядра.
Для защиты от уязвимостей, вызванных спекулятивным выполнением инструкций, при каждой передаче управления ядро вызывает процедуру, выполняющую инструкцию IBPB для сброса буфера предсказаний переходов. Проблема вызвана тем, что на некоторых системах AMD помимо очистки предсказания переходов требуется отдельная очистка предсказания адресов возврата, используемых в инструкциях RET. Для совершения атаки на системах с CPU AMD Zen и Zen2 атакующий может инициировать ложное предсказание адреса возврата до завершения операции IBPB. В качестве демонстрации метода подготовлен эксплоит, извлекающий содержимое произвольных областей памяти ядра, который можно использовать для извлечения хэша пароля пользователя root из страничного кэша операционной системы.