Уязвимость QEMUtiny в эмуляторе QEMU позволяет выйти за пределы гостевой системы и получить root-доступ к хосту

QEMU

Исследователи из команды V12 сообщили о двух связанных уязвимостях в коде эмуляции устройства CXL (Compute Express Link) в QEMU. Эти проблемы получили кодовое имя QEMUtiny. Атакующий, имеющий доступ к гостевой операционной системе, может объединить их в одну цепочку эксплуатации. В результате злоумышленник получает возможность выполнить произвольный код на уровне хоста, то есть выйти за пределы виртуальной машины.

Обе уязвимости обнаружены в файле "hw/cxl/cxl-mailbox-utils.c". Первая проблема проявляется начиная с выпуска QEMU 7.1.0. Она приводит к чтению памяти за пределами выделенного буфера. Причина в том, что функция "cmd_logs_get_log()" ошибочно трактует запрошенное смещение CEL-лога как индекс в массиве, хотя фактически это значение задаётся в байтах. Вторая уязвимость появилась в QEMU 11.0.0. Она связана с переполнением буфера в функции "cmd_features_set_feature()". Функция обрабатывает смещение на структуры при записи атрибутов, но не проверяет, укладывается ли вычисленное значение "смещение плюс размер копируемых данных" в границы выбранной структуры.

Атака возможна только на ветку QEMU 11.0.0. Именно в ней присутствуют обе уязвимости, позволяющие реализовать полную цепочку эксплуатации. Информацию об уязвимостях передали разработчикам QEMU. Те ответили, что поддержка устройства CXL реализована не для использования при виртуализации. Исправление пока не выпущено.

Исследователи подготовили эксплоит, который работает на кодовой базе QEMU от 11 мая 2026 года с последним коммитом 5e61afe. Эксплоит зависит от раскладки структур в памяти конкретной сборки QEMU и системной библиотеки libc. Однако авторы отмечают, что первая уязвимость позволяет сканировать память и, соответственно, создать универсальную версию эксплоита, совместимую с разными версиями QEMU.

Как работает атака

Для эксплуатации злоумышленник должен иметь права root внутри гостевой системы. Это необходимо, чтобы манипулировать конфигурационным пространством PCI и отображать в память окно регистров BAR (Base Address Register) эмулированного устройства CXL. Эксплоит обращается к устройству через файловую систему sysfs по адресу "/sys/bus/pci/devices/0000:35:00.0".

Сначала гостевая система отображает в память окно регистров BAR2 устройства CXL. Затем отправляются специально сформированные команды почтового ящика CXL. Первая команда вызывает чтение за пределами буфера CEL-лога. Она извлекает размещённый рядом с ним указатель на обработчик команд почтового ящика и адрес структуры CXLType3Dev в куче. Указатель на обработчик позволяет вычислить базовый адрес позиционно-независимого кода QEMU. Так злоумышленник узнаёт раскладку памяти хоста.

Вторая команда использует уязвимость записи за пределами буфера. Она отправляет запрос SET_FEATURE для подфункции RANK_SPARING с ненулевым смещением и большим объёмом данных. Данные копируются в массив атрибутов, не ограниченный по размеру. В результате переполнение захватывает соседние поля структуры CXLType3Dev. Злоумышленник подменяет состояние диспетчера памяти, необходимое для обработки фоновых операций, таких как очистка носителя.

После подмены данных эксплоит инициирует фоновую операцию SANITIZE. Когда рабочий поток очистки достигает вызова "address_space_set()", он использует подменённое состояние диспетчера и вызывает функцию обратного вызова, записанную злоумышленником. Сначала эта функция вызывает "memmove()", что позволяет уточнить адрес библиотеки libc в памяти хоста. Затем указатель перенаправляется на функцию "system("/bin/bash")". Так атакующий получает интерактивную оболочку с правами пользователя, от которого запущен процесс QEMU на хосте.

Затронутые версии

Первая уязвимость присутствует во всех версиях QEMU начиная с 7.1.0. Вторая уязвимость добавлена в QEMU 11.0.0. Таким образом, цепочка QEMUtiny актуальна только для QEMU 11.0.0 и новее. Исследователи также отмечают, что уязвимость записи затрагивает не только подфункцию RANK_SPARING. Запись за пределами буфера возможна и для путей PPR (Poison Partial Recovery) и других подфункций sparing. При этом для подфункции PATROL_SCRUB проверка границ уже реализована.

Последствия для безопасности

Уязвимость QEMUtiny представляет собой классический сценарий выхода за пределы виртуальной машины. Если злоумышленник получает возможность выполнить код в гостевой системе, он может перехватить управление хостом. Это особенно критично для облачных провайдеров и платформ виртуализации, где несколько клиентов используют один физический сервер. Успешная атака позволяет похитить данные других виртуальных машин, изменить конфигурацию сети или установить вредоносное ПО на узел-хост.

Что делать администраторам

На данный момент официальное исправление отсутствует. Разработчики QEMU указали, что эмуляция CXL в текущем виде не предназначена для сценариев виртуализации. Однако это не отменяет факта наличия уязвимости в коде. В качестве временной меры администраторы могут отключить поддержку эмуляции устройства CXL для гостевых систем. Для этого достаточно не добавлять устройство CXL Type-3 в конфигурацию виртуальной машины. Если использование CXL необходимо, следует дождаться выхода исправления и незамедлительно применить его. Также стоит ограничить круг пользователей, имеющих доступ к гостевой системе с правами root, чтобы снизить риск эксплуатации.

Ссылки

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