Группа исследователей из Технического университета Дрездена выявила уязвимость (CVE-2020-12965) в процессорах AMD на базе микроархитектур Zen+ и Zen 2, позволяющую совершить атаку класса Meltdown. Изначально предполагалось, что процессоры AMD Zen+ и Zen 2 не подвержены уязвимости Meltdown, но исследователями была выявлена особенность, приводящая к спекулятивному обращению к защищённым областям памяти при использовании неканонических виртуальных адресов.
Архитектура AMD64 подразумевает использование только первых 48 бит виртуального адреса и игнорирование оставшихся 16 бит. При этом определено, что биты с 48 по 63 всегда должны копировать значение 47 бита (расширение знакового бита). В случае нарушения данного условия и попытки обращения по адресу с произвольными значениями верхних битов процессор генерирует исключение. Повторяющееся заполнение верхних битов приводит к разделению доступного адресного пространства на два блока – нижний (от 0 до 00007FFFFFFFFFFF), в котором верхние биты обнулены, и верхний (от FFFF800000000000 до FFFFFFFFFFFFFFFF), в котором все верхние биты выставлены в 1.
Адреса подпадающие под указанные блоки называются каноническими, а некорректные адреса с произвольным содержимым верхних битов – неканоническими. Нижний диапазон канонических адресов, как правило, выделяется под данные процесса, а верхний используется для данных ядра (доступ к указанным адресам из пространства пользователя блокируется на уровне разделения привилегий).
Классическая уязвимость Meltdown основывается на том, что в ходе спекулятивного выполнения инструкций процессор может выполнить обращение к закрытой области данных, после чего отбросить результат так как выставленные привилегии запрещают такое обращение из процесса пользователя. В программе спекулятивно выполняемый блок отделяется от основного кода условным переходом, который в реальных условиях всегда срабатывает, но из-за того, что в условном операторе используется вычисляемое значение, которое процессор не знает во время упреждающего выполнения кода, осуществляется спекулятивное выполнение всех вариантов ветвления.
Так как для спекулятивно выполняемых операций используется тот же кэш, что и для обычно выполненных инструкций, имеется возможность в ходе спекулятивного выполнения выставить в кэше маркеры, отражающие содержимое отдельных битов в закрытой области памяти, и затем в обычно выполняемом коде определить их значение через анализ времени обращения к прокэшированным и не прокэшированным данным.
Особенность новой уязвимости, которой подвержены процессоры AMD Zen+ и Zen 2, в том, что CPU допускают спекулятивное выполнение операций чтении и записи, обращающихся к памяти с использованием недопустимых неканонических адресов, просто игнорируя верхние 16 бит. Таким образом, в процессе спекулятивного выполнения кода процессор всегда использует только нижние 48 бит, а проверка допустимости адреса производится отдельно. Если при трансляции неканонического виртуального адреса в физический адрес в буфере ассоциативной трансляции (TLB) будет выявлено совпадение канонической части адреса, то спекулятивная операция load вернёт значение без учёта содержимого верхних 16 бит, что позволяет обойти разделение памяти между потоками. В последствии операция будет признана недопустимой и отброшена, но обращение к памяти будет выполнено и данные осядут в кэше.
В ходе эксперимента при использовании техники определения содержимого кэша FLUSH+RELOAD исследователям удалось организовать канал для скрытой передачи данных со скоростью 125 байт в секунду.
Кроме чипов AMD проблема также затрагивает и все процессоры Intel, подверженные классической уязвимости Meltdown. Для защиты от нового вида атаки могут применяться те же методы, которые помогают блокировать атаки Meltdown, такие как использование инструкций LFENCE. Например, если процессор Intel включает аппаратную защиту от Meltdown или в системе включена программная защита, то подобные конфигурации не подвержены новому варианту атаки.
При этом исследователи отмечают, что по сравнению с процессорами Intel архитектура процессоров AMD ограничивает возможность проведения реальных атак, но не исключает применение нового метода в комбинации с другими микроархитектурными атаками для повышения их эффективности. В частности, предложенный вариант атаки не позволяет определить содержимое областей памяти ядра и других процессов, а ограничивается возможностью получить доступ к другим потокам той же программы, выполняемым в одном пространстве виртуальной памяти.
Так как программа из без уязвимости имеет возможность получить доступ к своим потокам, то с практической стороны метод представляет интерес для обхода sandbox-изоляции и организации вмешательства в работу других потоков в программах, допускающих выполнение стороннего кода, таких как web-браузеры и JIT-движки. Исследователи изучили подверженность атаке JavaScript-движка SpiderMonkey и ядра Linux, но не нашли уязвимых последовательностей кода, при помощи которых можно было бы совершить атаку. Помимо атаки на приложения метод также может применяться для форсирования недопустимых потоков данных между микроархитектурными элементами процессора в процессе эксплуатации других микроархитектурных уязвимостей.