Linux KVM SynIC/STIMER MSR NULL deref (CVE-2022-2153)¶
In-kernel APIC'i olmayan bir vCPU'da Hyper-V SynIC/synthetic-timer MSR'ları yazan bir VMM, KVM'i bir NULL pointer dereference'ine ve host kernel oops'una sürer.
Mechanism¶
Note
KVM, Microsoft'un Hyper-V enlightenment'larını emulate eder, Synthetic Interrupt Controller (SynIC) ve synthetic timer'lar (STIMER) dahil. Synthetic timer expiry'si nihayetinde interrupt'ları vCPU'nun local APIC'i üzerinden teslim eder. KVM'in tasarımı, SynIC/STIMER processing çalıştığında vCPU'nun tam initialize edilmiş bir in-kernel local APIC'e (vcpu->arch.apic) sahip olduğunu varsayar.
Kırılan invariant: o varsayım MSR-write path'inde enforce edilmiyordu. Bir user-space VMM, bir vCPU'yu APIC object'i yok (NULL) olacak şekilde konfigüre edip yine de SynIC/STIMER MSR'larını programlayıp guest mode'a girebilir. Timer processing daha sonra çalıştığında (kvm_hv_process_stimers()), APIC'in var olup olmadığını kontrol etmeden onu dereference eden koda ulaşır. Input (hangi MSR'ların yazıldığı ve vCPU init sırası) yerel VMM process'i tarafından ioctl'ler aracılığıyla tamamen kontrol edildiğinden, /dev/kvm'i açabilen unprivileged yerel bir kullanıcı host kernel context'inde deterministik olarak bir NULL dereference'e ulaşabilir — user/host-kernel boundary'sini bir denial of service olarak geçer.
Walkthrough¶
Public Red Hat analizine (Bugzilla 2069736) ve upstream fix serisine göre, mantıksal reprodüksiyon şudur:
/dev/kvm'i aç, bir VM ve bir vCPU oluştur, ama o vCPU için in-kernel local APIC'i oluşturma (irqchip/LAPIC setup'ını atla), böylecevcpu->arch.apicNULL kalır.- Hyper-V emulation'ını enable et ve bir synthetic timer'ı arm etmek için SynIC/STIMER MSR'larını (
kvm_hv_set_msr) yaz. - vCPU'yu çalıştır. Timer path'inde,
kvm_hv_process_stimers()APIC üzerinden teslim etmeye devam eder ve NULL pointer'ı dereference eder, bir kernel oops üretir.
Düzeltici değişiklik (kavramsal)
Fix serisi (commit'ler 00b5f37189d2, 7ec37d1cbe17, b1e34d325397), SynIC fonksiyonalitesi bir in-kernel APIC'in varlığına gate edilecek şekilde SynIC/STIMER path'lerini hardene eder: SynIC gerektiren MSR write'ları, vCPU bir LAPIC'ten yoksun olduğunda reject edilir / invalid sayılır ve unchecked dereference elenir. Genel pattern, "onu consume eden herhangi bir path'ten önce prerequisite object'i (APIC) validate et"tir.
Warning
Etki host code execution değil, bir host denial of service'idir (kernel NULL deref / oops). Trigger /dev/kvm'e yerel erişim gerektirir; multi-tenant bir host'ta bu, VM başlatmaya izinli herhangi bir process'ten ulaşılabilir.
Detection¶
dmesg/kernel log'larını, backtrace'i Hyper-V/SynIC/stimer sembollerini içeren (örneğinkvm_hv_process_stimers,stimer_*,synic_*) bir NULL-pointer-dereference oops'u için incele — güçlü bir post-hoc sinyal.- Hangi yerel kullanıcıların/servislerin
/dev/kvm'i açabileceğini audit et (permission'lar,kvmgroup membership'i, container device erişimi). Düşük güvenilir principal'lar tarafından beklenmedik VMM oluşturma, dikkat edilecek prerequisite'tir. - Fuzzing/validation host'ları için, APIC'siz vCPU'larda SynIC MSR write'larını oops'lamadan önce yakalamak için
KASAN/KCSANve KVM tracepoint'leri enable şekilde çalıştır. - Crash-loop monitoring: tek bir tenant'ın VM-create aktivitesiyle ilintili tekrarlanan host kernel panic'leri, kasıtlı tetiklemeye işaret eder.
Mitigation¶
- Patch'le. Fix serisini (
00b5f37189d2,7ec37d1cbe17,b1e34d325397) içeren bir kernel'e güncelle; 5.18'de upstream düzeltildi ve büyük dağıtımlar tarafından backport edildi (RHEL 8/9 errata, diğerleri). /dev/kvm'i kısıtla. Hangi principal'ların VM oluşturabileceğini sınırla — yalnızca trusted virtualization daemon'ları erişime sahip olmalı; genişkvmgroup membership'ini kaldır.- VMM'i sandbox'la. QEMU/VMM'i least privilege altında çalıştır (seccomp, dedicated unprivileged uid) ki bir crash path'ine ulaşmak daha zor ve contained olsun.
- Uzun ömürlü host'larda vendor errata'sını uygula ve patch'li module'ü yüklemek için reboot et.