Skip to content
KitploitKITPLOIT
ИнструментыЭксплойтыБлог
Log in
Отправить
ИнструментыЭксплойтыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

ЛентыКонтактыКонфиденциальность© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
vbox-hgcm-ssm-cparms — VirtualBox 7.2.20 — высокий уровень — локальная — переполнение кучи — HGCM SSM cParms wrap | Kitploit
Инструменты/GitHubGitHub/abraxas/vbox-hgcm-ssm-cparms
Криминалистика памятиАнализ уязвимостейЭксплуатацияВиртуализация для безопасностиСтатьи и ИсследованияЭксплуатация Бинарных ФайловЛаборатории и Практика
GitHubabraxas/vbox-hgcm-ssm-cparms

vbox-hgcm-ssm-cparms

VirtualBox 7.2.20 — высокий уровень — локальная — переполнение кучи — HGCM SSM cParms wrap

Репозиторий
32 дней назадЕщё не проверено

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

Abraxas Labs - vbox-hgcm-ssm-cparms

abraxaslabs.tech  ·  github.com/abraxas  ·  @abraxas_null  ·  [email protected]  ·  vbox-hgcm-ssm-cparms

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.

IDCVE пока нет
КлассПереполнение кучи (запись за границы в процессе ВМ; не побег из гостя в ядро хоста)
ДоступЛокальный (хост) (UI:R восстановление сохранённого состояния / снимка)
CWECWE-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.

Чего этот остаток не даёт

  • Не guest-to-host. Живой vmmdevR3HgcmCallAlloc по-прежнему отвергает cParms > 32 (VMMDevHGCM.cpp:921-926). Гость не может внедрить переполнение через легитимный Save.
  • Ядро хоста. Другие VM. VBoxSVC.
  • Файлы хоста. Windows restricted-token / AppContainer. Project Zero IDispatch 544666386 является публичным и не относится к этому остатку.
  • Переполнение размера аргумента живого HGCM (живой сток CVE-2013-5892). Эта запись закрыта на данном пине (VMMDEV_MAX_HGCM_PARMS 32, VMMDEV_MAX_HGCM_DATA_SIZE 128MiB).
  • Соседний memcpy 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
Скачать инструмент