Linux KVM VM_PFNMAP RO-check page free (CVE-2021-22543)¶
KVM, VM_IO/VM_PFNMAP memory region'larını yanlış handle etti ve read-only kontrollerini bypass etmesine ve VMM ile guest'e map'li kalan page'leri refcount-free etmesine izin verdi — host memory corruption'ına ve privilege escalation'a giden bir yol.
Mechanism¶
Note
Guest memory'yi besleyen bir host virtual address'ini (hva) bir page frame number'a (pfn) çevirmek için, KVM normalde page'leri get_user_pages ile pin'ler. VM_IO | VM_PFNMAP flag'li özel VMA'lar (device / remapped memory) için get_user_pages geçerli değildir, yani KVM follow_pfn tabanlı bir remap path'ine (hva_to_pfn_remapped) fallback eder.
O fallback path'inde iki invariant kırıldı:
- RO bypass. Remap fallback'i, altyatan PFN read-only olsa bile mapping'in writable flag'ini true'ya zorladı, böylece host'un read-only olarak amaçladığı bir region guest mapping üzerinden yazılabiliyordu — host'un güvendiği RO protection'ı yeniyordu.
- Improper page free. KVM,
PG_reservedolmayan bir page'i normal bir refcounted page olarak ele alır ve üzerindekvm_get_pfn/put_pageyapar. Ama bazı special-VMA backing page'leri (örneğin belirli TTM pool tail page'leri) KVM'in varsaydığı refcount ile kurulMAZ. KVM'in hiç meşru tutmadığı bir reference'ı put etmek, count'u sıfıra düşürüp VMM ve guest'e hâlâ map'li olan bir page'i free edebilir ve host memory üzerinde bir use-after-free verir.
VMM/guest kullanıcısı hangi memory region'ın register edilip erişildiğini kontrol ettiğinden, bu, guest-to-host boundary'sini geçerek arbitrary host memory read/write'a varır — yalnızca DoS değil, local privilege escalation.
Walkthrough¶
Public Google security-research advisory'sine (GHSA-7wq5-phmq-m584, Sean Christopherson'ın fix'i) ve upstream commit'lere göre, kavramsal chain şudur:
- Altyatan PFN'i read-only olan ve/veya KVM'in beklediği refcount'tan yoksun bir
VM_IO|VM_PFNMAPregion'ı map'leyen bir hva ile beslenen bir guest memory slot ayarla. - Guest erişimini fault'la, böylece KVM remap fallback'ini alır (
follow_pfnüzerindenhva_to_pfn_remapped); RO state'i kaybolur ve mapping writable olur. - KVM daha sonra özel page'i bir reference'a sahipmiş gibi
put_pageeder, onu sıfıra düşürür ve VMM/guest address space'inde hâlâ live olan bir page'i free eder. - Artık-free-ama-map'li page, yeniden allocate edilmiş host kernel verisini corrupt etmek için bir primitive haline gelir.
Düzeltici değişiklik (kavramsal)
Fix, remap path'inin PFN'in gerçek protection'ına uymasını (source read-only olduğunda force-writable yapma) sağlar ve KVM'in meşru sahibi olmadığı page'ler üzerinde reference take/drop etmeyi reddeder — yani, yalnızca gerçekten refcountable olan page'leri refcount-manage et, raw device/PFNMAP page'lerine dokunma. Upstream mm/gup.c (check_vma_flags) ve KVM (hva_to_pfn_remapped) birlikte hardene edildi.
Warning
Bu high-severity bir local privilege escalation'dır (CVSS 7.8) — yalnızca bir crash değil, kontrol edilebilir host read/write ve page UAF. Ayrıca bkz. ../primitive/use-after-free.md.
Detection¶
- Guest'leri device/PFNMAP-backed region'ları map'leyebilen host'ları envanterle (GPU passthrough, DRM/TTM-backed buffer'lar, mediated device'lar). Bunlar vulnerable fallback'i expose eder.
- Kernel log'ları:
KASAN/page_poison/slub_debugenable şekilde, backtrace'ihva_to_pfn_remapped,follow_pfnya da KVM'den ulaşılanput_page'i içeren use-after-free ya da "bad page state" / refcount-underflow splat'ları için dikkatli ol. - Host'un read-only register ettiği region'lara başarılı olan beklenmedik guest-initiated write'ları ara.
- Multi-tenant host'larda, host kernel corruption oops'larını tek bir tenant'ın device-passthrough aktivitesiyle ilintilendir.
Mitigation¶
- Patch'le. GHSA-7wq5-phmq-m584 / CVE-2021-22543 tarafından atıf yapılan kernel update'lerini (RO-bypass fix'i Şubat 2021, page-free fix'i Haziran 2021) ve distro backport'larını (Debian, Fedora, RHEL) uygula.
- Passthrough'u sınırla. Patch'lenene kadar
VM_IO|VM_PFNMAP-backed device'ları (GPU/DRM passthrough, mediated device'lar) untrusted guest'lere expose etmekten kaçın. - VMM için least privilege. VMM'i seccomp ile unprivileged çalıştır ki bir UAF'ı full host control'üne silahlandırmak daha zor olsun.
- Vendor errata'sını uygula ve düzeltilmiş KVM module'ünü yüklemek için reboot et.