
VirtualBox 7.2.20 - Critique - Local - Confusion de types / lecture-écriture arbitraire - Superposition SAS1068 CONFIG SCSI-SPI
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · vbox-lsilogic-sas-config
Classe : confusion de types / lecture-écriture arbitraire Portée : locale (invité)
Oracle VM VirtualBox OSS 7.2.20 (f2792cf44f663989818507e36d3db5f978523c5e)
La commande CONFIG du SAS1068 MPT traite le port SCSI-SPI 0 comme une page de 12 octets. Sur SAS, cette page constitue l'autre moitié d'une union : pManufacturingPage7 plus cbManufacturingPage7. Un CONFIG READ de l'invité divulgue le pointeur du tas par DMA. Un CONFIG WRITE implante le pointeur et la taille. La page Manufacturing 7 copie ensuite via le pointeur implanté.
Un ring3 invité sur un SAS1068 attaché (PDM LsiLogicSas, PCI 1000:0054) obtient une lecture/écriture arbitraire dans le processus de la VM. Il s'agit du tas de VirtualBoxVM / VBoxHeadless, et non d'une évasion vers le noyau hôte.
| ID | aucun CVE pour l'instant |
| Classe | confusion de types / lecture-écriture arbitraire |
| Portée | locale (invité) |
| CWE | CWE-843, CWE-822 |
| CVSS | Critique : 8.8 CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H |
| Produit | VirtualBox OSS |
| Affecté | 7.2.20 (f2792cf44) |
| Nécessite | un SAS1068 attaché (PDM LsiLogicSas, PCI 1000:0054) |
| Licence | GNU Affero GPL v3.0 |
| Labo | harnais source en boucle locale |
Méthode : un ring3 invité programme le doorbell MMIO du SAS1068 ou la FIFO de requêtes avec MPT_MESSAGE_HDR_FUNCTION_CONFIG (0x04), type de page SCSI-SPI Port 0 (0x03). Le dispatch appelle toujours le getter SPI. Seul EXTENDED est conditionné à SAS. Le getter d'attribut de page est commenté, donc la page Readonly Port 0 reste inscriptible. SPI Port 0 est compacté sur 12 octets et recouvre SasPages.pManufacturingPage7 (8) plus cbManufacturingPage7 (4).
| Privilège | Type | Statut | Ce qu'il accorde |
|---|---|---|---|
| CONFIG SCSI-SPI Port 0 READ | reconnaissance | prouvé en labo | DMA du pointeur de tas du processus VM pManufacturingPage7 et de sa taille dans la RAM de l'invité. Entrée pour l'ASLR. |
| CONFIG SCSI-SPI Port 0 WRITE | intégrité | prouvé en labo | implante un pointeur et une taille choisis par l'invité par-dessus ces champs SAS |
| CONFIG READ de la page manufacturing 7 | intégrité | prouvé en labo | copie des octets hôtes depuis l'adresse implantée vers le GPA de l'invité (VBOX-LSILOGIC-SAS-CONFIG-WITNESS) |
| CONFIG WRITE de la page manufacturing 7 | intégrité | déduit du même getter | copie des octets de l'invité vers l'adresse implantée (écriture arbitraire dans VirtualBoxVM) |
| pages SPI Port 1 / Device 0 | reconnaissance / intégrité | recouvrement déduit | Port 1 divulgue/implante pSASIOUnitPage0 ; Device 0 page 0 touche paPHYs ; Device 0 page 1 touche pSASDeviceHead |
| pointeur implanté sauvage | disponibilité | déduit | fait planter le processus VM au prochain accès à une page SAS ou sur lsilogicR3ConfigurationPagesFree |
Voisins exclus :
SpiPages est la disposition réelle ; cette confusion de types nécessite un SAS1068)VERR_NOT_FOUND)Il s'agit d'une lecture/écriture arbitraire dans le processus VM, pas d'une évasion vers le noyau hôte. Un accès utilisateur hôte complet nécessite encore un reste de durcissement. Je ne l'ai pas apparié avec une écriture 3D restante : l'UAF VMSVGA DX11 (d691aa68) est corrigé sur ce commit.
Pas de Guest Additions. Pas de 3D. Pas de VRDP. Pas de PUEL. Un ring3 invité hostile suffit ; le pilote mpt/mptsas intégré n'est pas requis.
Je me suis penché sur OSS 7.2.20 après le CPU de septembre 2026 et j'ai parcouru LsiLogic MPT CONFIG. La fuite silencieuse de la pile de réponses de 2026 est déjà corrigée : 122c6880 applique RT_ZERO à MptReplyUnion en cas d'erreur d'E/S SCSI. Je cherchais un résidu de cette classe, pas ce point de fuite.
Le résidu est une union, pas une réponse sur la pile :
union {
MptConfigurationPagesSpi SpiPages;
MptConfigurationPagesSas SasPages;
} u; /* DevLsiLogicSCSI.h:3323 */
SAS alloc remplit les pointeurs d'hôte SasPages et n'exécute jamais l'initialisation de page SPI. Le getter de port SPI à DevLsiLogicSCSI.cpp:2795 n'a aucune vérification enmCtrlType. Les cas SPI de dispatch CONFIG ne sont pas conditionnés. Le getter d'attribut de page est commenté à cpp:3159. La page de fabrication 7 à cpp:2701 est conditionnée SAS, ce qui est le chemin prévu, et déréférence pManufacturingPage7 sans vérification NULL. C'est ainsi qu'un READ/WRITE de Port 0 de type SPI devient une fuite de pointeur SAS et un plant.
Fausses pistes déjà consignées : re-déposer 122c6880 ; traiter le LSI53C1030 par défaut comme ce bug ; gonfler un crash de pointeur sauvage en évasion vers le noyau hôte ; une VM live alors que l'overlay compacté suffit. Théâtre : un reverse shell. L'oracle est la donnée de page factice CONTROL, puis la fuite/plant/lecture arbitraire de VBOX-LSILOGIC-SAS-CONFIG-WITNESS.
cd lab
./run.sh
Ou python3 vbox-lsilogic-sas-config-Abraxas-Labs.py. Harnais source des structures de pin. VirtualBox n'est pas démarré. Projet Compose vbox-lsilogic-sas-config, network_mode: none. Ne lier rien.
CONTRÔLE : la lecture de superposition du Port 0 typé SPI correspond à des données de page factices, et non au pointeur de tas de la page de fabrication 7.
SAS confus : la LECTURE du Port 0 divulgue pManufacturingPage7 correspondant à calloc. L'ÉCRITURE du Port 0 implante un second pointeur de tampon témoin + taille. Le getter de la page de fabrication 7 plus la LECTURE CONFIG copie le témoin dans le tableau GPA de l'invité.
SUCCESS vbox-lsilogic-sas-config leak=yes plant=yes arb-read=yes VBOX-LSILOGIC-SAS-CONFIG-WITNESS
Conditionner les types de page SCSI-SPI sur enmCtrlType == LSILOGICCTRLTYPE_SCSI_SPI. Rétablir la vérification des attributs de page afin que Readonly Port 0 reste en lecture seule. Vérifier la valeur NULL de pManufacturingPage7 (ainsi que des autres pointeurs SAS) avant déréférencement. Cesser de superposer SpiPages et SasPages dans une seule union.