Linux KVM lapic incomplete-cleanup on VCPU init (CVE-2021-4032)¶
Bir vCPU'nun emulated Local APIC'ini kurarken oluşan bir memory-allocation hatası, KVM'in
kvm_free_lapiccleanup path'ini tutarsız bir state'te bırakır, error'ı yanlış handle eder ve host kernel'i crash eder (denial of service).
Mechanism¶
Note
KVM bir vCPU oluşturduğunda, emulated bir Local APIC kurar (arch/x86/kvm/lapic.c,
kvm_create_lapic), apic object'ini ve register page'ini allocate eder. Kırılan
invariant şudur: error/teardown path'i, construction'ın allocate etmeyi başardığı
şeyi tam olarak yansıtmalıdır. vCPU construction sırasında bir allocation hatasında,
kvm_free_lapic'teki cleanup, kısmen-initialize edilmiş state'i yanlış handle etti —
hiç tam kurulmamış kaynakları free ya da dereference ederek — yani vCPU
INIT/construction sırasındaki memory hataları yanlış handle edilir ve kernel'i crash
edebilir.
Bu bir incomplete-cleanup / inconsistent-error-path kusurudur: bug failure handling'de, success path'inde değil. Tetiklemek, vCPU setup sırasında allocation hatasını provoke edebilmeyi gerektirir, yani etki bir remote guest escape değil, privileged yerel bir aktör tarafından bir DoS-class host crash'idir.
Walkthrough¶
Red Hat / distro advisory'lerinden kavramsal reprodüksiyon (fix 5.15 için indi):
- vCPU oluşturma privilege'ı olan yerel bir aktör, per-vCPU LAPIC'i ve register page'ini allocate eden vCPU construction'ını başlatır.
- Memory pressure altında (ya da inject edilmiş bir allocation hatasıyla), o allocation'lardan biri setup'ın ortasında fail eder.
- Error path, LAPIC state'i yalnızca kısmen initialize olmuş bir vCPU'ya karşı
kvm_free_lapic'i invoke eder. - Cleanup kısmi state'i doğru hesaba katmadığından, kernel memory hatasını yanlış handle eder ve crash edebilir, host'a hizmeti kesebilir.
Warning
Erişilebilirlik, allocation hatasını yanlış anda induce etmeye bağlıdır, yani bu öncelikle düz bir guest-to-host primitive'i değil, daha düşük güvenilir tenant'ların vCPU spin etmesine izin veren ortamlar için bir robustness/DoS bug'ıdır.
Defect class
Asimetrik init vs. teardown: success path birkaç kaynağı koşullu allocate eder, ama failure path tam kurulmuş bir object varsayar. Doğru error handling, kullanmadan önce her pointer'ı kontrol ederek tam olarak (ve yalnızca) allocate edileni free etmelidir.
Detection¶
- vCPU oluşturma sırasında, özellikle memory pressure altında,
kvm_free_lapic/ LAPIC setup üzerinden geçen bir backtrace'li host kernel oops / panic. - Host crash'lerini VM/vCPU oluşturma patlamalarıyla ve düşük bellek koşullarıyla (OOM'a yakın allocation hataları) ilintilendir.
- Daha düşük güvenilir VM lifecycle operasyonlarına izin veren host'larda host kernel sürümünü CVE-2021-4032 fix'ine karşı takip et.
Mitigation¶
- Upstream fix'i ve vendor backport'larını uygula (fix ~5.15-rc7'yi hedefledi ve dağıtımlar tarafından backport edildi); Red Hat / Ubuntu / SUSE tracker'larına bak.
- Host kernel'lerini güncel tut ve paylaşılan host'larda kimin vCPU / VM oluşturabileceğini kısıtla.
- Genel hardening: allocation-failure error path'lerinin daha çok tetiklenmesinin olası olduğu sürekli memory pressure altında host'u çalıştırmaktan kaçın.
İlişkili bir KVM lifecycle/cleanup bug class'ı için ayrıca bkz. linux-kvm-memslot-deletion-use-after-free.