VMware UHCI USB controller bug (Universal Host Control Interface)¶
VMware'in emüle ettiği USB 1.1 UHCI controller'ındaki bir guest-to-host out-of-bounds write (ZDI-19-421): oversized bir MaxLen taşıyan hazırlanmış bir Transfer Descriptor bir host URB heap buffer'ını overflow eder, Fluoroacetate ekibi tarafından Pwn2Own'da host'a escape etmek için kullanıldı.
Mechanism¶
Note
UHCI controller, host vmware-vmx process'inde emüle edilir. Guest driver,
guest belleğinde Transfer Descriptor'ların (TD'ler) linked list'ini kurar;
host onları uhci_parse_td_list() içinde dolaşır ve packet payload'larını
Vusb_NewUrb() tarafından allocate edilen bir URB (USB Request Block)
buffer'ına kopyalar. Host o buffer'ı beklenen device başına packet length
çarpı TD sayısından boyutlandırır, ama TD başına MaxLen alanı bizzat
guest-controlled'dır ve 0x3ff byte'a kadar olabilir — buffer'ın
boyutlandırıldığı 0x20/0x30-byte'lık packet'lerden çok daha büyük. İhlal
edilen invariant: her TD'nin declare edilen length'i kopyalamadan önce
gerçek URB buffer boyutuna karşı yeniden validate edilmelidir. Edilmediği
için, büyük bir MaxLen'e sahip tek bir TD (Packet ID OUT, 0xE1) URB heap
chunk'ının ötesine yazar — bir guest → host OOB write.
Bu, kanonik device-backend "descriptor length'ine güven" başarısızlığıdır; daha geniş QEMU MMIO/PIO callback memory corruption sınıfına da bak.
Walkthrough¶
Public, patch'lenmiş issue (VMSA-2019-0005, Workstation 15.0.3 üzerinde analiz). Atıfta bulunulan write-up'tan konsept yolu:
- Guest'te, UHCI controller üzerinden yönlendirilmiş bir USB device'ı attach et/sür.
- Host'un toplam allocation'ı
max_device_packet_length * num_tdsolarak hesapladığı bir TD frame list'i kur (örn. ~0x1800-byte'lık bir Bluetooth URB). - Bir TD'nin Packet ID'sini OUT (0xE1) ve
MaxLen'ini 0x40'tan fazla (0x3ff'e kadar) ayarla kiuhci_parse_td_list()URB'nin tuttuğundan daha fazla byte kopyalasın — yayımlanan analizde 0x8000 byte'a doğru overflow. - Host heap'i öyle groom et ki overflow kullanışlı bir object'e insin, sonra host code execution'a pivot et.
Başarısız bir denemede gözlemlenebilir: anormal UHCI TD programlamasının ardından
vmware-vmx crash'i.
Warning
Patch'lenmiş/tarihsel; bug sınıfı için belgelenmiştir. Host layout'u ya da shellcode sağlanmamıştır.
Detection¶
- Host: bir guest'in USB aktivitesine bağlı
vmware-vmxcrash'leri. - Config: maruziyeti kapsamlandırmak için virtual USB controller'ları enabled olan VM'leri tespit et.
Mitigation¶
- VMware Workstation 15.0.4+ (VMSA-2019-0005) / karşılık gelen Fusion/ESXi build'lerine patch'le.
- USB passthrough'a ihtiyaç duymayan VM'lerden virtual USB controller'ı kaldır.
- Düzeltme,
uhci_parse_td_list()'e TD başına length'i validate eden bir bounds check ekledi.