当前位置: 华文问答 > 数码

操作系统能否知道自己处于虚拟机中?

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,处在硬件和操作系统之间,可以拦截操作系统的全部硬件交互。检测这类的恶意软件,常规方法显然是不行的。