
VirtualBox 7.2.20 — высокий уровень — локальная — переполнение кучи — HGCM SSM cParms wrap
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · vbox-hgcm-ssm-cparms
Класс: переполнение кучи Доступ: локальный (хост)
Oracle VM VirtualBox OSS 7.2.20 (f2792cf44) — Oracle
Работающий HGCM по-прежнему отклоняет cParms > 32. Загрузка сохранённого состояния — нет. vmmdevR3HgcmLoadState читает cParms из .sav без ограничения VMMDEV_MAX_HGCM_PARMS, а затем вычисляет размер команды через uint32_t cbCmd. При cParms = 0x4000000 это произведение переполняется до sizeof(VBOXHGCMCMD) (~120). Первая запись enmType уже представляет собой 4-байтовую запись за пределами блока.
Пользователь хоста, восстанавливающий враждебное сохранённое состояние, вызывает переполнение кучи процесса ВМ. Гость не может внедрить это через Save.
| ID | CVE пока нет |
| Класс | Переполнение кучи (запись за границы в процессе ВМ; не побег из гостя в ядро хоста) |
| Доступ | Локальный (хост) (UI:R восстановление сохранённого состояния / снимка) |
| CWE | CWE-190, CWE-787 |
| CVSS | Высокий: 7.8 CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H |
| Продукт | VirtualBox OSS |
| Затронуто | 7.2.20 (f2792cf44f663989818507e36d3db5f978523c5e) |
| Аутентификация | пользователь хоста восстанавливает сохранённую ВМ, снимок или .sav |
| Лицензия | GNU Affero GPL v3.0 |
| Лаборатория | только 127.0.0.1. Исходный стенд. Без загрузки VirtualBox, без разбора .sav. |
Передать оператору папку ВМ, сохранённое состояние которой содержит отложенный вызов VMMDev HGCM CALL. Оператор нажимает Start для сохранённой ВМ, восстанавливает снимок или принимает .sav. Восстановление консоли проходит через SSMR3 в vmmdevR3LoadExec, затем в vmmdevR3HgcmLoadState. Это UI:R. Остаточная уязвимость — в парсере, а не в гипервызове гостя.
VMMDev включён по умолчанию. Без 3D. Без Guest Additions. Без VRDP. Не PUEL.
| Шаг | Где | Что это даёт |
|---|---|---|
| Восстановление | UI хоста / VBoxManage startvm для сохранённой ВМ | Пользователь хоста открывает враждебный .sav. Это единственный необходимый клик. |
| SSM-модуль | VMMDev vmmdevR3HgcmLoadState (VMMDevHGCM.cpp:2043-2091) | SSMGetU32 в cParms без ограничения VMMDEV_MAX_HGCM_PARMS (32). |
| Переполнение при выделении | vmmdevR3HgcmCmdAlloc (VMMDevHGCM.cpp:376-381) | uint32_t cbCmd = sizeof(VBOXHGCMCMD) + cParms * (40+24). При cParms = 0x4000000 переполняется до ~120. RTMemAllocZ такого размера успешно выполняется в пределах бюджета кучи. |
| Первая запись | цикл загрузки paGuestParms[i].enmType (VMMDevHGCM.cpp:2085-2091) | paGuestParms равен pCmd + sizeof(VBOXHGCMCMD), что после переполнения уже является концом выделенного блока. Первый dword типа — это 4-байтовая запись за границы. Потоку нужен только заголовок CALL плюс один тип параметра. Ему не нужно 67 миллионов записей. |
| Тип | Происхождение | Что получает атакующий |
|---|---|---|
| Разведка | нет | Байты переполнения выбираются sav. Это не утечка. Содержимое кучи не возвращается в файл. |
| Целостность | доказано в лаборатории | cParms=0x4000000 переполняет uint32_t cbCmd до 120. Одна запись enmType при i=0 разрушает канарейку 0xA5. canary0=56424f58 — это префикс VBOX из VBOX-HGCM-SSM-CPARMS-WITNESS. Контрольный cParms=2 оставляет канарейку нетронутой. |
| Целостность | выведено | Дальнейшие управляемые через sav записи параметров (dword типа плюс 32/64-битные поля или поля-описатели указателей) пишутся линейно за пределами ~120-байтового RTMemAllocZ в VirtualBoxVM / VBoxHeadless. Это примитив записи в процессе VM, того же класса, что memcorr миграции QEMU. Этот пакет не демонстрирует контроля над указателем инструкций. |
| Доступность | выведено | Падение VBoxVM, если разрушение не превращено в контролируемую запись. Харнесс — это разрушение канарейки, а не падение процесса VirtualBox. |
vmmdevR3HgcmCallAlloc по-прежнему отвергает cParms > 32 (VMMDevHGCM.cpp:921-926). Гость не может внедрить переполнение через легитимный Save.VMMDEV_MAX_HGCM_PARMS 32, VMMDEV_MAX_HGCM_DATA_SIZE 128MiB).offValue / cbValue при завершении — это вторая запись в кучу хоста, только если клиенты HGCM восстанавливаются в том же sav. Это не данная лаборатория.Полный host-user / host-kernel по-прежнему требует остатка от харденинга. Комбинирование этого разрушения с публичным обходом IDispatch отброшено.
Я зафиксировал тег v7.2.20 репозитория VirtualBox/virtualbox, peel f2792cf44. Живой HGCM был первым, что я прочитал, потому что CVE-2013-5892 относился к этому классу: переполнение размера аргумента в VBOXHGCMCMD. Живой путь по-прежнему имеет ограничение:
ASSERT_GUEST_STMT_RETURN( cParms <= (cbHGCMCall - sizeof(VMMDevHGCMCall)) / cbHGCMParmStruct
&& cParms <= VMMDEV_MAX_HGCM_PARMS,
LogRelMax(50, ("VMMDev: request packet with invalid number of HGCM parameters: ...")),
VERR_INVALID_PARAMETER);
Загрузка не выполняется. vmmdevR3HgcmLoadState берёт cParms из sav и вызывает тот же аллокатор:
const uint32_t cbCmd = sizeof(VBOXHGCMCMD) + cParms * (sizeof(VBOXHGCMGUESTPARM) + sizeof(VBOXHGCMSVCPARM))
+ (enmCmdType == VBOXHGCMCMDTYPE_CONNECT ? sizeof(HGCMServiceLocation) : 0);
AssertCompile в комментариях к этому пину указывает CMD = 120, guestparm = 40, svcparm = 24. cParms = 0x4000000 делает 64-битное произведение равным 0x100000000 + 120. При сохранении в uint32_t остаётся 120. Затем:
for (i = 0; i < cParms; ++i)
{
VBOXHGCMGUESTPARM * const pGuestParm = &pCmd->u.call.paGuestParms[i];
rc = pHlp->pfnSSMGetU32(pSSM, &u32);
pGuestParm->enmType = (HGCMFunctionParameterType)u32;
paGuestParms находится по адресу pCmd + sizeof(VBOXHGCMCMD). После переполнения это конец выделенной области. Первая запись уже выходит за границы.
Уже зафиксированные ошибочные пути: трактовка живого HGCM как остатка (он всё ещё ограничен 32); перебор 67 миллионов записей в стенде (первый dword — это доказательство); утверждение, что гость может внедрить это через Save; раздувание разрушения кучи процесса VM до побега в ядро хоста; связывание публичного IDispatch.
Театр: обратная оболочка, парсер .sav, загрузка VirtualBox. Оракул — это переполнение плюс разрушение канарейки VBOX-HGCM-SSM-CPARMS-WITNESS.
cd lab
./run.sh
Или из корня пакета:
python3 vbox-hgcm-ssm-cparms-Abraxas-Labs.py