Группа исследователей из Амстердамского свободного университета выявила новый метод атаки «Native BHI» (CVE-2024-2201), позволяющий на системах с процессорами Intel определить содержимое памяти ядра Linux при выполнении эксплоита в пространстве пользователя. В случае применения атаки к системам виртуализации, атакующий из гостевой системы может определить содержимое памяти хост-окружения или других гостевых систем.
Метод Native BHI предлагает иную технику эксплуатации уязвимости BHI (Branch History Injection, CVE-2022-0001), которая обходит ранее реализованные способы защиты. Предложенный в 2022 году метод атаки BHI подразумевал эксплуатацию уязвимости в рамках одного уровня привилегий, для чего эксплоит базировался на выполнении еBPF-программы, загруженной пользователем в ядре. Для блокирования уязвимости достаточно было ограничить доступ к выполнению кода еBPF для обычных пользователей.
Новый метод Native BHI не требует доступа к еBPF и позволяет совершить атаку непривилегированным пользователем из пространства пользователя. Метод основывается на выполнении существующих в коде ядра гаджетов — последовательностей команд, приводящих к спекулятивному выполнению инструкций. Для поиска в ядре подходящих гаджетов был разработан специальный инструментарий InSpectre Gadget, который при анализе ядра 6.6-rc4 выявил 1511 Spectre-гаджетов и 2105 вспомогательных гаджетов диспетчеризации.
На основе найденных гаджетов исследователями подготовлен эксплоит, дающий возможность извлечь из буферов ядра строку с хэшем пароля пользователя root, загруженную из файла /etc/shadow. Скорость извлечения данных из памяти ядра составляет приблизительно 3.5 Кб в секунду.
Метод BHI представляет собой расширенный вариант атаки Spectre-v2, в котором для обхода добавленной защиты (Intel eIBRS и Arm CSV2) и организации утечки данных используется подстановка значений в буфер с глобальной историей переходов (Branch History Buffer), применяемый в CPU для повышения точности предсказания ветвления за счёт учёта истории прошлых переходов. В ходе атаки через манипуляции с историей переходов создаются условия неверного предсказания перехода и спекулятивного выполнения необходимых инструкций, результат которых оседает в кэше.
Отличия от атаки Spectre-v2 сводятся к использованию буфера с историей переходов (Branch History Buffer) вместо буфера предсказания ветвления (Branch Target Buffer). Для извлечения данных из памяти атакующий должен создать условия, при которых при выполнении спекулятивной операции адрес будет взят из области, которую нужно определить. После выполнения спекулятивного косвенного перехода, считанный из памяти адрес перехода, остаётся в кэше, после чего для его извлечения может применяться один из способов определения содержимого кэша на основе анализа изменения времени доступа к прокэшированным и не прокэшированным данным.
Против атаки Native BHI не защищает применение инструкций Intel IBT (Indirect Branch Tracking) и реализованный в ядре Linux гибридный механизм защиты потока выполнения команд FineIBT, сочетающий применение аппаратных инструкций IBT и программной защиты kCFI (kernel Control Flow Integrity) для блокирования нарушения нормального порядка выполнения (control flow). FineIBT разрешает выполнение по косвенному переходу только в случае перехода на инструкцию ENDBR, которая размещается в самом начале функции. Дополнительно (по аналогии с механизмом kCFI) следом осуществляется проверка хэшей, гарантирующих неизменность указателей.
Для защиты от нового варианта атаки в ядро Linux добавлено изменение с реализацией дополнительного режима защиты, применяющего предложенные компанией Intel аппаратные средства защиты (BHI_DIS_S) или альтернативную программную защиту, реализованную для защиты гипервизора KVM. Разработчики гипервизора Xen также выпустили исправление, основанные на использовании режима BHI_DIS_S, ограничивающего предсказания на основе истории переходов. Поддержка BHI_DIS_S доступна в процессорах, начиная с Intel Alder Lake, а также серверных CPU, начиная с Intel Sapphire Rapids. Доступен и программный режиме защиты, основанный на использовании последовательностей для очистки буфера истории переходов, но он приводит к более заметному снижению производительности.
Источник: opennet.ru