KVM на ARM64 не очищает страницы памяти и позволяет выйти из гостевой системы в хост-окружение

KVM

В ядре Linux исправили уязвимость CVE-2026-89775, из-за которой программа внутри гостевой виртуальной машины получает доступ к памяти хост-окружения. Ошибка находится в подсистеме KVM - гипервизоре, встроенном в ядро. Условия срабатывания узкие: нужна архитектура ARM64 и включённая вложенная виртуализация, когда гостевая система запускает собственный гипервизор. По шкале CVSS 3.1 проблему оценили в 9.3 из 10. Основная аудитория предупреждения - операторы серверов и облачных платформ на ARM, а также администраторы парков на базе RHEL, где доступ к гипервизору открыт по умолчанию.

Уязвимость CVE-2026-89775

Корень ошибки лежит в учёте памяти при работе с буфером трансляции адресов (TLB, область кэша, которая хранит перевод виртуальных адресов в физические). Гипервизор время от времени сбрасывает часть записей в этом буфере, и ему нужно знать размер области, которую затрагивает сброс. Для гостевых таблиц страниц размер выводится из уровня отображения и базового размера блока памяти. Расчёт опирается на предположение, что блок управления памятью у гостя включён.

Когда блок управления памятью выключен, ядро помечает это отдельным отрицательным значением уровня. Пересчёт уровня в размер отрицательные значения не разбирает: код сразу приводит число к беззнаковому байту и смотрит только два младших бита. В результате размер области получается нулевым. Ноль в этой логике означает, что величина неизвестна. Функция освобождения страниц трактует его как настоящее значение и не стирает ничего. Память остаётся нетронутой.

Последствия ощутимы. Страницы, которые должны были перейти новому владельцу уже очищенными, сохраняют прежнее содержимое. Гостевая система читает данные, к которым доступа иметь не должна, и может испортить чужие структуры в памяти. В худшем случае это даёт выход за пределы виртуальной машины и влияние на соседние экземпляры.

Практический риск зависит от того, что осталось в уцелевших страницах. В многоарендной среде там могут лежать ключи шифрования, содержимое файлов или сетевые буферы соседнего клиента. Сброс записей в буфере трансляции адресов идёт рутинно, поэтому повторяемость сценария высокая. Атака при этом не требует сетевого доступа и действий пользователя: достаточно кода, запущенного в гостевой системе.

Вторая линия риска связана с устройством /dev/kvm. Через него непривилегированные пользователи получают доступ к интерфейсу гипервизора, а в RHEL такие права выданы по умолчанию. Если уязвимость срабатывает на локальной машине, обладатель обычной учётной записи поднимает свои привилегии в системе. Поэтому в векторе атаки указаны локальный доступ и смена области безопасности: стартует атакующий в гостевой среде, а последствия получает хост. Оценки влияния на конфиденциальность, целостность и доступность выставлены на максимум.

Сведений об эксплуатации в реальных атаках в бюллетене kernel.org нет. Это не отменяет спешки. Обновления ядра расходятся по инфраструктуре месяцами, а ARM-серверы всё чаще берут на себя задачи, которые раньше решали машины на x86. Вложенную виртуализацию включают в лабораториях, у разработчиков мобильных платформ и в облаках, где клиенту разрешают запускать собственный гипервизор. Каждый такой узел подходит под условие срабатывания. Дополнительная сложность в том, что на системах без вложенной виртуализации уязвимость не проявляется, и часть администраторов может счесть, что их она не касается.

Исправление уже в основной ветке ядра. Разработчики научили пересчёт уровня корректно разбирать отрицательные значения и выдавать осмысленный размер, когда действительного нет. Страницы в такой ситуации очищаются как положено. Проверку сделали общей, чтобы будущие расширения архитектуры с отрицательными уровнями шли тем же путём. По данным бюллетеня kernel.org, уязвимость опубликована 16 сентября 2026 года и разобрана в основной ветке. Дальше патч разойдётся по стабильным выпускам и дистрибутивам, и здесь всё зависит от того, как быстро обновления доедут до конкретных машин.

Администраторам стоит закрыть вопрос на узлах ARM64 с включённой вложенной виртуализацией. Обновление ядра снимает причину. Если вложенная виртуализация не нужна, её разумно выключить: условие срабатывания исчезает целиком. Доступ к /dev/kvm имеет смысл ограничить кругом доверенных процессов и не выдавать его рядовым пользователям. Приложений это не касается, менять их конфигурацию не придётся.

Код гипервизоров для ARM моложе решений для x86, и ошибки в нём находят регулярно. Рост доли ARM в серверном сегменте делает последствия таких ошибок заметнее: один недоучтённый отрицательный уровень превращается в выход за пределы виртуальной машины. Для многоарендных платформ это прямая угроза изоляции клиентов, а изоляция держится на доверии арендаторов к провайдеру. Плановое обновление ядра и аккуратные права на доступ к гипервизору остаются главной защитой.

Ссылки

Комментарии: 0