Skip to content
KitploitKITPLOIT
HerramientasBlog
Log in
Enviar
HerramientasBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

FeedsContactoPrivacidad© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
vbox-hgcm-ssm-cparms — VirtualBox 7.2.20 - Alta - Local - Desbordamiento de heap - HGCM SSM cParms wrap | Kitploit
Herramientas/GitHubGitHub/abraxas/vbox-hgcm-ssm-cparms
Forensia de MemoriaAnálisis de VulnerabilidadesExplotaciónVirtualización de SeguridadPapers e InvestigaciónExplotación de BinariosLabs y Práctica
GitHubabraxas/vbox-hgcm-ssm-cparms

vbox-hgcm-ssm-cparms

VirtualBox 7.2.20 - Alta - Local - Desbordamiento de heap - HGCM SSM cParms wrap

Ver Repositorio
3hace 2 díasAún no revisado

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir

Abraxas Labs - vbox-hgcm-ssm-cparms

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

vbox-hgcm-ssm-cparms

Clase: Desbordamiento de heap Alcance: Local (host)

Oracle VM VirtualBox OSS 7.2.20 (f2792cf44) - Oracle

El HGCM en vivo sigue rechazando cParms > 32. La carga de estado guardado no. vmmdevR3HgcmLoadState lee cParms del .sav sin ningún límite VMMDEV_MAX_HGCM_PARMS, y luego dimensiona el comando con uint32_t cbCmd. Con cParms = 0x4000000 ese producto se desborda hasta sizeof(VBOXHGCMCMD) (~120). El primer almacenamiento de enmType ya es una escritura de 4 bytes más allá del bloque.

Un usuario del host que restaura un estado guardado hostil desborda el heap del proceso de la VM. Un invitado no puede plantar esto mediante Save.

IDaún sin CVE
ClaseDesbordamiento de heap (escritura fuera de límites en el proceso de la VM; no es un escape al kernel del host)
AlcanceLocal (host) (UI:R restauración de estado guardado / snapshot)
CWECWE-190, CWE-787
CVSSAlto: 7.8 CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H
ProductoVirtualBox OSS
Afectado7.2.20 (f2792cf44f663989818507e36d3db5f978523c5e)
Autenticaciónusuario del host restaura una VM guardada, un snapshot o un .sav
LicenciaGNU Affero GPL v3.0
Laboratoriosolo 127.0.0.1. Arnés de código fuente. Sin arranque de VirtualBox, sin análisis de .sav.

Qué puede hacer un atacante

Entregar al operador una carpeta de VM cuyo estado guardado lleva una llamada CALL de VMMDev HGCM pendiente. El operador hace clic en Start sobre una VM guardada, restaura un snapshot o adopta el .sav. La restauración de la consola recorre SSMR3 hasta vmmdevR3LoadExec y luego hasta vmmdevR3HgcmLoadState. Eso es UI:R. El residuo es el analizador, no una hiperllamada del invitado.

VMMDev está activado por defecto. Sin 3D. Sin Guest Additions. Sin VRDP. No es PUEL.

Método y sink

PasoDóndeQué otorga
RestauraciónUI del host / VBoxManage startvm sobre una VM guardadaEl usuario del host abre el .sav hostil. Ese es el único clic necesario.
Unidad SSMVMMDev vmmdevR3HgcmLoadState (VMMDevHGCM.cpp:2043-2091)SSMGetU32 hacia cParms sin límite VMMDEV_MAX_HGCM_PARMS (32).
Desbordamiento de asignaciónvmmdevR3HgcmCmdAlloc (VMMDevHGCM.cpp:376-381)uint32_t cbCmd = sizeof(VBOXHGCMCMD) + cParms * (40+24). cParms = 0x4000000 se desborda hasta ~120. RTMemAllocZ de ese tamaño tiene éxito frente al presupuesto del heap.
Primer almacenamientobucle de carga paGuestParms[i].enmType (VMMDevHGCM.cpp:2085-2091)paGuestParms es pCmd + sizeof(VBOXHGCMCMD), que ya es el final de la asignación tras el desbordamiento. El primer dword de tipo es una escritura fuera de límites de 4 bytes. El flujo solo necesita la cabecera CALL más un tipo de parámetro. No necesita 67 millones de registros.

Privilegios

TipoProcedenciaQué obtiene el atacante
ReconocimientoningunaLos bytes de desbordamiento son elegidos por el sav. Esto no es una fuga. El contenido del heap no se devuelve al archivo.
Integridadprobado en laboratoriocParms=0x4000000 envuelve uint32_t cbCmd a 120. Un almacenamiento enmType con i=0 destruye un canario 0xA5. canary0=56424f58 es el prefijo VBOX de VBOX-HGCM-SSM-CPARMS-WITNESS. El control cParms=2 deja el canario intacto.
IntegridadinferidoPosteriores registros de parm controlados por el sav (dword de tipo más campos de 32/64 bits o descriptores de puntero) escriben linealmente fuera del RTMemAllocZ de ~120 bytes en VirtualBoxVM / VBoxHeadless. Eso es una primitiva de escritura en el proceso de la VM, de la misma clase que la memcorr de migración de QEMU. Este paquete no demuestra control del puntero de instrucción.
DisponibilidadinferidoCaída de VBoxVM si la destrucción no se convierte en una escritura controlada. El arnés es una destrucción de canario, no una caída del proceso de VirtualBox.

Qué no concede este remanente

  • No es de invitado a anfitrión. El vmmdevR3HgcmCallAlloc en vivo sigue rechazando cParms > 32 (VMMDevHGCM.cpp:921-926). Un invitado no puede plantar la envoltura mediante un Save legítimo.
  • Kernel del anfitrión. Otras VMs. VBoxSVC.
  • Archivos del anfitrión. Token restringido de Windows / AppContainer. El IDispatch 544666386 de Project Zero es público y no es este remanente.
  • Envoltura del tamaño de argumentos de HGCM en vivo (sumidero en vivo de CVE-2013-5892). Esa entrada está cerrada en este pin (VMMDEV_MAX_HGCM_PARMS 32, VMMDEV_MAX_HGCM_DATA_SIZE 128MiB).
  • El memcpy hermano de offValue / cbValue al completarse es una segunda escritura en el heap del anfitrión solo si los clientes HGCM restauran en el mismo sav. No es este laboratorio.

El host-user / host-kernel completo todavía necesita un remanente de endurecimiento. Combinar esta destrucción con el bypass público de IDispatch queda descartado.

Cómo lo encontré

Fijé la etiqueta v7.2.20 de VirtualBox/virtualbox con peel f2792cf44. Lo primero que leí fue el HGCM en vivo porque CVE-2013-5892 era de esta clase: envoltura del tamaño de argumentos en VBOXHGCMCMD. La ruta en vivo todavía tiene el límite:

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);

Load no lo hace. vmmdevR3HgcmLoadState toma cParms del sav y llama al mismo asignador:

const uint32_t cbCmd = sizeof(VBOXHGCMCMD) + cParms * (sizeof(VBOXHGCMGUESTPARM) + sizeof(VBOXHGCMSVCPARM))
                     + (enmCmdType == VBOXHGCMCMDTYPE_CONNECT ? sizeof(HGCMServiceLocation) : 0);

AssertCompile comenta en este pin que CMD está en 120, guestparm en 40, svcparm en 24. cParms = 0x4000000 hace que el producto de 64 bits sea 0x100000000 + 120. El almacenamiento en uint32_t conserva 120. Luego:

for (i = 0; i < cParms; ++i)
{
    VBOXHGCMGUESTPARM * const pGuestParm = &pCmd->u.call.paGuestParms[i];
    rc = pHlp->pfnSSMGetU32(pSSM, &u32);
    pGuestParm->enmType = (HGCMFunctionParameterType)u32;

paGuestParms se encuentra en pCmd + sizeof(VBOXHGCMCMD). Tras el desbordamiento circular, ese es el final de la asignación. El primer almacenamiento ya está fuera de límites.

Desvíos erróneos ya registrados: tratar el HGCM activo como el residuo (sigue limitado a 32); recorrer 67 millones de almacenamientos en el arnés (el primer dword es la prueba); afirmar que un invitado puede implantar esto mediante Save; inflar el aplastamiento del heap del proceso de la VM hasta un escape al kernel del host; encadenar IDispatch público.

Descargar herramienta