當前位置: 華文問答 > 數位

作業系統能否知道自己處於虛擬機器中?

2019-12-03數位

虛擬化分為完全虛擬化(full virtualization)和準虛擬化(para-virtualization)兩種,完全虛擬化意思是,guest OS不需要進行任何客製,就可以在hypervisor中執行,例如KVM、VirtualBox;準虛擬化則表示guest OS必須進行客製,把一些硬體操作替換成對VMM的呼叫,例如XEN。

準虛擬化環境中,guest OS一定知道自己在虛擬機器中,如果不知道就沒法正常執行了。在x86引入硬體虛擬化之前,XEN一直是x86虛擬化的唯一方案。

而在完全虛擬化環境中,並沒有100%可靠的辦法,因為這種虛擬化的目的就是模擬真實機器,讓guest OS感覺不到差別。

但是,也存在一些辦法可以進行猜測。例如OS可以探測pci匯流排上的外設,如果發現某些外設的vendor是VMware、VirtualBox這類,那麽很有可能是在虛擬機器裏面。此外還可以獲取硬碟機的product string。

在x86架構下,還可以使用cpuid(eax=1)輔助判斷。Intel文件中說,ecx最高位元「not used, always returns 0」並沒有規定edx最高位位元的含義,但是微軟將這個空閑的bit利用了起來,HyperV環境可以用這個位元來判斷。

上面這些方法都是虛擬機器故意留下一些痕跡,讓OS可以發現。如果虛擬機器不想被發現,就只能借助外部時鐘源進行timing attack。例如,有一種rootkit叫做Blue Pill(藍色藥丸),本身就是一個輕量級的hypervisor,處在硬體和作業系統之間,可以攔截作業系統的全部硬體互動。檢測這類的惡意軟體,常規方法顯然是不行的。