Skip to content

Virtualizing an already-running OS (host-takeover hypervisor)

Zaten boot etmiş bir OS'i runtime'da bir hypervisor altına koymak: bir kernel driver VT-x/SVM'i etkinleştirir ve mevcut CPU state'i guest olacak şekilde VMLAUNCH eder, böylece canlı OS bir VM olarak çalışmaya devam eder — Blue Pill'in meşru-araştırma karşılığı.

Mechanism

Note

Bu, hvpp ("zaten çalışan bir işletim sisteminin virtualization'ına öncelikli olarak odaklanan hafif bir Intel x64/VT-x hypervisor'ı") gibi araştırma hypervisor'larının kullandığı teknik (Blue Pill demotion'ı). Invariant: VT-x, çalışan bir kernel'den VMX root mode'a (VMXON) girmene, guest area'sı mevcut context'i yakalayan bir VMCS doldurmana, guest physical memory'yi EPT üzerinden identity-map etmene (böylece RAM değişmemiş görünür) ve VMLAUNCH etmene izin verir. Execution, kaydedilmiş RIP'te bir guest olarak devam eder. OS, virtualize olduğunun farkında değildir; hypervisor artık configure edilmiş her VM-exit'i görür. Taze bir guest oluşturan bir type-2 VMM'in aksine, burada tek bir guest vardır — mevcut OS — yani device emülasyonu ve boot yoktur.

Walkthrough

Public referans: wbenny/hvpp. Kavramsal akış (araştırma VMM'i, silahlandırılmamış):

  1. Per-vCPU bring-up: vcpu_t::start(), vcpu_t::vmx_enter() üzerinden VMXON region'ını ve VMCS'i kurar, sonra her logical CPU'yu launch eder (IPI'lerle sürülür, böylece her core virtualize olur).
  2. Guest state'i VMCS'e yakala: VMCS guest area'sı mevcut CPU context'inden yüklenir; bir vmexit_handler::setup() callback'i, kodun launch'tan önce VMCS'i değiştirmesine izin verir.
  3. Belleği EPT ile identity-map et: hvpp, guest physical memory'yi (2 MB page'ler) identity-map eder, böylece guest kendi RAM'ini değişmemiş görür.
  4. Exit handler'ı kur: bir vmexit_handler (ör. vmexit_passthrough_handler), exit reason'ları (exception'lar/NMI, CPUID, RDMSR/WRMSR, MOV CR, IN/OUT, VMCALL) dispatch eder — bkz. VM-exit handler interception.
  5. VMLAUNCH: zaten-çalışan OS, reboot olmadan guest olarak devam eder.

Beklenen gözlemlenebilir: load sonrası CPUID bir hypervisor present rapor edebilir ve seçilen event'ler artık daha önce native çalışan VM-exit'lere yol açar.

Warning

Dual-use: aynı demotion, thin hypervisor injection rootkit'inin de temelidir. Fark: bu not araştırma VMM perspektifini (hvpp, Intel VT-x, EPT identity-map, per-vCPU IPI bring-up, passthrough exit handler) merkeze alır; sibling not aynı tekniği stealth rootkit (Blue Pill / AMD SVM, minimal intercept footprint) açısından işler. Teknik için dokümante edilmiştir; hvpp bir araştırma/eğitim VMM'idir.

Detection

  • Timing/state: Blue Pill ile aynı — bare-metal boot eden bir makinede VM-exit overhead'i ve bir hypervisor-present geçişi (VM-exit latency fingerprinting, red pill).
  • Driver telemetrisi: CR4.VMXE/VMXON'u etkinleştiren ve tüm core'ları virtualize etmek için cross-core IPI'ler gönderen üçüncü-taraf bir driver.

Mitigation

  • VT-x/SVM'i OS yüklenmeden önce güvenilir bir hypervisor'dan ya da firmware'den sahiplen, böylece OS'ten gelen sonraki bir VMXON reddedilir (measured boot, VBS).
  • Kernel dayanağını engellemek için HVCI / driver signing ve IOMMU korumaları.
  • Beklenmedik VMX etkinleştirmesi ve EPT identity-map kurulumu için izle.

References

  • wbenny/hvpp — lightweight Intel VT-x hypervisor for virtualizing an already-running OS (README): https://github.com/wbenny/hvpp/blob/master/README.md