
VirtualBox 7.2.20 - Crítico - Local - Confusión de tipos / lectura/escritura arbitraria - Superposición SCSI-SPI de CONFIG en SAS1068
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · vbox-lsilogic-sas-config
Clase: Confusión de tipos / lectura/escritura arbitraria Alcance: Local (invitado)
Oracle VM VirtualBox OSS 7.2.20 (f2792cf44f663989818507e36d3db5f978523c5e)
SAS1068 MPT CONFIG trata el puerto SCSI-SPI 0 como una página de 12 bytes. En SAS esa página es la otra mitad de una unión: pManufacturingPage7 más cbManufacturingPage7. Un CONFIG READ del invitado filtra por DMA el puntero del heap. Un CONFIG WRITE implanta el puntero y el tamaño. La página de fabricación 7 luego copia a través del puntero implantado.
El ring3 del invitado sobre un SAS1068 conectado (PDM LsiLogicSas, PCI 1000:0054) obtiene lectura/escritura arbitraria en el proceso de la VM. Eso es el heap de VirtualBoxVM / VBoxHeadless, no un escape al kernel del host.
| ID | aún sin CVE |
| Clase | Confusión de tipos / lectura/escritura arbitraria |
| Alcance | Local (invitado) |
| CWE | CWE-843, CWE-822 |
| CVSS | Crítico: 8.8 CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H |
| Producto | VirtualBox OSS |
| Afectado | 7.2.20 (f2792cf44) |
| Requiere | SAS1068 conectado (PDM LsiLogicSas, PCI 1000:0054) |
| Licencia | GNU Affero GPL v3.0 |
| Laboratorio | arnés de código fuente en loopback |
Método: el ring3 del invitado programa el doorbell MMIO del SAS1068 o la FIFO de peticiones con MPT_MESSAGE_HDR_FUNCTION_CONFIG (0x04), tipo de página SCSI-SPI Port 0 (0x03). El despacho siempre llama al getter de SPI. Solo EXTENDED está condicionado a SAS. El getter de atributos de página está comentado, por lo que la página Readonly Port 0 sigue siendo escribible. SPI Port 0 está empaquetado en 12 bytes y se superpone a SasPages.pManufacturingPage7 (8) más cbManufacturingPage7 (4).
| Privilegio | Tipo | Estado | Qué otorga |
|---|---|---|---|
| CONFIG SCSI-SPI Port 0 READ | reconocimiento | probado en laboratorio | DMA del puntero del heap del proceso de la VM pManufacturingPage7 y su tamaño hacia la RAM del invitado. Entrada para ASLR. |
| CONFIG SCSI-SPI Port 0 WRITE | integridad | probado en laboratorio | implanta un puntero y tamaño elegidos por el invitado sobre esos campos SAS |
| manufacturing page 7 CONFIG READ | integridad | probado en laboratorio | copia bytes del host desde la dirección implantada hacia el GPA del invitado (VBOX-LSILOGIC-SAS-CONFIG-WITNESS) |
| manufacturing page 7 CONFIG WRITE | integridad | inferido del mismo getter | copia bytes del invitado hacia la dirección implantada (escritura arbitraria en VirtualBoxVM) |
| páginas SPI Port 1 / Device 0 | reconocimiento / integridad | superposición inferida | Port 1 filtra/implanta pSASIOUnitPage0; Device 0 page 0 alcanza paPHYs; Device 0 page 1 alcanza pSASDeviceHead |
| puntero implantado arbitrario | disponibilidad | inferido | provoca un fallo del proceso de la VM en el siguiente acceso a página SAS o en lsilogicR3ConfigurationPagesFree |
Adyacentes descartados:
SpiPages es el diseño real; esta confusión de tipos necesita SAS1068)VERR_NOT_FOUND)Esto es lectura/escritura arbitraria en el proceso de la VM, no un escape al kernel del host. El usuario completo del host aún requiere un remanente de endurecimiento. No lo emparejé con una escritura 3D restante: el UAF de VMSVGA DX11 (d691aa68) está cerrado en este pin.
Sin Guest Additions. Sin 3D. Sin VRDP. No es PUEL. Basta con el ring3 del invitado hostil; no se requiere el controlador mpt/mptsas incluido.
Me senté sobre OSS 7.2.20 después del CPU de septiembre de 2026 y recorrí LsiLogic MPT CONFIG. La fuga silenciosa de la pila de respuestas de 2026 ya está cerrada: 122c6880 aplica RT_ZERO a MptReplyUnion en errores de E/S de SCSI. Estaba buscando un remanente de esa clase, no ese sumidero.
El remanente es una unión, no una respuesta de pila:
union {
MptConfigurationPagesSpi SpiPages;
MptConfigurationPagesSas SasPages;
} u; /* DevLsiLogicSCSI.h:3323 */
SAS alloc rellena los punteros de host SasPages y nunca ejecuta la inicialización de página SPI. El getter de puerto SPI en DevLsiLogicSCSI.cpp:2795 no tiene comprobación de enmCtrlType. Los casos SPI del despacho CONFIG no están restringidos. El getter de atributo de página está comentado en cpp:3159. La página de fabricación 7 en cpp:2701 está restringida a SAS, que es la ruta prevista, y desreferencia pManufacturingPage7 sin comprobación de NULL. Así es como un READ/WRITE de Port 0 de tipo SPI se convierte en una fuga y plantación de puntero SAS.
Falsos caminos ya registrados: volver a presentar 122c6880; tratar el LSI53C1030 por defecto como este bug; inflar un crash de puntero salvaje a escape del kernel anfitrión; una VM en vivo cuando el overlay empaquetado es suficiente. Teatro: una reverse shell. El oráculo son los datos de la página dummy CONTROL, luego fuga/plantación/lectura arbitraria de VBOX-LSILOGIC-SAS-CONFIG-WITNESS.
cd lab
./run.sh
O python3 vbox-lsilogic-sas-config-Abraxas-Labs.py. Arnés de origen de las estructuras pin. VirtualBox no está arrancado. Proyecto Compose vbox-lsilogic-sas-config, network_mode: none. No enlazar nada.
CONTROL: la lectura de superposición del Puerto 0 de tipo SPI son datos de página ficticios, no el puntero del heap de la página de fabricación 7.
SAS confundido: la LECTURA del Puerto 0 filtra pManufacturingPage7 coincidiendo con calloc. La ESCRITURA del Puerto 0 implanta un segundo puntero de búfer testigo+tamaño. El getter de la página de fabricación 7 junto con la LECTURA de CONFIG copia el testigo en el arreglo GPA del invitado.
SUCCESS vbox-lsilogic-sas-config leak=yes plant=yes arb-read=yes VBOX-LSILOGIC-SAS-CONFIG-WITNESS
Condicionar los tipos de página SCSI-SPI a enmCtrlType == LSILOGICCTRLTYPE_SCSI_SPI. Restaurar la comprobación de atributos de página para que el puerto 0 de solo lectura permanezca como solo lectura. Comprobar si es NULL pManufacturingPage7 (y los demás punteros SAS) antes de desreferenciarlos. Dejar de superponer SpiPages y SasPages en una sola unión.