Skip to content

Synthetic cluster IPI hypercall (HvCallSendSyntheticClusterIpi)

Bir Hyper-V paravirtualized inter-processor-interrupt olanağı: tek bir hypercall, bir IPI vector'ünü bir virtual processor kümesine (tek bir çağrıda >64 dâhil) teslim eder ve her biri bir VM-exit'e neden olacak birden çok APIC write'ının yerini alır.

Mechanism

Note

Bir IPI'yi local APIC üzerinden teslim etmek, her biri hypervisor'a trap eden (bir VM-exit) MMIO/MSR write'ları ve >64 target için birden çok ICR programlaması gerektirir. Paravirtual IPI enlightenment'ı, enlightened bir guest'in bunun yerine interrupt vector'ünü ve bir target virtual-processor set'ini geçirerek tek bir hypercall, HvCallSendSyntheticClusterIpi, çağırmasına olanak tanır; hypervisor interrupt'ı tüm target'lara aynı anda enjekte eder. Performance invariant'ı şudur: bir guest→hypervisor transition'ı, birçok APIC-induced exit'in yerini alır — HvCallSendSyntheticClusterIpi aynı anda 64'ten fazla vCPU'yu hedefleyebilirken, APIC access "birden fazla access (ve dolayısıyla hypervisor'a exit) gerektirir". Attack-surface ilgisi: bir PV IPI hypercall'ı, host'un hypercall handler'ına (vector ve processor-set parsing) guest-controlled bir input'tur, dolayısıyla hypercall fuzzing surface'inin parçasıdır ve target set'i valide etmelidir.

Walkthrough

Public referans: QEMU'nun Hyper-V enlightenment'ları dokümantasyonu (hv-ipi). Enlightened bir guest onu şöyle etkinleştirir ve kullanır:

  1. Enlightenment'ı guest'e expose et. QEMU/KVM'de bu, hv-ipi CPU flag'idir (hv-vpindex'e bağlıdır):
    -cpu host,hv-vpindex,hv-ipi
    
    Onunla, "HvCallSendSyntheticClusterIpi hypercall may target more than 64 virtual CPUs simultaneously".
  2. Guest kernel, target başına APIC ICR yazmak yerine hypercall'ı {vector, target vp_set} ile çağırır. Windows onu bir fast hypercall olarak kullanır (parametreler register'larda); sparse bir "Ex" formu (...IpiEx) büyük/sparse VP bank'larını encode eder.
  3. Hypervisor processor set'ini valide eder ve vector'ü her target vCPU'ya enjekte eder, sonra döner — birçok yerine tek bir VM-exit.

Beklenen gözlemlenebilir: PV path altında, IPI-yoğun workload'lar çok daha az APIC-related VM-exit gösterir; IPI pattern'i için kvm_stat / exit counter'ları düşer.

Warning

Bu meşru bir performance enlightenment'ıdır; burada bir exploit olarak değil, host attack surface (guest-controlled hypercall input) olarak belgelenmiştir.

Detection

  • Host/VMM tarafı: hypercall frekansını ve vector/target-set argümanlarını izle; malformed ya da out-of-range target set'leri bir kırmızı bayraktır ve sayılmalıdır.
  • Differential: APIC-exit count'larını PV-IPI hypercall count'larıyla karşılaştırmak, kullanılan path'i doğrular.

Mitigation

  • KVM/Hyper-V'yi güncel tut ki hypercall handler, injection'dan önce vector'ü ve (muhtemelen sparse) target VP set'ini valide etsin.
  • PV-IPI'yi yalnızca ona ihtiyaç duyan guest'lere advertise et; enlightenment opt-in'dir (hv-ipi), dolayısıyla untrusted guest'lere ekstra hypercall surface'i reddedilebilir.
  • Hypercall path'ini fuzzable host kodu olarak ele al — bkz. VM-exit injection fuzzing ve hypercall fuzzing.

References

  • QEMU — Hyper-V Enlightenments (hv-ipi / HvCallSendSyntheticClusterIpi): https://qemu.readthedocs.io/en/v9.1.3/system/i386/hyperv.html