Skip to content

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:

  1. Guest'te, UHCI controller üzerinden yönlendirilmiş bir USB device'ı attach et/sür.
  2. Host'un toplam allocation'ı max_device_packet_length * num_tds olarak hesapladığı bir TD frame list'i kur (örn. ~0x1800-byte'lık bir Bluetooth URB).
  3. Bir TD'nin Packet ID'sini OUT (0xE1) ve MaxLen'ini 0x40'tan fazla (0x3ff'e kadar) ayarla ki uhci_parse_td_list() URB'nin tuttuğundan daha fazla byte kopyalasın — yayımlanan analizde 0x8000 byte'a doğru overflow.
  4. 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-vmx crash'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.

References