
Анализ уязвимости CVE‑2025‑62592 в Oracle VirtualBox для macOS
9 сентября 2024 года была опубликована версия VirtualBox 7.1.0 с поддержкой процессоров ARM для macOS. В качестве виртуальных графических адаптеров для этой версии, кроме классических VBoxSVGA и VMSVGA, был выбран QemuRamFB. Последний использовался и раньше: он был одним из возможных графических адаптеров в VBoxBFE, утилите для управления виртуальными машинами VirtualBox. Однако в 2016 году VBoxBFE была признана устаревшей, и ее поддержка, как и поддержка QemuRamFB, была прекращена. Так и продолжалось вплоть до 7.1.0, когда Oracle решила воскресить забытый графический адаптер и добавить его в версию для macOS под ARM.
В 2025 году специалисты группы исследования уязвимостей BI.ZONE Павел Блинников и Андрей Чижов проанализировали QemuRamFB и нашли уязвимость, позволяющую читать неограниченное количество памяти за пределами массива. В этой статье мы расскажем, как нашли эту уязвимость, как она работает, а еще как отлаживать приложения для macOS и разрабатывать для них эксплоиты.
В macOS нельзя отлаживать процесс без наличия определенных разрешений. Есть два способа разрешить отладку исполняемого файла:
- Патчинг прав (entitlements), после чего нужно переподписать приложение.
- Выключение SIP (System Integrity Protection) через Recovery Mode.
Первый способ модифицирует исполняемый файл, а потому не подходит нам из‑за особенностей харденинга VirtualBox: драйвер ядра проверяет подпись приложения, которое с ним общается. После модификации подпись будет некорректна, поэтому VirtualBox не будет работать. Нам остается только второй способ, для которого необходим физический Mac, в облаке так сделать не получится.
Чтобы отключить SIP, нам нужно войти в Recovery Mode. Для этого отключаем Mac, после чего зажимаем комбинацию клавиш Command (⌘) + R. Затем открываем терминал и вписываем команду: csrutil disable
.
Следующая проблема, с которой мы столкнулись, — неинтуитивность lldb. Человеку, привыкшему работать с gdb, сложно перейти на lldb без последствий. К счастью, не так давно (в версии 2025.01.20) в pwndbg появилась поддержка lldb. Это позволяет нам отлаживать Mach-O, используя привычный инструмент.
Рассмотрим код QemuRamFB. Этот девайс регистрирует MMIO-регион, обработчик для чтения и записи в него:

Функция qemuFwCfgItemSelect
позволяет нам выбрать позицию для дальнейшей конфигурации (configuration item) из следующих:

После выбора дальнейшая коммуникация может происходить с помощью обработчика на чтение qemuFwCfgMmioRead
. Мы можем читать данные из выбранного элемента при помощи соответственных функций pfnRead
. К примеру, для QEMU_FW_CFG_ITEM_SIGNATURE
будет вызвана функция qemuFwCfgR3ReadSimple
. Ее код приведен ниже:

Таким образом, qemuFwCfgR3ReadSimple
просто копирует данные из некого массива pThis->u.ab
в ответ на чтение из MMIO-региона. Размер массива устанавливается в функции pfnSetup
и для QEMU_FW_CFG_ITEM_SIGNATURE
равен 4. Рассмотрим, как обработчик MMIO вызывает qemuFwCfgR3ReadSimple
:

После успешного чтения из переменной cbCfgItemLeft
вычитается значение cbRead
, равное cb
(установлено функцией qemuFwCfgR3ReadSimple
). Здесь важно заметить, что cb
— это размер чтения из MMIO-региона. В данном случае он не может быть больше 8, но, кроме этого, может быть равен 1, 2 или 4.
Итак, мы подходим к идее уязвимости: нет никаких проверок на то, что в момент чтения cb
не больше, чем cbCfgItemLeft
. Кроме обычного превышения (4 < 8), мы можем читать последовательно, например: 4 − 1 = 3, 3 − 4 < 0. Таким образом, мы можем вычесть из переменной cbCfgItemLeft
значение больше, чем она сама, получая в ней Integer Underflow. Это приведет к тому, что offCfgItemNext
фактически становится произвольным, позволяя нам неограниченно читать данные за границей массива pThis->u.ab
. Это ведет к утечке рандомизированных базовых адресов и открывает нам возможности для дальнейшей эксплуатации VirtualBox (к примеру, с помощью CVE‑2025‑61760, обнаруженной нами и также исправленной 21 октября 2025 года).
В качестве гостевой ОС мы выбрали Ubuntu Server for ARM. Для эксплуатации нам необходимо читать и писать в физическую память гостя, что возможно только на уровне ядра. Для подобных задач обычно используют chipsec, однако у нас уже был разработан небольшой драйвер для работы с физической памятью. Мы выложили его в open sourse и назвали phyzone. Он позволяет взаимодействовать с физической памятью при помощи вызовов ioctl, вот пример его использования.
После компиляции и установки phyzone мы можем приступать к разработке эксплоита, однако нам необходимо знать базовый адрес MMIO-региона QemuRamFB. Для этого выполним следующую команду:

Отлично, наш базовый адрес — 0xffddf000. Эксплоит будет выглядеть следующим образом:

При запуске он выведет следующее:

Осталось только проверить, есть ли в этом выводе настоящие адреса процесса VirtualBox. Для этого воспользуемся pwndbg-lldb
:

Адреса 0×114810280 и 0×16fbe3000 «прилегают» к адресам исполняемого файла VirtualBoxVM и динамических библиотек. Таким образом, зная эти адреса, можно посчитать значения баз всех исполняемых файлов процесса, что открывает широкие возможности для дальнейшей эксплуатации.
Мы нашли CVE-2025-62592 во время чтения патчей версии VirtualBox 7.1.6: без применения фаззинга и статического анализа, просто методом пристального взгляда. По нашему мнению, это стало возможно благодаря тому, что Oracle вернула из 2016 года виртуальный девайс, который был неинтересен исследователям на протяжении многих лет, а теперь он является одним из возможных графических адаптеров на macOS. QemuRamFB перепрыгнул 9 лет развития application security и прибыл к нам в 2025 году в том виде, в котором его и оставили в статусе deprecated 9 лет назад.