Skip to content

VMware Workstation PVSCSI controller heap overflow (shader heap spray escape)

Pwn2Own Berlin 2025 VMware guest-to-host escape (CVE-2025-41238, VMSA-2025-0013): PVSCSI paravirtual SCSI controller'ın scatter-gather handling'inde bir heap overflow; host code execution için graphics-shader/URB heap spray ile eşlenir.

Mechanism

Note

PVSCSI (paravirtual SCSI) controller, host vmware-vmx process'inde emüle edilir. Guest'ler DMA segment'lerini tanımlayan scatter-gather (S/G) list'leri gönderir; isolation invariant'ı, host'un onları kopyalamadan önce S/G buffer'ını guest tarafından sağlanan entry sayısına göre boyutlandırması gerektiğidir. Synacktiv'in writeup'ına göre, PVSCSI_FillSGI() guest 512'den fazla S/G entry sağladığında 0x4000-byte'lık bir buffer allocate eder, ama her reallocation'da UtilSafeRealloc1()'e geçirilen size entry sayısıyla büyümek yerine 0x4000'e hardcode edilmiştir. ~1024 entry'yi aştığında (her S/G elementi 16 byte: 8-byte address + 8-byte length) copy komşu host heap'e out of bounds yazar — privileged host process içinde guest-controlled bir heap overflow; guest→host boundary'sini aşar.

Bu, diğer controller escape'leriyle (bkz. VMware VMCI integer underflow OOB write ve QEMU IDE/ATAPI heap overflow) aynı device-emulation heap-corruption sınıfıdır.

Walkthrough

Public referans: Synacktiv'in "On the clock: Escaping VMware Workstation at Pwn2Own Berlin 2025" yazısı ve VMSA-2025-0013. Kavramsal yeniden üretim yolu (örnekleme amaçlı — public writeup'tan, weaponize edilmiş uçtan uca chain yok):

  1. Guest'ten, PVSCSI controller'ı sürün ve PVSCSI_FillSGI()'ın 0x4000-allocation path'ini alması için 512'den fazla entry'li bir S/G list gönderin.
  2. Entry eklemeye devam edin; realloc size'ı 0x4000'e sabit olduğu için, ~1024 16-byte entry'nin ötesinde host allocation'ı aşarak komşu heap chunk'larına yazar.
  3. Overflow faydalı bir state'e insin diye host heap'ini şekillendirin. Synacktiv, spray primitive'leri olarak graphics shader object'lerini ve (UHCI emulator ile) URB'leri, Windows LFH "Last Freed" pointer'ına karşı bir "Ping-Pong" tekniğini ve LFH randomization'ını yenmek için bir backdoor-channel timing side channel'ı kullandı. (Kavramsal — bunlar public teknik adlarıdır, yeniden üretilmiş offset'ler değil.)

Beklenen gözlemlenebilir: non-exploit bir denemede, bir guest'in anormal derecede büyük bir PVSCSI S/G list göndermesinin ardından vmware-vmx heap-corruption crash.

Warning

Bug sınıfı için belgelenmiş, patch'lenmiş issue. Yalnızca kavramsal — exploit geometry'si, spray offset'leri veya host layout yok.

Detection

  • PVSCSI S/G list'lerini anormal derecede büyük entry sayılarıyla (>512 / >1024) gönderen guest'lerde alert verin.
  • Host-side: vmware-vmx heap-corruption crash'leri, özellikle eşzamanlı olağandışı shader-allocation / URB aktivitesiyle.
  • Paravirtual controller gerekli olmadığı yerde PVSCSI'ı kısıtlayın veya patch'leyin.

Mitigation

  • VMSA-2025-0013'ü uygulayın: Workstation 17.6.4, Fusion 13.6.4 ve ESXi 7.0/8.0 update build'lerinde düzeltildi. Workaround sunulmuyor (CVSS 9.3).
  • Defense in depth: device emulation'ı sandbox / least-privilege yapın; böylece host-process compromise'i tam host kontrolü olmaz.

References