EPT-hook page-table monitoring (non-writable PTE trap)¶
Guest'in kendi page-table page'lerini EPT'de non-writable olarak işaretlemek; böylece her PTE modifikasyonu hypervisor'a trap eder — hem EPT hook'larını saptamak için hem de guest altta yatan fiziksel page'i remap ettiğinde bir virtual-address hook'unu geçerli tutmak için kullanılır.
Mechanism¶
Note
Bir EPT hook bir guest-physical adrese çakılıdır, ama bir defender'ın ya da rootkit'in aslında takip etmek istediği şey bir guest-virtual adrestir (bir fonksiyon, bir syscall entry'si). Guest, GVA→GPA'yı kendi page table'larıyla map'ler ve bu mapping'i istediği zaman yeniden yönlendirebilir (paging, KVA-shadow, large-page split, copy-on-write). Bu yönlendirmeleri gözlemlemek için hypervisor, guest PTE page'inin GPA'sını EPT leaf'inde read-only (W=0) olarak işaretler. Bir PTE'yi yazmak o fiziksel page'e bir write olduğundan, guest'in güncellemesi bir EPT violation yükseltir (W=0) ve her page-table edit'ini host'a trap eder.
Burada exploit edilen sınır özelliği şudur: EPT permission'ları host-physical frame'in ne için kullanıldığına bakılmaksızın geçerlidir — guest'in paging yapılarını barındırmak dahil. Guest, kendi açısından page table sıradan writable kernel memory olsa bile, host fark etmeden kendi page table'larını edit edemez. Handler eski PTE değerlerini okur, write'a izin verir, Monitor Trap Flag ile modifiye eden instruction'ı single-step eder, yeni PTE değerlerini (GVA'nın artık hangi GPA'ya map'lendiğini) öğrenmek için page'i yeniden okur, sonra write'ı yeniden geri alır. Bu, bir code hook ile aynı permission-flip/MTF pattern'idir, paging-yapısı page'lerine uygulanmış halidir.
Çift kullanımlıdır: monitoring/detection olarak, bir guest'in bir code page'de okuduğu byte'ları orada execute olanla karşılaştırmak ya da bir mapping'i gizlemek için flip edilen PTE'leri izlemek, stealth hook'ları açığa çıkarır; maintenance olarak, bir EPT-hooking engine'i hedef GVA'sını yeniden çözmek ve execute-only hook'unu guest'in az önce map'lediği GPA'ya taşımak için kullanır.
Walkthrough¶
Kavramsal akış (public reference: hypervsir'in MTF-in-EPT notu):
- İlgilenilen PTE'(ler)i içeren guest page-table page'inin GPA'sını çözümle (guest
CR3üzerinden walk et). - O GPA'nın EPT leaf'ini read-only yap (R=1, W=0, X gerektiği gibi).
- Bir write'ta bir EPT violation tetiklenir. Handler:
- page'deki mevcut PTE değerlerini kaydeder;
- leaf'i writable yapar (W=1);
- MTF'i arm eder ve döner ki guest tek yazan instruction'ı single-step etsin;
- MTF VM exit'inde handler page'i yeniden okur, hangi entry'nin ve hangi GPA'ya değiştiğini görmek için eski ve yeni PTE değerlerini diff'ler, sonra leaf'i geri read-only yapar.
- Değişen PTE, hook'lanmış bir GVA'yı destekleyen bir PTE ise, engine execute-only hook'unu yeni GPA'ya yeniden yöneltir; bir defender ise remap'i log'lar/flag'ler.
EPT[ptpage] = R=1 W=0 ; guest PTE page made read-only
guest writes PTE -> EPT violation (W=0)
handler: snapshot PTEs; EPT[ptpage] = W=1; set MTF; resume
guest single-steps the write
MTF vmexit: read PTEs; diff -> learn new GVA->GPA; EPT[ptpage] = W=0
Warning
Kaynak materyalde bu, tam page-table kapsamı için büyük ölçüde deneysel olarak kabul edilir: guest page table'ları birden çok seviyeye sahiptir, PTE write'ları çok sıktır ve EPT granularity'si 4 KB'dir, dolayısıyla her PTE write'ını trap'lemek devasa bir performans cezası getirir. Esas olarak blanket kapsamadan ziyade seyrek yazılan yapılar (spesifik bir table page, nadiren dokunulan bir data page) için pratiktir.
Detection¶
- Timing: monitör edilen bir table page'e yapılan her PTE write artık bir EPT
violation + MTF gidiş-dönüşüne mal olur. Bir guest, page-table aktivitesi
patlamalarını (örn.
mmap/munmapfırtınaları) timing'leyip spesifik table page'lerinde anormal yavaşlamaları gözlemleyebilir. - Stealth-hook keşfi (defensive kullanım): PTE write'larını trap'leyerek hypervisor, code-read vs. code-exec içeriğini korele edebilir ve bir EPT split'in getirdiği asimetriyi yakalayabilir — bu tekniğin kendisini stealth hook'lar için bir detector haline getirir.
- Host tarafı: host'un guest paging yapıları olduğunu bildiği GPA'lar üzerinde read-only işaretlenmiş EPT leaf'leri, artı o GPA'larda yüksek EPT-violation oranı, sinyaldir.
Mitigation¶
- EPT permission kontrolünü tamamen host-owned ve denetlenebilir tut; bir victim mapping'i takip etmek için PTE trap'leri kullanan compromise olmuş bir host bileşeni, paging-yapısı GPA'larındaki anormal violation oranıyla saptanabilmeli.
- Maliyet nedeniyle, defender'lar PTE-write monitoring'i tüm page table'lar yerine küçük bir yüksek-değerli yapılar kümesine scope'lamalı ve yeterli olduğu yerlerde daha ucuz sinyalleri (örn. CR3-load exiting) tercih etmeli.
- Nested virtualization altında, L0'ın L1 guest paging yapılarının write-protection'ını doğru shadow'lamasını sağla ki L1'in monitoring'i L2 tarafından sessizce subvert edilemesin.