Linux KVM memslot deletion use-after-free (CVE-2020-36313)¶
KVM'in dynamic memslot allocation'ı tarafından gelen bir bug, memslot deletion'ın bayat bir "last used" (LRU) cache index'i bırakmasına izin verir; bu da memslot array'i ararken out-of-range / use-after-free erişime yol açar.
Mechanism¶
Note
KVM, bir guest'in fiziksel memory layout'unu bir memslot dizisi
(struct kvm_memory_slot) olarak izler. Lookup'lar (virt/kvm/kvm_main.c'deki
search_memslots() / __gfn_to_memslot(), artı arch/s390/kvm/kvm-s390.c'deki
s390 yaklaşımı), ardışık translation'ların aynı slot'a denk geldiği varsayımıyla,
cache'lenmiş bir "last used slot" (LRU) index'i ile hızlandırılır.
Kırılan invariant şudur: bu cache'lenmiş index daima kullanımdaki slot'ların
current, live kümesinin içini göstermelidir. Dynamic memslot allocation
eklendiğinde, bir memslot'u silmek, LRU index'inin artık var olmayan bir slot'u
(ya da artık küçülmüş array'in sonunun ötesini) gösterir halde bırakabiliyordu.
Sonraki bir lookup bayat index'e güvenir ve free edilmiş/geçersiz memslot
memory'sinin bir out-of-range read'ini yapar — bir
use-after-free / out-of-bounds erişim. Ayrıca,
search'ün array'i hiç dereference etmemesi gereken sıfır kullanılan slot edge
case'i de vardır. Sonuç, normal memslot yönetimi yoluyla (örneğin hot-unplug,
KVM_SET_USER_MEMORY_REGION ioctl path'i üzerinden deletion) ulaşılabilen host
tarafı bir memory-safety ihlalidir.
Walkthrough¶
Public, patch'li materyal: NVD CVE-2020-36313 ("KVM subsystem allows out-of-range
access to memslots after a deletion, aka CID-0774a964ef56"), Linux 5.7'den önce
düzeltildi (commit 0774a964ef56). Kavramsal reprodüksiyon yolu:
- Privileged host tarafı bir aktör (örneğin userspace VMM, ya da yerel düşük yetkili bir caller tarafından ulaşılabilen bir path) birkaç guest memory region'ı kurar ve LRU "last used slot" cache'ini belirli bir index'e ısıtır.
- Bir memslot silinir, kullanılan-slot kümesini küçültür. LRU index'i reset edilmez ve artık live range'in dışındaki bir slot'a referans verir — ya da tüm slot'lar gitmiştir.
- Sonraki translation
search_memslots()çağırır, o da bayat LRU index'ini kullanır ve geçerli memslot array'inin ötesini okur.
// Conceptual: lookup trusting a cached index that deletion left dangling.
slot = slots->memslots[slots->lru_slot]; // index may now be out of range
if (gfn >= slot->base_gfn && ...) // reads freed/invalid slot
Warning
Fragment'lar yalnızca bug class'ı için örnekleyicidir; field/array isimleri kernel sürümüne göre değişir. Bu turnkey bir exploit değildir.
Detection¶
- Memslot lookup fast path'ini, slot deletion'da invalidate edilmeyen herhangi bir cache'lenmiş index (LRU / "last used") ve eksik "zero used slots" guard'ları için audit et.
- Host kernel'inde KASAN/UBSAN, delete-then-lookup workload'ları sırasında out-of-range memslot erişimini flag'leyecektir.
- Host crash'leri, KASAN slab-out-of-bounds raporları ya da memory-region teardown / device hot-unplug ile ilintili oops'lar davranışsal sinyallerdir.
Mitigation¶
- Upstream fix'i uygula (deletion'da cache'lenmiş slot geçersiz hale geldiğinde LRU cache'ini reset et ve no-used-slots case'ini açıkça handle et), Linux 5.7+ ve vendor backport'larında mevcut.
- Host kernel'lerini dağıtımın KVM advisory seviyesine kadar patch'li tut.
- VMM/KVM ioctl surface'ine erişimi trusted yönetim bileşenleriyle kısıtla.
References¶
- NVD — CVE-2020-36313. https://nvd.nist.gov/vuln/detail/CVE-2020-36313
- Ubuntu Security — CVE-2020-36313. https://ubuntu.com/security/CVE-2020-36313
- LKML — "[PATCH 0/7] KVM: Fix memslot use-after-free bug" (search_memslots / LRU fix). https://lkml.iu.edu/hypermail/linux/kernel/2003.2/07056.html