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:
- Enlightenment'ı guest'e expose et. QEMU/KVM'de bu,
hv-ipiCPU flag'idir (hv-vpindex'e bağlıdır): Onunla, "HvCallSendSyntheticClusterIpi hypercall may target more than 64 virtual CPUs simultaneously". - 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. - 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