VMFUNC EPTP switching¶
Intel VM function 0 (EPTP switching): in-guest, non-root kod, bir EPTP-list'ten farklı bir EPT pointer yüklemek için EAX=0 ve ECX=index ile
VMFUNCçalıştırır ve guest-physical→host-physical view'ını bir VM-exit olmadan değiştirir — dual-view EPT stealth hook'ların arkasındaki hızlı primitive (ve VMM'nin dikkatlice kapsamlandırması gereken bir sınır).
Mechanism¶
Note
EPTP switching, VM function 0'dır. Etkinleştirildiğinde, VMX non-root operasyonundaki
software yeni bir EPT pointer (EPTP) yüklemek için VMFUNC çalıştırabilir; bu farklı
bir EPT paging hierarchy'si — yani farklı bir guest-physical→host-physical mapping
("view") — kurar, kontrolü VMM'ye aktarmadan. Guest yalnızca bir EPTP index'ini
(0-511) görür; VMM, EPTP-list'in (512'ye kadar aday EPTP'den oluşan 4 KB'lık bir
page) ve index'ten gerçek EPTP'ye mapping'in sahibidir. Etkinleştirmek VMM tarafından
set edilen üç control gerektirir: "activate secondary controls" (primary bit 31),
"enable VM functions" (secondary bit 13) ve "EPTP switching" (VM-function-control bit
0), artı geçerli bir EPTP_LIST_ADDRESS. Invariant: VMM'nin list'e yerleştirdiği her
EPTP'nin kendisi güvenli bir view olmalıdır — switching guest için unprivileged'dır,
yani guest list'lenmiş herhangi bir view'ı istediği gibi seçebilir. Kullanım/abuse:
defansif tooling iki view kullanır (örn. execute-only bir "hook" page'i vs. read/write
bir "original" page'i) ve stealth hook'lar için aralarında ucuza geçmek üzere VMFUNC
kullanır; aynı primitive, VMM over-permissive bir view list'lerse, guest koduna
ulaşmaması gereken belleğe ulaştırır.
EPT-switch single-step'in exit maliyeti olmadan EPT split ve EPT-based stealth hooking'i mümkün kılar.
Walkthrough¶
Kavramsal kullanım (Intel SDM EPTP-switching bölümünden):
VMM kurulumu (root mode):
; secondary exec controls: bit 31 (activate) and bit 13 (enable VM functions)
; VM-function controls: bit 0 (EPTP switching)
; EPTP_LIST_ADDRESS -> page of EPTPs: [0]=normal view, [1]=hook view, ...
Guest invocation'ı (non-root, VM-exit yok):
xor ecx, ecx
inc ecx ; ECX = 1 -> select EPTP list entry 1 (hook view)
xor eax, eax ; EAX = 0 -> EPTP switching VM function
vmfunc
; ...execute under the hook view...
xor ecx, ecx ; ECX = 0 -> back to entry 0 (original view)
vmfunc
Beklenen: aktif EPT view iki VMFUNC arasında exit olmadan değişir; geçersiz bir EAX
veya out-of-range/blocked index ise config'e göre fault verir (#UD / VM-exit).
Warning
Kavramsal. Özelliğin güvenliği tamamen VMM'nin hangi EPTP'leri list'lediğinde yatar; bu kayıt over-permissive bir view'a sahip bir VMM sağlamaz.
Detection¶
- VMM tarafı: yalnızca minimal, intended view'ları list'le; EPTP-list içeriğini logla/sınırla.
- Convertible EPT violation'ları /
#VE, view ile ilgili fault'ları gözlemlemek için kullanılabilir.
Mitigation¶
- List'e asla over-permissive bir EPTP (örn. host/VMM memory'sini map'leyen biri) yerleştirme; list'i guest-reachable olarak ele al.
- VM function'larını ihtiyaç duymayan guest'ler için disabled tut.
- Execute-only hook view'larını SLAT-based W^X ile eşleştir.