硬件辅助虚拟化及Fuzzing工作研究

一、前言 在IaaS的云平台架构中,VMM(Virtual Machine Manager,也称为Hypervisor)将宿主机物理资源分配给多个客户机使用,租户拥有对客户机的控制权。VMM在不同的客户机之间实现隔离,保证租户之间互不影响。但恶意的租户可能会利用VMM的安全漏洞,逃逸到宿主机上,并进一步危害宿主机上的其他客户机,因此,在攻击者之前发现并修复VMM中的漏洞,是保证云安全的重要工作之一。 下面将依次介绍,虚拟化的背景知识、现有对VMM进行模糊测试的工作、以及VMM相关CVE的case study。 二、硬件辅助虚拟化(以Intel VT为例) 2.1 VT-x (Virtualizition Technology for X86):CPU虚拟化 处理器引入了两种操作模式: VMX Root Operation:VMM(虚拟机监控器)运行的模式,简称根模式。 VMX Non-Root Operation:Guest(客户机)运行的模式,简称非根模式。 每种模式都对应着不同的ring0-ring3特权级别。当处理器从非根模式切换到根模式时,称为VM-Exit;而当处理器从根模式切换到非根模式(例如,VMM调度某个客户机运行)时,称为VM-Entry。 此外,Intel VT-x引入了VMCS(Virtual Machine Control Structure),该结构用于保存虚拟CPU的状态信息。例如,在模式切换时,VMCS会保存处理器状态,如RIP(指令指针)的值,以及两种模式下控制寄存器的值等。VMM可以通过修改VMCS中的内容,来影响CPU的行为。 VT-x还新增了一些指令,用于虚拟化控制: VMLAUNCH/VMRESUME:用于触发VM-Entry。 VMREAD/VMWRITE:用于读取或写入VMCS。 VMXON/VMXOFF:用于进入或退出VMX模式(是否可以执行VMXON取决于处理器的支持)。 VMX的lifecycle如下图所示,首先,软件通过执行VMXON指令进入根模式。在此模式下,VMM可以通过VM Entry(使用VMLAUNCH和VMRESUME指令)加载客户机运行,处理器切换到非根模式。当遇到客户机无法处理的情况,会通过VM Exit将控制权转交给VMM,处理器切换回根模式。VMM可以根据VM Exit的原因采取相应的操作,处理后再通过VM Entry重新加载客户机运行。最后,VMM可以通过执行VMXOFF指令退出VMX操作模式,结束VMX的lifecycle。 VCPU VCPU描述符类似进程描述符,本质是一个结构体,除了VMCS以外,这个结构体还包含VCPU标识信息(例如属于哪个客户机)、VCPU状态信息(例如睡眠还是运行)等,主要供VMM调度时使用。VMM创建客户机时,首先要为其创建VCPU,客户机的运行就是VMM调度不同的VCPU运行。 VCPU的创建 创建VCPU描述符实际上是分配相应大小的内存并进行初始化,具体的初始化内容包括: 分配VCPU标识:标识该VCPU所属的客户机。 初始化虚拟寄存器组:主要就是指初始化VMCS的相关域。 初始化VCPU的状态信息。 初始化额外部件:包括未被VMCS覆盖的寄存器和虚拟LAPIC等部件的配置。 初始化其他信息:根据VMM实现的不同,对VCPU的私有数据进行初始化。 其中,VMCS初始化包括以下几个部分: 客户机状态域:根据物理CPU初始化的状态来设置。例如,物理CPU加电后跳转到BIOS,GUEST RIP字段会设置为虚拟机BIOS的起始地址。 宿主机状态域:参考VMM运行时CPU的状态,用于描述VM-Exit时,CPU切换回根模式时的寄存器值。例如,HOST RIP通常设置为VMM中VM-Exit处理函数的入口地址。 VM-Execution控制域:设置哪些特权指令会触发VM-Exit。 VM-Exit控制域:通常由VMM设置,控制一些字段,如Acknowledge interrupt on exit,有助于快速响应外部中断。 VCPU的运行 当VMM调度VCPU到物理CPU上运行时,需要进行上下文切换,既包括硬件自动切换(VMCS部分),也包括VMM软件切换(非VMCS部分,如浮点寄存器)。具体步骤如下: VMM保存自己的上下文:VMM保存VMCS中未包含的寄存器内容。 加载VCPU上下文:VMM将VCPU中由软件切换的上下文加载到物理CPU。 执行VMLAUNCH/VMRESUME:VMM通过执行VMLAUNCH/VMRESUME指令触发VM-Entry,CPU自动将VCPU中的VMCS部分加载到物理CPU,并切换到非根模式。 \ VCPU的退出 与进程类似,VCPU作为调度单位不会一直运行,它会因为执行特权指令、物理中断等原因发生退出,这种退出称为VM-Exit。发生VM-Exit时,VMM的处理流程如下: VM-Exit发生时,CPU自动进行部分上下文切换。 CPU切换到根模式,并执行VM-Exit的处理函数。 \ 当发生VM-Exit时,相关的处理函数由VMM实现。该处理函数负责根据触发VM-Exit的原因采取相应的处理。虽然VM-Exit的原因可能各不相同,但这些原因的代码可以在Intel的开发者手册中找到。下图截取了手册中的部分exit reasons。 \ VCPU的再运行 当VMM处理完VM-Exit后,会重新调度VCPU继续运行。如果VCPU继续在同一物理CPU上执行,可以通过VMRESUME指令实现VM-Entry。若VCPU被调度到另一物理CPU上运行,由于VMCS与物理CPU是一对一绑定的,VMM需要将VMCS重新绑定到新的物理CPU,然后通过VMLAUNCH指令触发VM-Entry。...

2024年12月18日 · 4 分钟 · tiangong