系统虚拟化基础

虚拟化漏洞

  • 特权指令: 只能在最高级别上运行,在低级别状态下执行会产生trap。例如:LIDT只能在系统模式下执行,在其他模式下都会产生trap,中止执行。
    特权指令只能在CPL=0的情况下才能执行;在CPL不等于0的情况下执行特权指令便会产生通用保护(general protection)异常。

  • 敏感指令: 操作特权资源的指令。比如读写敏感的寄存器或者内存。 如popf/pushf等
    敏感指令只能在CPL<=IOPL成立的前提下执行,当CPL>IOPL时会自动产生GP异常

CPL在段寄存器中,表示了当前的特权级别; IOPL在FLAGS寄存器中,表示最小CPL的级别来执行IO操作

所有的特权指令都是敏感指令。但不是所有的敏感指令都是特权指令。

x86系统包含敏感非特权指令,因此不能采用陷入再模拟的方式(VMM运行在最高特权级,guest os运行在非最高特权级上,当guest os执行敏感指令的时候陷入VMM中,VMM再模拟指令)。
也就是说要么guest os中修改host os的控制信息, 要么就是敏感指令被忽略,影响了正确性。

因此如果所有敏感指令都是特权指令,则认为是可虚拟化的体系结构, 否则就是不可虚拟化的体系结构,也就是虚拟化漏洞

解决

  • 取一条指令模拟一条来执行, 就不存在陷入的问题,也就不存在虚拟化漏洞(性能太差)
  • 硬件支持
  • 软件,避免无法陷入的敏感指令

VMM的陷入方式

  • 执行敏感指令时,特权级别不符合
  • 虚拟机通过陷阱指令,主动陷入VMM
  • 异步中断: 比如VMM通过调度算法指定当前虚拟机运行的时间片长度, 然后编程外部时钟源,当时间片用完时触发中断

虚拟机分类

按虚拟平台分类

完全虚拟化(full virtualization): guest os察觉不到运行在一个虚拟平台上, 并且无须对操作系统进行修改

  1. 软件辅助完全虚拟化
  • 优先级压缩(ring compression)
    VMM运行在ring 0, guest os内核运行在ring 1, guest os应用程序运行在ring3, 当guest os执行特权指令的时候,从ring 1触发异常,被VMM捕获。 但是显然没有考虑虚拟化漏洞
  • 二进制代码翻译(binary translation)
    由于优先级压缩的缺陷 ,BT技术的引入主要是为了扫描并修改客户机的二进制代码,将难以虚拟化的指令转换为支持虚拟化的指令,或者显式地触发异常让VMM进一步处理; BT技术也可以被用于性能优化,转换为更高效的指令
  1. 硬件辅助完全虚拟化
    intel的VT-x技术,在处理器上引入了一个新的执行模式用于运行虚拟机,当虚拟机运行在这个模式中时,它仍然有一整套的处理器寄存器集合和执行环境,只是任何特权指令都会被处理器截获并报告给VMM。
    VMM本身运行在正常模式下,在接收到处理器的报告后,对目标指令的解码,找到对应的虚拟化模块进行模拟,并把最终效果反应在特殊模式下的环境中。

类虚拟化(para virtualization)

类虚拟化时通过在源码级别上修改指令来回避虚拟化漏洞。
典型的做法是修改os的处理器相关代码,让os运行在次一级特权上,则os执行特权指令的时候都会触发异常。

按VMM实现结构分类

Hypervisor模型

所有的物力资源都归VMM管理,并向上提供虚拟机用于运行guest os

  • 物理资源虚拟化效率较高
  • 虚拟机的安全只依赖于VMM的安全
  • 但是由于管理所有物理资源,设备驱动的支持度就成了一个问题

对应产品: VMware ESX server

宿主模型

宿主机操作系统管理所有物理资源,因此可以充分利用现有os的设备驱动程序
但是需要调用宿主机操作系统的服务来获取资源进行虚拟化,因此虚拟化效率会有一定影响。
由于VMM是宿主机内核的一部分,因此虚拟机的安全不仅依赖于VMM的安全,也依赖于宿主机os的安全

对应产品: VMware server,性能和安全性上和VMware ESX server有差距,但支持硬件种类较多,并且免费
VMware Workstation, 与VMware server不同的是,专门对桌面应用做了优化
VMware Fusion, 与VMware Workstation的区别在于宿主机os是基于Intel Mac硬件平台的Max OS X

另外常用的KVM事基于intel VT的硬件虚拟化方法,并结合QEMU来提供设备虚拟化。 从架构上可以认为是宿主模型,因为Linux设计之初没有针对虚拟化的支持,KVM以内核模块形式存在,
但是随着越来越多虚拟化功能被加入Linux内核当中, KVM的发起人和维护者都倾向于KVM是一个Hypervisor模型

KVM架构图

混合模型

VMM依然位于最底层,拥有所有物理资源,但与Hypervisor模型不同的是,VMM会让出大部分IO设备的控制权,将他们交由一个运行在特权虚拟机中的特权操作系统来控制。
因此处理器和内存虚拟化依然由VMM来完成, IO虚拟化由VMM和特权操作系统共同合作来完成
结合之前两种模型的优点,但是由于特权操作系统运行在虚拟机上,当需要特权操作系统频繁时,上下文切换也会造成性能的明显下降

对应产品: Windows Server 2008, Hyper-V作为Hypervisor运行在最底层,Server 2008作为特权操作系统运行在Hyper-V上, 并采用硬件虚拟化,必须运行在Intel VT技术或AMD-V技术的处理器上
Xen: 引入I/O的前端/后端驱动架构实现设备的类虚拟化,Xen 1.0/2.0成功实现类虚拟化,即图中的Domain 0和Domain N,Xen的类虚拟化性能接近物理机;
Xen 3.0支持了Intel VT和AMD-V的完全虚拟化,即图中的VMX Domain,并利用了QEMU的设备模拟代码

Xen架构图