eXclusive Page Frame Ownership¶
Her physical page frame'ini exclusive olarak kernel ya da user'a ait yap, user page'lerini kernel direct map'inden unmap et ki kernel attacker data'sına onun üzerinden ulaşamasın — böylece ret2dir'i etkisizleştir.
Mechanism¶
Note
Kernel, kernel-accessible olan tüm physical bellek'in lineer bir "direct map"ini
(physmap) tutar. ret2dir bunu suistimal eder: bir payload'ı bir userspace
page'ine yerleştir, physical adresini resolve et (örn. /proc/<pid>/pagemap
üzerinden) ve kernel execution/erişimini o page'e direct-map alias'ı üzerinden
yönlendir — yalnızca userspace virtual mapping'ini denetleyen SMEP/SMAP/PXN'i
atlatarak. XPFO exclusive ownership enforce eder: bir page userspace için
allocate edildiğinde, direct-map entry'si kaldırılır, böylece kernel'in jump
edeceği ya da okuyacağı bir alias'ı kalmaz. Kernel page'e meşru şekilde ihtiyaç
duyduğunda (copy_to_user/copy_from_user), mapping geçici olarak geri getirilir
ve sonra tekrar tear down edilir.
Bu, ret2dir alias'ını tamamen kapatır. Maliyeti TLB pressure ve map/unmap churn'üdür; XPFO hiçbir zaman mainline'a merge edilmedi.
Walkthrough¶
XPFO'nun öldürdüğü ret2dir primitive'i:
1. spray a userspace page with payload
2. read its PFN from /proc/self/pagemap
3. kva = page_offset_base + (pfn << PAGE_SHIFT) ; direct-map alias
4. hijack control flow / corrupt a pointer to kva
XPFO açıkken, kva user-owned page'ler için unmapped'tir, böylece kernel
dereference/execution attacker data'sına çarpmak yerine fault üretir.
Performans karakteristiği (LWN)
En kötü durumda ~%3'e kadar; kernel-build yavaşlaması ~%2.5. Overhead, tekrarlayan map/unmap'ten, free edilen user page'lerini sıfırlamaktan ve direct map'ten huge-page mapping'lerini elimine etmekten (4K page'lere bölünür) gelir, ki bu TLB pressure'ı artırır.
Mitigation¶
XPFO özel olarak ret2dir'i etkisizleştirir; ret2usr'yi (SMEP/SMAP tarafından ele alınır) ya da saf in-kernel ROP'u durdurmaz. TLB/huge-page maliyeti yüzünden patch'ler mainline'a girmeden birçok RFC revizyonundan geçti, bu yüzden production kernel'ler bunun yerine SMAP + KPTI + randomization'a güvenir. Unmapping'in eksik olduğu yerlerde (copy_to_user sırasında transient remap'ler, TLB-flush elision), review'da race-window ya da stale-TLB bypass'ları gündeme getirildi. XPFO'yu, savunduğu saldırı olan physmap spraying (ret2dir'in arkasındaki teknik) ile karşılaştır.