Skip to content

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ı:

  1. 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.
  2. Improper page free. KVM, PG_reserved olmayan bir page'i normal bir refcounted page olarak ele alır ve üzerinde kvm_get_pfn / put_page yapar. 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:

  1. Altyatan PFN'i read-only olan ve/veya KVM'in beklediği refcount'tan yoksun bir VM_IO|VM_PFNMAP region'ı map'leyen bir hva ile beslenen bir guest memory slot ayarla.
  2. Guest erişimini fault'la, böylece KVM remap fallback'ini alır (follow_pfn üzerinden hva_to_pfn_remapped); RO state'i kaybolur ve mapping writable olur.
  3. KVM daha sonra özel page'i bir reference'a sahipmiş gibi put_page eder, onu sıfıra düşürür ve VMM/guest address space'inde hâlâ live olan bir page'i free eder.
  4. 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_debug enable şekilde, backtrace'i hva_to_pfn_remapped, follow_pfn ya da KVM'den ulaşılan put_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.

References