Hyper-V vmswitch VmsPtpIpsecTranslateAddv2toAddv2Ex OOB read¶
Guest-controlled bir IPsec offload OID request, vmswitch.sys'te bir out-of-bounds read'i sürer ve root partition'ı bir child VM'den çökertir.
Mechanism¶
Bug class ve isolation boundary
Bu, bir guest (child) partition'dan erişilebilen, Hyper-V virtual switch driver'ındaki
(vmswitch.sys) bir out-of-bounds read (OOBR)'dir. vmswitch, guest'lere VMBus
üzerinden bir paravirtualized NIC expose eder. Guest, host tarafı virtual switch'in parse edip
altta yatan miniport'a forward ettiği NDIS OID request'leri (object identifier request'leri)
gönderir. OID request'leri hardware checksum, RSS ve IPsec task offload gibi offload
özelliklerini kapsar.
VmsPtpIpsecTranslateAddv2toAddv2Ex, guest-supplied bir IPsec "SA add" structure'ını (ADDv2
formu) dahili olarak tüketilen extended (ADDv2Ex) formuna çevirir. Function, guest buffer'ı
içine gömülü bir length / count field'ına güvenir ve structure'ı buna göre walk eder. Declared
length, guest'in sağladığı buffer'ın gerçek boyutuna karşı doğrulanmadığı için, parse loop'u
allocation'ın sonunun ötesine okur.
VM isolation boundary'sini aşmasının nedeni, untrusted OID payload'ının child partition'da kaynaklanması ama root (host) partition'da çalışan kernel kodu tarafından parse edilmesidir. IPsec offload descriptor'ını kontrol eden bir guest bu nedenle host kernel'ı amaçlanan bounds dışındaki belleği dereference etmeye zorlayabilir — host üzerinde, guest'ten kontrol edilen bir read primitive.
Sibling ayrımı: Bu cell, IPsec "SA add" path'inde gömülü bir length/count field'ına
güvenen ayrı bir bug'tır (Google Project Zero issue #690, Kostya Kortchinsky, Nisan 2016;
Hyper-V güvenlik update'i MS16-045 ile aynı dönemde fix edildi). RSS varyantı
VmsVmNicHandleRssParametersChange
ise farklı bir function olup OID_GEN_RECEIVE_SCALE_PARAMETERS içindeki offset+size
çiftlerini (Project Zero issue #689) validate etmez; ikisi farklı OID ailesi ve farklı root-cause'a sahiptir.
CVE numarası doğrulanamadı
Public kataloglar (gerhart01/Hyper-V-Internals) bu iki bug'ı Google Project Zero issue #690 ve #689 olarak listeler. "CVE-2016-0690" / "CVE-2016-0689" formatı bu issue numaralarının yanlış transkripsiyonudur: o iki CVE ID'si gerçekte Oracle ürün zafiyetleridir, Hyper-V ile ilgisi yoktur. MS16-045 bülteninin Hyper-V CVE'leri CVE-2016-0088/0089/0090'dır; bu fonksiyonun bunlardan hangisine map ettiği primary kaynaktan doğrulanamadığı için burada bir CVE ID iddia edilmemekte, yalnızca verifiable Project Zero issue numarası verilmektedir.
Read vs. write
Açıklanan impact, belgelenmiş bir host code-execution zinciri değil, bir guest'ten host'un bir bug check (DoS)'udur. OID handler'larındaki out-of-bounds read'ler en güvenilir şekilde crash'ler / information probing olarak weaponize edilir; bu spesifik function için DoS ötesindeki herhangi bir escalation'ı doğrulanmamış olarak ele alın.
Walkthrough¶
Kavramsal reproduction path'i public catalog girdisini yansıtır: VMBus üzerinden malformed bir IPsec offload OID gönder, böylece translate routine over-read yapar.
-
Guest'ten synthetic NIC'in control channel'ını açın ve IPsec offload path'ini hedefleyen bir OID set request'i verin (
VmsPtpIpsecTranslate*tarafından işlenenIPSEC_OFFLOAD_V2_ADD_SAailesine map edilen OID). -
ADDv2payload'ını, gömülü bir length/SA-entry field'ı buffer'ın gerçekte içerdiğinden daha fazla data iddia edecek şekilde hazırlayın:
// Illustrative shape of the guest-controlled offload descriptor.
// The host's VmsPtpIpsecTranslateAddv2toAddv2Ex trusts a length/count
// field and copies/walks that many bytes from a shorter allocation.
struct ipsec_offload_addv2 {
uint32_t declared_length; // attacker-controlled, > real buffer
uint32_t num_sa; // attacker-controlled entry count
uint8_t sa_data[]; // far smaller than declared_length implies
};
- Host descriptor'ı parse eder; aşırı büyük length, read'i allocation'ın ötesine yönlendirir. Bitişik page unmapped ise, host bug check yapar.
Expected host-side observable
Bu yalnızca kavramsal bir path'tir; weaponize edilmiş end-to-end bir escape verilmemiştir. Tam offset'ler ve field adları, public olarak kataloglanmış function adı ve OID ailesi dışında burada iddia edilmemiştir.
Detection¶
- Stack/faulting module'ü
vmswitch.sysolan host bug check'leri, özellikle OID processing sırasında bir page boundary'ye bitişik faulting address ile. - Bir guest NIC error'ı ya da host crash'i sırasındaki Hyper-V-VmSwitch operational event log girdileri (port/OID failure olayları).
- Bir guest'in oversized length field'lı IPsec offload OID request'leri yaydığını gösteren VMBus / NDIS telemetry — IPsec task offload kullanmayan normal guest'ler için alışılmadık.
- Tek bir VM'den tekrarlanan guest-induced host crash'leri güçlü bir tampering sinyalidir.
Mitigation¶
- Microsoft'un patch'ini uygulayın. Bu OOBR, Hyper-V vmswitch güvenlik update'inde giderildi (Google Project Zero issue #690 olarak raporlandı; fix MS16-045 Hyper-V güvenlik update'i dönemine denk gelir — kesin CVE eşlemesi için yukarıdaki "CVE numarası doğrulanamadı" notuna bakın). Patch'lenmiş kod, IPsec structure'ını translate etmeden önce declared length/count'u gerçek request boyutuna karşı doğrular.
- IPsec task offload'ın gerekmediği yerlerde, NIC offload özelliklerini devre dışı bırakmak bu code path'inin maruziyetini azaltır.
- Bir host üzerinde hangi workload'ların untrusted guest olarak çalıştığını kısıtlayın; bir saldırgan OID path'ine ulaşmak için yalnızca guest seviyesinde koda ihtiyaç duyar.