Skip to content

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.

References