Группа исследователей из Грацского технического университета (Австрия) и Центра Гельмгольца по информационной безопасности (CISPA) раскрыла сведения об уязвимости (CVE-2021-26318) во всех процессорах AMD, делающей возможным проведение атак по сторонним каналам класса Meltdown (изначально предполагалось, что процессоры AMD не не подвержены уязвимости Meltdown). С практической стороны атака может привести к утечке сведений об адресах в памяти ядра Linux, что может использоваться при эксплуатации системных уязвимостей для обхода защиты на основе рандомизации адресов в ядре (KASLR) или для организации скрытых каналов передачи данных.
Компания AMD не планирует устранять уязвимость, так как она, как и выявленная в августе похожая атака, малоприменима в реальных условиях, ограничена текущими границами адресного пространства процесса и требует наличия в ядре определённых готовых последовательностей инструкций (гаджетов). Для демонстрации атаки исследователи загружали собственный модуль ядра с искусственно добавленным гаджетом. В реальных условиях для подстановки необходимых последовательностей атакующие могут использовать, например, регулярно всплывающие уязвимости в подсистеме eBPF. Для защиты от нового вида атаки компания AMD рекомендовала применять методы безопасного кодирования, которые помогают блокировать атаки Meltdown, такие как использование инструкций LFENCE и более строгая изоляция таблицы страниц памяти.
В ходе эксперимента исследователям удалось добиться утечки информации из ядра в процесс в пространстве пользователя со скоростью 52 байта в секунду, при наличии в ядре гаджета, выполняющего операцию “if (offset Напомним, что классическая уязвимость Meltdown основывается на том, что в ходе спекулятивного выполнения инструкций процессор может выполнить обращение к закрытой области данных, после чего отбросить результат, так как выставленные привилегии запрещают такое обращение из процесса пользователя. В программе спекулятивно выполняемый блок отделяется от основного кода условным переходом, который в реальных условиях всегда срабатывает, но из-за того, что в условном операторе используется вычисляемое значение, которое процессор не знает во время упреждающего выполнения кода, осуществляется спекулятивное выполнение всех вариантов ветвления.
Так как для спекулятивно выполняемых операций используется тот же кэш, что и для обычно выполненных инструкций, имеется возможность в ходе спекулятивного выполнения выставить в кэше маркеры, отражающие содержимое отдельных битов в закрытой области памяти, и затем в обычно выполняемом коде определить их значение через анализ времени обращения к прокэшированным и не прокэшированным данным.