您所在的位置:首页 > 保密法治宣传教育

虚拟机逃逸安全研究

来源:国家保密局网站 发布日期:2021-08-20
字体: [大] [中] [小]

  【摘   要】虚拟化技术是云计算实现提供用户灵活增减IT资源、按需付费等特色服务的基础。虚拟化技术架构主要由宿主机、虚拟化层和虚拟机3部分组成,每个部分都存在各种安全问题,其中虚拟机逃逸被认为是对虚拟机安全最严重的威胁之一。本文提炼虚拟机逃逸的提权模型,划分其表现特征,并对虚拟化安全的研究提出了展望。

  【关键词】虚拟化 虚拟机逃逸 提权模型 表现特征

  1 引言

  近些年,虚拟化技术从开源KVM、XEN到Docker和Kubernetes,微服务和软件定义网络的理念模糊了开发和运维的界限,也把更多的安全问题带入到虚拟化技术中。更多基础设施即服务(Iaas)管理平台的问题以及云供应商的不可控都给虚拟化技术的安全应用带来阻碍,而真正的虚拟化安全要从虚拟化技术本身谈起。虚拟机分享宿主机的资源,宿主机提供了虚拟机之间、宿主机与虚拟机之间的隔离。虚拟机的设计理念是虚拟机上运行的程序不能监控和交互宿主机与其他虚拟机上运行的程序。但是随着虚拟化技术的延展,这种隔离机制被弱化,导致安全问题的发生。一个最典型的攻击类型是虚拟机逃逸,早在2007年,就有研究人员提出当宿主机与虚拟机之间的隔离机制被弱化的时候,它是最严重的威胁。虚拟机逃逸的定义是指虚拟机里运行的程序利用虚拟机的漏洞突破虚拟机管理器(Hypervisor),获得宿主机操作系统管理权限,并控制宿主机上运行的其他虚拟机,导致安全环境架构的彻底破坏。

  虚拟化环境中,上层虚拟机与底层虚拟机监控器进行交互,实现对底层物理资源的访问,而这种交互过程就是潜在的引入虚拟机逃逸漏洞的关键。虚拟机逃逸的发生来源于虚拟化技术自身的安全问题,而虚拟化自身的安全问题往往由虚拟化技术的机制产生。下面从虚拟机逃逸的提权模型和表现特征展开讨论。

  2 虚拟机逃逸的提权模型

  虚拟机逃逸种类繁多,原因复杂,很难对其进行归纳总结,提取共同特征。本小节基于虚拟化系统中指令处理的机制和原理,尝试揭示虚拟机逃逸的根本原因,提出虚拟机逃逸的提权模型,发掘虚拟机逃逸的根源。

  2.1 虚拟机逃逸的提权机理

  攻击者利用虚拟机操作系统发起执行相关敏感指令的请求,该指令会交由内核态去处理,对于某些特权指令会交由Hypervisor处理,此时攻击者可利用Hypervisor的脆弱性漏洞使得Hypervisor执行完特权指令后不产生指令状态的返回,导致用户态停留在了内核态,攻击者实现了提权,随后攻击者可以渗透到Hypervisor和虚拟机的其他区域,破坏虚拟化的隔离机制,完成逃逸操作。虚拟机逃逸的关键机理是先提权后渗透,提权完成系统级别的控制切换,渗透完成隔离机制的破坏,从而打破虚拟化体系的安全机制。

  虚拟机逃逸是一个复杂多变的过程,完成一次成功的逃逸攻击,需要具备下面4个条件:

  (1) 一个有漏洞的内核;

  (2)一次可匹配漏洞的逃逸;

  (3)拥有将逃逸转移到目标位置的能力;

  (4)拥有在目标位置上执行逃逸攻击的能力。

  假设用户处于Ring3状态,实现逃逸利用的通用流程为:

  (1)诱使内核在根模式Ring0下运行企图的有效载荷;

  (2)修改任意数据,例如进程权限;

  (3)以新权限启动一个Shell,并获取root权限。

  权限提升的目的:

  (1)读/写任意的敏感文件;

  (2)系统重启后依然运行;

  (3)插入永久后门。

  2.2 虚拟机逃逸的提权模型构建

  CPU指令按照运行级别的不同,可以划分为特权指令和非特权指令两类。特权指令只能在最高级别上运行,非特权指令可以在各个级别的状态下执行。引入虚拟化后,客户机操作系统就不能运行在Ring 0上,原本需要在最高级别下执行的指令不能直接执行,而是交由Hypervisor处理执行,这部分指令称为敏感指令。属于特权指令的敏感指令可以陷入Hypervisor下直接执行。而非特权指令的敏感指令在(软件)全虚拟化模式和半虚拟化模式下需要进行复杂的陷入和模拟操作才能执行,该难题在硬件辅助虚拟化下得到解决。

  权限提升在虚拟化系统中尤为重要,包括两部分权限提升,从用户层到内核层,从内核层到虚拟化层。权限提升可以使得攻击者获得更高的权限,运行的代码级别更高,危害更大。下面分别给出全虚拟化/半虚拟化模式提权模型和硬件辅助虚拟化模式提权模型。

  全虚拟化/半虚拟化的提权模型如图1所示。


  


  在全虚拟化和半虚拟化模式下,敏感指令在Ring0级执行完后没有返回用户级Ring3,而是驻留在Ring0级,表示用户态应用程序成功逃逸到最高特权级。

  为了减轻全虚拟化模式应用二进制翻译技术带来的性能消耗过大,以及克服半虚拟化模式需要修改虚拟机操作系统带来的不便,硬件辅助虚拟化模式在2005年出现,并成为至今普遍推广的虚拟化模式,其提权模型如图2所示。


  


  在硬件辅助虚拟化模式下,非根模式Ring3级的用户操作使得敏感指令在根模式的Ring0级执行后驻留在Ring0,表示虚拟机非根模式应用程序成功逃逸到根模式宿主机最高特权级。

  3 虚拟机逃逸的表现特征

  当前对虚拟机逃逸的分类没有一定的标准,为了最大程

  度涵盖截至当前出现的虚拟机逃逸漏洞,本小节从国内外专业漏洞库CVE(Common Vulnerabilities and Exposures,公共漏洞和暴露)和NVD(National Vulnerability Database,国家漏洞数据库)搜集信息,采用造成虚拟机逃逸漏洞的表现特征来进行分类,任何一个逃逸漏洞包括表现特征的一个或多个组合,其表现特征主要划分为以下4个方面。

  3.1 拒绝服务类型

  传统拒绝服务是指通过占满服务器的所有服务线程或者网络带宽,导致正常的服务请求无法得到响应,致使服务器处于瘫痪的状态。拒绝服务类型虚拟机逃逸与传统网络攻击中的拒绝服务攻击有所区别,虚拟机环境中,恶意用户以正常租户的身份获取客户虚拟机,利用设备仿真或其他类型漏洞,引起缓冲区溢出或内核崩溃,导致客户机恶意停止工作,甚至影响其他客户虚拟机,造成严重的拒绝服务。一个典型的拒绝服务类型虚拟机逃逸漏洞如CVE-2019-3887:基于内核虚拟机的虚拟化系统(Kernrel-based Virtual Machine,KVM)的Hypervisor在启用嵌套虚拟化的情况下处理x2APIC特殊机器寄存器(MSR)访问的方式存在缺陷。在这种情况下,当启用“virtualize x2APIC mode”时,L1 guest虚拟机可以通过L2 guest访问L0的APIC寄存器值。攻击者可以利用此漏洞致使主机内核崩溃,从而导致拒绝服务问题。

  3.2 内存隔离失效类型

  内存隔离失效类型主要包括缓冲区溢出和堆栈溢出等,缓冲区溢出是一种非常普遍、非常危险的漏洞,在各种操作系统、应用软件中广泛存在。缓冲区在系统中的表现形式是多样的,高级语言定义的变量、数组、结构体等在运行时可以说都是保存在缓冲区内的,因此所谓缓冲区可以更抽象地理解为一段可读写的内存区域,缓冲区攻击的最终目的就是希望系统能执行这块可读写内存中已经被蓄意设定好的恶意代码。按照冯·诺依曼存储程序原理,程序代码是作为二进制数据存储在内存的,同样程序的数据也在内存中,因此直接从内存的二进制形式上是无法区分哪些是数据哪些是代码的,这也为缓冲区溢出攻击提供了可能。

  利用缓冲区溢出攻击,可以导致程序运行失败、系统宕机、重新启动等后果。而缓冲区溢出类型的虚拟机逃逸漏洞,则更为严重,它可以利用溢出执行非授权指令,甚至可以取得系统特权,进而进行各种非法操作,对数据的安全造成严重威胁。

  CVE-2020-8834是较新的堆栈损坏逃逸攻击,在Power8处理器上的Linux内核中,KVM在kvmpc{save,restore}tm中使用HSTATE_HOST_R1将R1状态存储在kvmpcuhv_entry plus中时发生冲突,导致堆栈损坏。具有在客户虚拟机内核空间中运行代码能力的攻击者可以导致主机内核死机。

  3.3 权限提升类型

  权限提升漏洞是指利用该安全漏洞使得自己突破了原来的限制,能够非法访问其他信息,甚至使得自己能够如管理员那样来获取整个系统控制权。权限提升型虚拟机逃逸漏洞即:客户机非法获取了宿主机操作系统权限,进而实现对整个集群的控制能力。这种权限提升要么来源于指令操作的错误结果,要么来源于系统对某些指令或指针没有预先的限制而导致潜在的权限提升可能。

  CVE-2018-10853虚拟机逃逸漏洞是一个权限提升类型的代表,在KVM4.18版本之前,Linux内核的Hypervisor处发现了一个仿真指令的错误。在仿真非权限指令时,它不检查当前权限级别,导致一个非权限用户或进程可以利用这个错误提升权限。

  3.4 QEMU仿真错误类型

  KVM的内核模块存在于系统Linux内核,并且直接在内核态上执行,一旦内核模块攻陷,攻击者甚至无须进一步提权。但是,内核模块比用户空间组件的代码量少很多,攻击者难以下手,而且从实施的角度讲,攻击者很难从客户机上接触到存在于物理机的内核组件。QEMU是由法布里斯·贝拉(Fabrice Bellard)所编写的以GPL许可证分发源码的模拟处理器,可以模拟多款不同架构的CPU,还包含部分硬件模拟,例如软驱、显卡、并口、串口、声卡、网卡等以提供基本的操作系统运行所需环境。而QEMU作为组件中代码量最庞大也最陈旧的部分,在设备仿真过程中,更容易成为攻击者的下手对象,当前的QEMU-KVM可以多线程实现硬件I/O虚拟化。

  例如:CVE-2020-25637的漏洞,是在libvirt6.8.0之前的版本中,出现双可用内存问题,该问题发生在请求有关正在运行的QEMU域的网络接口信息的过程中,影响访问控制驱动程序。尤其是使用有限的ACL权限连接到读写套接字的客户端,可能会利用此漏洞使libvirt守护程序崩溃,可升级其在系统上的权限。

  从以上4种虚拟机逃逸的类型中可以看出,无论逃逸用什么方法,最终的目的是提权,只有这样,才能造成宿主机或Hypervisor崩溃,或执行任意代码,从而控制Hypervisor或其他虚拟机户。

  4 虚拟化安全研究展望

  本文设计了虚拟机逃逸的提权模型,概括了虚拟机逃逸的表现特征。当前对虚拟化技术的安全威胁、安全研究点以及安全架构众说纷纭,是为了研究虚拟化安全而试图增添更多的威胁还是脱离了虚拟化技术本身而去研究实际系统安全,笔者做出以下的研究展望。首先,虚拟化技术本身是充分利用资源,是计算资源的高效利用,而不是敏感数据的无规则处理。研究虚拟化技术安全,应该从其本身的机理、特征出发,分析其对系统造成的影响。其次,虚拟化的管理平台带来了更多的安全问题,从最早的cloudstack到openstack管理平台,从红帽的RHEV管理平台到开源的oVirt管理平台,以及各家各自基于开源代码的虚拟化管理平台均是如此。与其说是虚拟化技术选择了管理平台,不如说是管理平台选择了虚拟化,而所谓的安全问题、安全威胁让虚拟化技术脱离其自身的机理,而是更偏向了传统系统安全。最后,云供应商当前被认为是存储数据不可控的源头,甚至是虚拟化系统不安全的一个重要原因。实际一个安全的系统不应该由外界接触,而是建立自己的补丁测试团队和安全运维团队。美国很早就让敏感系统脱离外界接触,供应商根本不知道给谁提供了系统,给谁提供了服务,而是由敏感系统的设计团队负责,只有这种模式才能解决外界不可控的问题。总之,虚拟化安全融入系统安全得到重视,也应因系统安全而萌发独特活力。

  (原载于《保密科学技术》杂志2020年10月刊)


相关附件