Skip to content

KVA Shadow (Windows PTI)

Windows'un kernel/user page-table isolation'ı: user mode'u privileged kernel belleği unmapped halde çalıştırır, böylece Meltdown transient load'unun sızdıracak bir şeyi olmaz — Linux KPTI'nin Windows muadili.

Mechanism

Neden çalışır

Meltdown (CVE-2017-5754, "rogue data cache load" / variant 3), bir user instruction'ın mapped bir kernel adresini transient olarak okumasına izin verir: load fault verir, ama fault retire olmadan önce speculative read çoktan cache state'ini değiştirmiştir ve byte'ı bir Flush+Reload channel'ı üzerinden sızdırır. Önkoşul, kernel belleğinin user mode'dan translate edilebilir olmasıdır — tarihsel olarak performans için her process'e (yalnızca-supervisor) map'lenirdi.

KVA Shadow o önkoşulu ortadan kaldırır. Microsoft'a göre, "her process artık en fazla iki address space'e sahip olabilir: kernel address space'i ve user address space'i", her biri kendi page-directory hierarchy'siyle (kendi CR3'üyle):

  • Kernel address space'i — tam user ve kernel belleğini map'ler; kernel'de execute ederken kullanılır.
  • User ("shadow") address space'i — user belleğini artı "kernel address space'ine girip çıkmak için gereken yalnızca minimal bir kernel mode transition code ve data page alt kümesini" map'ler. Kernel belleğinin büyük kısmı present değildir.

User-yarısı PDE'ler her iki space'e replicate edilir; kernel yarısı shadow'a replicate edilmez. Kernel sırları user execution sırasında basitçe unmapped olduğundan, Meltdown transient load'unun üzerinde speculate edeceği geçerli bir translation yoktur. Geri kazanılan invariant: unmapped bellek (speculatively) okunamaz.

Walkthrough

KVA Shadow kernel'in içine gömülüdür; bir API çağırmak yerine onu işletir ve gözlemlersin. Yalnızca belirli "güvenli" structure'lar user page table'larına shadow'lanır — per-processor transition stack'leri (KTRANSITION_STACK'ler), GDT, IDT, TSS ve per-processor descriptor area (KPROCESSOR_DESCRIPTOR_AREA); hepsi contiguous, nonpageable bir bölgede tutulur.

1. Mitigation durumunu resmi araçlarla kontrol et. Microsoft'un SpeculationControl PowerShell module'ü KVA Shadow durumunu raporlar:

PS> Install-Module SpeculationControl
PS> Get-SpeculationControlSettings

Windows OS support for kernel VA shadow is present: True
Windows OS support for kernel VA shadow is enabled: True
Windows OS support for PCID performance optimization is enabled: True

2. User/kernel sınırındaki CR3 swap'i. Bir trap'te, entry path CR3'ü kernel page-directory pointer'ıyla yeniden yükler; return'de shadow CR3'ü geri yükler. Bir per-processor KPRCB page'i, "kolay erişim için mevcut processor'ün kernel CR3 değerinin bir kopyasını" tutar:

(conceptual entry/exit)
trap from user  -> load CR3 = kernel PML4   (full kernel map)
   ... service the trap on a KTRANSITION_STACK ...
return to user  -> load CR3 = shadow PML4   (kernel unmapped)

3. PCID optimizasyonu. PCID-yetenekli CPU'larda KVA Shadow iki tag kullanır — PCID_KERNEL ve PCID_USER — böylece CR3 swap'lerinin tüm TLB'yi flush etmesi gerekmez, "system service call'larında ve diğer yüksek frekanslı user/kernel geçişlerinde tüm TB içeriğinin korunması."

KVA Shadow yalnızca Meltdown içindir

Linux KPTI gibi KVA Shadow da kernel belleğini unmap ederek Meltdown'ı yener; Spectre v1/v2'yi (intra-address-space leak'leri) ya da L1TF'yi durdurmaz; bunlar kendi mitigation'larını gerektirir (retpoline/IBRS, L1D flush).

Detection

Bir saldırı değil. Gözlemlenebilirlik operasyoneldir: Get-SpeculationControlSettings ("kernel VA shadow is present/enabled") ve syscall/interrupt entry path'inde shadow CR3 swap'inin varlığı.

Mitigation

(Residual risk / bypass.) User space'te kalması gereken minimal transition mapping'leri residual bir attack surface'tir: araştırmalar, sabit KVA Shadow trampoline/transition mapping'lerinin KASLR bilgisini sızdırmak için suistimal edilebileceğini gösterdi ("Meltdown Reloaded") ve kernel exploit payload'ları dual-CR3 rejimi altında doğru çalışacak şekilde uyarlandı. KVA Shadow ayrıca sibling-thread L1TF için hiçbir şey yapmaz.

References