Memory introspection (external guest RAM read/write)¶
Çalışan bir VM'in RAM'ini guest dışından — hypervisor'dan ya da privileged bir kardeş VM'den — guest-physical page'leri host üzerinden map'leyerek ve guest'in page table'larını yürüyerek, guest içinde hiçbir agent olmadan okuma ve yazma.
Mechanism¶
Note
Hypervisor, guest'in physical memory'sine ve onun second-level address
translation'ına (second-level address translation — EPT / NPT / SLAT;
bkz. ept-violation-handling) sahip olduğundan,
herhangi bir guest-physical frame'i bir monitor'a map'leyip doğrudan okuyabilir ya
da yazabilir. Virtual Machine Introspection (VMI) bunun üzerine kurulur: bir guest
virtual address'ini çözmek için monitor önce guest'in CR3'ünü okur, sonra
guest-physical address'i elde etmek üzere guest page table'larını software ile
page page yürür (her level'in kendisi de SLAT üzerinden fetch edilir) ve nihayet
onu besleyen host-physical page'e ulaşır. Yazmalar yolu tersine çevirir: hedef
GPA'ya kadar yürünür ve SLAT'ın işaret ettiği host-physical page güncellenir.
Bilinçli olarak yararlanılan invariant şu: guest memory, altındaki katmana tamamen görünür/değiştirilebilir durumdadır — guest RAM'inin hypervisor'a karşı mimari bir confidentiality'si yoktur. Zor kısım semantic gap: ham byte'lar bir anlam ifade etmesi için guest OS layout bilgisiyle (offset'ler, sembol'ler) yorumlanmalıdır. LibVMI gibi tool'lar physical address, virtual address ya da kernel symbol ile anahtarlanmış primitive'ler sağlar ve hypervisor'ın desteklediği yerlerde memory event'leri (read/write/execute bildirimleri) register edebilir.
Walkthrough¶
Public reference: LibVMI. Kavramsal kullanım (canlı bir VM'den bir kernel symbol okuma):
- İsmiyle bir Xen/KVM domain'ine karşı introspection'ı initialise et; LibVMI guest OS layout'unu öğrenir (örn. bir config / Rekall profile'dan).
- Symbol ile oku — LibVMI symbol'ü bir virtual address'e çözer, guest
CR3'ünü okur, page table'ları SLAT üzerinden yürür ve byte'ları döndürür: - Yazma da benzer şekilde bir GPA'ya çözülür ve host-physical page güncellenir.
- İsteğe bağlı olarak bir bölgeye erişimde bildirim almak için bir memory event (Xen) register et — örn. bir kernel structure'a yapılan write'ları trap'le.
Beklenen gözlemlenebilir: monitor, guest içinde hiçbir process, driver ya da iz olmadan canlı guest memory'sini okur/yazar.
Warning
Okuma stealthy'dir; canlı kernel memory'yi yazmak ise guest CPU'larıyla race eder ve state'i corrupt edebilir. Page table walk'ları non-resident page'lere de çarpabilir — swapped-out page'leri içeri zorlamak için page-fault injection into guest'e bak.
Detection¶
- Guest içinden bu büyük ölçüde görünmezdir (VMI'ın bütün amacı budur). Tespit dolaylıdır: yazan ya da VM'i durduran introspection timing'i bozabilir ve event tabanlı trap'ler guest'in ölçebileceği bir VM-exit latency ekler (bkz. NPT-hook detection via single-step redirection).
Mitigation¶
- Memory introspection guest'in altındaki katmanın bir capability'sidir; bir guest bunu geri alamaz. Savunma tarafında security monitoring için kullanılır (DRAKVUF, HVMI).
- Confidential-computing teknolojileri (SEV/TDX gibi memory encryption), guest RAM'inin hypervisor'a karşı opak olması gerektiğinde alınacak önlemdir — bu tekniğin dayandığı plaintext-RAM varsayımını ortadan kaldırırlar.
References¶
- LibVMI — "Simplified Virtual Machine Introspection." https://github.com/libvmi/libvmi
- Bryan D. Payne — "An Introduction to Virtual Machine Introspection Using LibVMI." https://speakerdeck.com/bdpayne/an-introduction-to-virtual-machine-introspection-using-libvmi