В коде KVM для ARM64 обнаружена ошибка, из-за которой гостевая виртуальная машина может читать и записывать память ядра хоста. Уязвимость отслеживается как CVE-2026-89775 и исправлена в Linux 6.18.51, 7.2.5 и 7.3-rc1. Исследователь Хюнву Ким, раскрывший проблему 16 сентября, утверждает, что её можно использовать для выхода из гостя и выполнения кода на хосте.
Уязвимость проявляется только на ARM64-хостах с включённой вложенной виртуализациейрежим, при котором гость запускает собственный гипервизор и может размещать внутри себя виртуальные машины — экспериментальным режимом, который по умолчанию выключен.
Что именно ломается
Когда гость определённым образом организует свою память, вычисление размера даёт ноль, и шаг, который должен очищать устаревшие записи из кэша адресов процессора (TLB invalidationсброс устаревших записей трансляции адресов из буфера процессора), пропускается. Освобождённая страница памяти хоста остаётся отображённой и доступной для записи, и гость может читать и записывать её по 64 бита за раз без аппаратной ловушки, возвращающей управление хосту.
Сопровождающий, проверявший и тестировавший исправление, указал, что пропущенная инвалидация начинается только с v6.17. По его словам, хост на 6.16 содержит код, но не то поведение, которое нужно атакующему.
Как устроена трансляция stage-2
Доступ гостя к памяти хоста проходит через обработку stage-2 faultисключение при обращении гостя к адресу, для которого гипервизор ещё не установил трансляцию второго уровня. При таком обращении гипервизор вычисляет права доступа и устанавливает отображение.
Права вычисляются так: базовое право чтения устанавливается безусловно, а запись добавляется только если память помечена как записываемая и выполнено одно из условий — это устройство или произошёл write fault. Для вложенной виртуализации права урезаются по гостевой трансляции. Право исполнения добавляется при exec fault. Атрибуты памяти (device или normal-nc) выставляются по флагам VMA, а при отсутствии non-cacheable добавляется право исполнения.
Недопустимые комбинации атрибутов отклоняются: DEVICE и NORMAL_NC вместе возвращают -EINVAL, и каждая из них вместе с правом исполнения — тоже.
Почему это стало возможно
Корень проблемы авторы описывают как пропуск шага инвалидации TLB. Это происходит, когда вычисление размера даёт ноль. В результате освобождённая страница памяти хоста остаётся отображённой и доступной для записи.
Ранее сообщалось о похожей проблеме: при определённой раскладке памяти гостя вычисление размера давало ноль, из-за чего пропускалась инвалидация TLB, и освобождённая страница памяти хоста оставалась отображённой и доступной гостю на чтение и запись.
Второй путь эксплуатации
Помимо выхода из гостя, есть второй способ. На системах, где любой пользователь может открыть /dev/kvm — устройство, которое программа использует для создания виртуальной машины, — локальный пользователь может собрать гостя и с помощью той же ошибки получить root. Ким указывает на Red Hat Enterprise Linux, где это устройство по умолчанию открыто всем пользователям. Этот путь всё равно требует, чтобы на хосте была включена вложенная виртуализация.
Ограничения по конфигурации
Использование huge pagesбольших страниц памяти, покрывающих сразу крупный диапазон адресов (block mappings) в stage-2 ограничено: крупное отображение требует поддержки block mapping на данном уровне таблицы страниц, достаточной гранулы и выравнивания физического и виртуального адресов. Для host stage-2 принудительно используются page-levelотображения уровня отдельной страницы для всего, кроме RWX-памятипамяти, доступной одновременно для чтения, записи и исполнения и RW-MMIOобластей ввода-вывода с отображённой памятью, доступных для чтения и записи, чтобы не потерять состояние при разбиении крупного отображения.
Наличие stage-2 проявляется в том, что права теневой stage-2 понижаются в соответствии с вложенной трансляцией гостя: если вложенная трансляция не разрешает запись или чтение, соответствующие права снимаются. Кроме того, при permission faultобращении гостя к памяти, отображённой без нужного права доступа кэш памяти не пополняется, а при обычном faultобращении гостя к отсутствующему отображению — пополняется.
Затронутые версии
Исправление в upstream-ядре выпущено в Linux 6.18.51, 7.2.5 и 7.3-rc1. Запись самого ядра указывает, что уязвимый код присутствует с Linux 6.16, но нужного для атаки поведения там нет.
Статус в дистрибутивах по состоянию на 22 сентября:
- Red Hat Enterprise Linux — ядро версии 10 затронуто, версии с 6 по 9 не затронуты.
- Ubuntu — 26.04, включая ядра AWS, Azure и GCP, уязвимо; общее ядро 24.04 LTS не затронуто, но его более новые ядра с поддержкой оборудования (6.17, 7.0) уязвимы.
- Amazon Linux — для пакета kernel6.18 в AL2023 исправление ожидается, остальные ядра не затронуты.
- Debian — bookworm и trixie не затронуты (код отсутствует), sid исправлен в 7.2.6-1, forky уязвим.
Что это меняет на практике
Опасность возникает только на ARM64-хостах KVM с включённой вложенной виртуализацией. Это экспериментальный режим, включаемый при загрузке, требующий Armv8.4, и по умолчанию он выключен — обычный хост вне пути атаки.
Для мультитенантности и облаков вопрос в том, предлагают ли провайдеры нужную конфигурацию. AWS указывает для вложенной виртуализации только инстансы на Intel, а Google Cloud исключает из неё свои ARM-виртуальные машины, поэтому в их стандартных ARM-предложениях этот конкретный путь не открыт. Это не чистое заключение о безопасности этих платформ, но конкретный путь данной уязвимости в их стандартных ARM-решениях не экспонирован.
Для CI с /dev/kvm опасность в том, что при открытом всем устройстве и включённой вложенной виртуализации локальный пользователь может получить root на хосте.
Оценки и открытые вопросы
Вендоры оценивают уязвимость от 7.8 до 9.3 из 10, соглашаясь, что воздействие высокое, а атака локальная. Ubuntu показывает оценку 9.3, но устанавливает собственный приоритет «medium». По состоянию на 22 сентября уязвимость не входила в каталог эксплуатируемых уязвимостей CISA, а прогнозируемая оценка эксплуатации была ниже 1%. Код эксплойта не опубликован, признаков использования в атаках нет.
Для хостов, которые ещё не могут быть пропатчены, Red Hat заявляет, что ни одна мера не соответствует критериям обходного решения.
CVE-2026-89775 — четвёртый раскрытый Кимом случай побега из гостя в хост в KVM за год. Два из них относились к x86-версии: Januscape в июле и Zapscape в августе. Наиболее близким аналогом назван ITScape — побег из ARM64 KVM, опубликованный в июне и названный первым таким публично показанным на ARM64.