3.2 针对虚拟化的安全攻击
2018年11月上映了一部很火爆的好莱坞大片,名字叫作《毒液》(VENOM),讲的是一种外星生物入侵人体的故事。现实的计算机网络中,也有毒液病毒攻击的存在。2015年5月,一个名为“毒液”(VENOM)的QEMU漏洞使数以百万计的虚拟机处于网络攻击风险之中。VENOM是Virtualized Environment Neglected Operations Manipulation,虚拟环境中被忽视的业务操作的缩写,这是一种能够影响QEMU软盘控制器驱动程序的漏洞。QEMU是一个指令级模拟器的自由软件实现,被广泛用于各大GNU/Linux发行版,包括Debian、Gentoo、SUSE、RedHat和CentOS等。该漏洞可以从受感染的非特权虚拟机获得宿主机的代码执行权限,进入同一宿主机上的其他虚拟机当中,获取对宿主机网络的访问权限,并尝试获得证书等敏感信息,实现虚拟机逃逸攻击。攻击者可以使监控程序崩溃,并能够获得目标机器以及其上运行的所有虚拟机的控制权,它可以执行任意代码,从而威胁到全球各大云服务提供商的数据安全。
2015年8月,安全漏洞CVE-2015-6815通过构造恶意的数据流造成虚拟机的拒绝服务,并持续占用CPU资源,从而破坏宿主机及虚拟机的正常服务。2015年10月,安全漏洞“破天”利用PV模式运行的非特权虚拟机实现虚拟机逃逸,从而控制Hypervisor、Domain 0以及宿主机上的虚拟机。2016年4月,安全漏洞“传送门”(Dark Portal)利用越界读写内存漏洞,可以在宿主机中执行恶意命令。该漏洞存在于Xen和KVM系统的QEMU模块中的VGA显卡组件,攻击者可以利用该漏洞在虚拟机中发动攻击,控制宿主机中的进程执行恶意代码。
攻击者经常利用虚拟机与一些设备的依赖关系,如视频适配器、软盘控制器、IDE控制器、键盘控制器和网络适配器等,来获得对物理机的访问,然后利用系统中存在的漏洞实施攻击。以上VENOM就是利用软盘控制器驱动程序的漏洞实施攻击。更多安全漏洞可以参考中国国家信息安全漏洞共享平台公布的数据[33]。本节将对虚拟化环境下的攻击方法进行分类,介绍一些常用的虚拟机攻击方法。
3.2.1 虚拟机攻击分类
上一小节列出了虚拟化技术带来的安全挑战,具体而言,从攻击的角度,可以将攻击方式分类如下[34]。
1. 虚拟机跳跃
虚拟机跳跃(VM Hopping)是指攻击者利用一台虚拟机通过某种方式获取同一个VMM上的其他虚拟机的访问权限。例如,在同一物理机上的虚拟机A通过获取虚拟机B的IP地址或宿主机的控制权,监控虚拟机B的流量,进行流量攻击等操作,使虚拟机B离线,造成通信中断,停止服务。虚拟机的物理资源被多租户共享是出现这种攻击方式的根源所在。
2. 虚拟机逃逸
虚拟机逃逸(VM Escape)是一种常见的虚拟机攻击方式。正常情况下,同一虚拟化平台下的客户虚拟机之间不能互相监视或影响其他虚拟机及其进程,但虚拟化漏洞的存在或隔离方式的不正确可能会导致隔离失效,使得非特权虚拟机获得Hypervisor的访问权限,并入侵同一宿主机上的其他虚拟机,这种攻击方式称为虚拟机逃逸。虚拟机逃逸与虚拟机跳跃攻击的不同之处在于,虚拟机逃逸攻击需要获取Hypervisor的访问权限甚至是入侵或破坏Hypervisor。
多租户技术是云计算与云存储的关键技术,在基于多租户技术系统架构中,多个租户或用户的数据会存放在同一个存储介质上甚至同一数据表里。尽管云服务提供商会使用一些数据隔离技术(如数据标签、访问控制)来防止对混合存储数据的非授权访问,但攻击者利用漏洞攻击、旁路攻击等方法仍然可以实现非授权访问[35]。2009年3月,Google Docs就发生过不同用户之间文档的非授权交互访问。
3. 远程管理缺陷
虚拟化平台管理人员通常使用远程管理平台通过Hypervisor提供的接口对虚拟机进行管理,如VMware的vCenter、XenServer的XenCenter。集中管理降低了管理复杂度,但可能带来如跨站脚本攻击、SQL注入等危险。
内部人员可以通过管理工具对虚拟机进行恶意操作,例如虚拟机转存(Dump)、快照(Snapshot)和迁移(Live Migration),甚至虚拟镜像备份。按攻击层次可以将攻击对象分为Hypervisor、客户操作系统(GOS)和应用软件,其中Hypervisor和GOS是主要的攻击目标。内部攻击比外部攻击更易实施、成功率更大,而且不易被发现,因此带来的威胁和危害更难控制。
4. 拒绝服务攻击
拒绝服务攻击是指攻击者利用各种攻击方法造成目标机不能正常提供服务。同一物理机上的虚拟机共享资源,如果攻击者利用一台虚拟机获得宿主机的所有资源,导致其他虚拟机没有资源可用,就会造成虚拟化环境下的拒绝服务攻击。
5. 虚拟机迁移攻击
虚拟机迁移时,需要先迁移虚拟机的内存等状态信息,并传输虚拟机副本到新的物理机上恢复运行,攻击者有较多的时间获取敏感信息,而且若被迁移的虚拟机存在安全漏洞,迁移到的物理机安全性又不高,则很容易遭受攻击。由于攻击对象并非真实虚拟机,因此较难溯源攻击者的身份。
6. 虚拟机监视器攻击
在虚拟化环境中,虚拟机监视器是核心,控制着整个虚拟化平台。由于虚拟机监视器的权限较高,其安全问题显得尤其重要,一旦被攻破,将造成整个虚拟化平台的崩溃。
在虚拟化软件栈中,VMM具有最高权限和较小的可信计算基,从而能为虚拟化系统提供安全监控和保护,但同时也引入了新的软件层,带来新的安全风险。尽管这些共享着相同硬件资源的虚拟机在VMM的控制下彼此隔离,但攻击者仍然可以通过流量分析、旁路攻击等攻击手段从一台虚拟机上获取其他虚拟机上的数据[36]。
3.2.2 虚拟机攻击方法
以上是关于虚拟机攻击方式的分类,但具体到攻击方法,主要包括以下一些攻击方法[37]。
1. 窃取服务攻击
公共云计算或云存储环境一般采用多种弹性计费模式,通常根据CPU、虚拟机的运行时间,存储空间的大小,网络流量等进行费用计算。而这种计费模式的周期性采样与低精度的时钟调度策略使得攻击者可以利用虚拟层调度机制的漏洞,使系统管理程序错误地检测CPU、虚拟机的使用时间,实现窃取服务攻击(Theft-of-Service Attack)。常规的虚拟机调度机制没有对调度的正确性进行检查,使得攻击者可以以隐蔽的方式占用他人的云服务资源。
2012年,Varadarajan等人[38]提出的资源释放型攻击(Resource-Freeing Attack,RFA)能够将合法用户的虚拟机资源非法转移到攻击者的虚拟机,从而达到与窃取服务攻击类似的攻击效果。目前还没有可以完全避免这类攻击的可行方案。在RFA攻击中,攻击者通过耗尽目标虚拟机的某些关键资源,使目标虚拟机终止正在进行的服务并释放已占用的资源,攻击者利用新释放的资源来改善自身的性能。他们在Amazon EC2平台上的实验结果表明,攻击者借助RFA攻击可以获得13%的性能提升。
Gruschka和Jensen[39]利用监视机制来对比分析攻击者与合法实例之间的差异以识别窃取服务攻击,从而保护虚拟机安全。Zhou等人[40]则通过修改调度机制来防御此类攻击,他们提出的方法有效地兼顾了计算效率、公平性与I/O响应能力。另外一种防御此类攻击的方法是实施虚拟机最小化策略,包括对可信计算基[41]和虚拟机软件[42]的最小化,可以减少受攻击面同时保护用户隐私。这些方法没有检测调度的正确性,或者是检测的准确性比较低,都无法有效抵御RFA攻击。
2. 恶意代码注入攻击
当前的虚拟机系统通常使用远程管理平台通过Hypervisor提供的接口对虚拟机进行管理,那么攻击者就可以利用恶意实例代替系统服务实例处理正常的服务请求,从而获得特权访问能力,实施恶意代码注入攻击(Malware Injection Attack)。对于一个基于HTTP/HTTPs的远程管理平台,攻击者就可以利用HTTP的漏洞来进行恶意代码的攻击。例如,Xen的XenAPI HTTP接口就存在跨站脚本攻击(Cross-Site Scripting,XSS)漏洞,攻击者可以通过浏览器执行恶意代码脚本。这些恶意代码可以泄露证书信息和用户数据,导致虚拟机异常。
与传统Web应用环境不同,云计算环境的虚拟化特征加剧了恶意代码注入攻击的安全威胁。云端的服务迁移、虚拟机共存等操作使得恶意代码的检测工作异常困难,目前仍然缺少对云服务实例完整性的有效检查方法。
现有防御恶意代码注入攻击的关键是对包含恶意实例的计算节点的检测。Liu等人[43]针对PE(Portable Executable,可移植的可执行文件)文件格式设计了可追溯的检测方案,在Hadoop平台上实验检测了恶意实例所在的主机。他们的方案具有较高的检测率和较低的误报率,但该方案的检测开销比较大,而且在检测过程中存在泄露隐私的风险。Jarabek等人[44]提出一种轻量级云移动终端反恶意软件系统,可以改善移动端恶意代码的检测效率。Wei等人[45]提出一种基于确定有限状态机(Deterministic Finite state Automaton,DFA)的评估技术来检测加密文件的内容真实性,同时用于恶意代码扫描。这些方法没有检查实例的完整性,或者检测的开销很大,可检测的恶意代码种类也比较有限。
3. 交叉虚拟机边信道攻击
虚拟机之间利用共同访问的资源来实施恶意的攻击,称为交叉虚拟机边信道攻击(Cross VM Side Channels Attack)。交叉虚拟机边信道攻击要求攻击者与目标虚拟机使用相同的物理机,或者在地理位置上接近,因为在相同的物理机上执行一些任务,或者能够接近物理机,使得攻击者有机会获取目标虚拟机的行为,得到一些可用于攻击的信息。比如,攻击者可以借助恶意虚拟机访问共享硬件和缓存,然后执行预定的安全攻击,如计时边信道攻击[46]、能量消耗边信道攻击[47]、高速隐蔽信道攻击[48],[49]等,最终导致目标虚拟机的用户数据泄露。因为攻击者拥有使用物理机的权限,因此此类攻击一般难以留下痕迹或引发警报,能够很好地躲避检测。
边信道攻击可以分为3种方式:基于时间驱动(Time Driven)[50]、基于轨迹驱动(Trace Driven)[51],[52]和基于访问驱动(Access Driven)[53],[54]。基于时间驱动的攻击是攻击者重复地检测被攻击者的加密操作所使用的时间,然后通过差分分析等技术推断出密钥等信息。基于轨迹驱动的攻击通过持续地对设备的电能损耗、电磁发射等情况进行监控,获取到其敏感信息,但是这类边信道攻击需要攻击者能够物理接近攻击目标。基于访问驱动的攻击是攻击者在执行加密操作的系统中运行一个应用,这个应用用于监控共享Cache的使用情况,从而获取密钥信息。基于访问驱动的攻击的优势是不需要攻击者得到受害者精确的时间信息。基于Cache的边信道攻击不需要获取Hypervisor等特权,也不需要利用系统漏洞,只需通过对时间损耗、电源损耗以及电磁辐射等特性的监测和统计,就可以获取到其他客户虚拟机的数据。
Aviram等人提出的计时边信道攻击[46]通过测量不同计算任务的执行时间,可以成功获取用户与服务器的身份信息。Hlavacs等人提出的能量消耗边信道攻击[47]利用能量消耗日志开展攻击,可以帮助攻击者快速识别目标虚拟机系统管理程序的类型。2012年,Wu等人[48]在虚拟化x86系统中基于Cache的边信道攻击实现了高速隐蔽信道攻击,使得攻击者能够在数秒或数分钟内从当前流行的加密方法(RSA、AES和DES)中获取到受害者的密钥信息。2015年,Liu等人[49]围绕最后一级缓存(Last-Level Cache,LLC)提出了一种新型隐蔽信道攻击,它无需依赖共享内存以及操作系统或虚拟机系统管理程序的漏洞,就可以达到较高的攻击成功率。Inci等人[55]则是通过LLC来检测主机托管,在Amazon EC2平台上完整恢复了2048比特的RSA私钥。
现阶段针对交叉虚拟机边信道攻击的典型防御策略有密钥划分机制[56]和最小运行时间担保机制[57]。密钥划分机制将用户密钥划分为随机份额,并以周期性更新的方式将各个密钥份额存储于不同的虚拟机,有效防范利用交叉虚拟机边信道攻击窃取加密密钥的攻击行为。最小运行时间担保机制优化虚拟机调度机制以降低缓存共享的安全风险,规定在最小运行时间限制内不能预先占用CPU资源。
4. 定向共享内存攻击
定向共享内存攻击(Targeted Shared Memory)以物理机或虚拟机的共享内存或缓存为攻击目标,可以造成用户数据泄露或云服务器信息泄露;也可以利用他进行其他类型的攻击,比如可以进行恶意代码注入攻击与边信道攻击。
2011年,Rocha和Correia[58]提出一个结合内部攻击访问虚拟机的内存转储数据的攻击方案,可以导致系统当前运行状态与用户隐私信息的泄露。Molina等人[59]提出一个可以解决内存耗尽故障攻击的方案。目前抵抗此类攻击的方法是根据日志文件来监控内存。与直接监控内核例程的方法相比,这种检测方法的检测效果不是很好,而且会干扰对共享内存的正常访问。
5. 虚拟机回滚攻击
虚拟机回滚攻击(VM Rollback Attack)是指通过非法恢复虚拟机状态快照,使系统回滚到之前的状态而带来的安全攻击,它可能导致用户数据泄露,破坏云基础设施,并且可以隐藏攻击痕迹。
在云计算与云存储的虚拟化环境中,管理程序可能由于系统维护的原因,挂起虚拟机并保存系统状态快照。而且,VMM提供了备份、快照和还原的功能,如果系统发生故障,可以通过快照进行数据恢复与还原,从而保障系统的正常运行。但是,这些管理和可靠性保障机制却带来了一系列的安全隐患。首先,一些安全协议是依赖于线性时间的,重新访问以前的系统状态会违反这些协议,可能导致虚拟机受到新的攻击;其次,进行系统还原后,之前的系统漏洞又再次全部出现,而且重新激活之前被封锁的账号和密码,导致很多的安全风险。
2012年,Szefer等人[60]提出禁用挂起恢复功能,从而抵御虚拟机回滚攻击。Antunes等人[61]和Xia等人[62]提出利用虚拟机审计日志和状态快照的哈希值作为合法性的判断条件,而无需禁用系统管理程序的基本功能。但是,该方案依赖于用户的交互,需要终端用户的参与及协调,从而降低了灵活性,同时也干扰管理程序功能。
6. 基于虚拟机的Rootkit攻击
Rootkit的概念最早出现在UNIX中,是指一些收集工具,能够获得管理员级别的计算机或网络访问权限。
攻击者利用Rootkit隐藏自己的踪迹,通过保留root访问权限,在虚拟机系统中留下后门,这种攻击就称为基于虚拟机的Rootkit攻击(Virtual Machine based Rootkit,VMBR)[63-65]。VMBR攻击会在VMM启动之前将程序代码写入内存并运行,一旦攻击者得逞,那么所有虚拟机系统都将在攻击者的控制范围之内。VMBR攻击属于虚拟机逃逸[66]的攻击类别,虚拟机通过应用程序,绕过VMM的监控而直接访问Domain 0,从而获取Domain 0的特权,而一旦获取到了Domain 0的控制权后,就可以控制所有虚拟机。VMBR攻击是利用所发现的漏洞来实施的,如VMware Workstation 6中的安全漏洞CVE-2007-4496[67],通过用户授权进行内存访问并运行恶意代码。同时,被控制虚拟机还可以利用共享内存通信方式对VMM进行病毒分析。
在虚拟机中,如果Hypervisor被Rootkit控制,Rootkit就可以得到整个物理机的控制权。Rootkit的本质不在于获取更多的权限,而是在一个已经被攻击的系统上隐藏攻击者的存在。它通过把恶意程序放在虚拟机上,可以做到对目标机的完全监控,同时目标机完全不会知情。
VMBR使用一个独立的服务执行各种攻击。它对目标系统的攻击主要分为3种:一种不需要和目标系统交互,例如垃圾电子邮件的发送、DDoS攻击、网络钓鱼等;第二种恶意服务需要监视目标系统的数据和事件,通过修改VMM的设备模拟软件就能记录下所有系统级的数据,比如用户的操作、网络流量等,整个过程不需要修改客户操作系统,所以目标机完全不知情;第三种利用虚拟机欺骗有管理员权限的用户执行安装程序来实现,通过写好的后门和病毒程序让用户执行来控制其他虚拟机。
微软公司和密歇根大学的研究人员实现了一种VMBR攻击方法SubVirt[64]。SubVirt依赖商用的虚拟化软件,如VMWare或Virtual PC,来构建虚拟化环境。在SubVirt注入之前,目标操作系统直接运行在硬件之上;注入之后,则目标操作系统上移,建立在虚拟化软件VMM上的一个虚拟机上。VMBR的组件由虚拟化软件VMM、主机操作系统以及其上运行的恶意软件组成。恶意程序运行在VMM或主机操作系统中,与目标操作系统隔离开,从而使得目标操作系统中的入侵检测软件无法发现和修改该恶意程序。同时,VMM能够掌握目标操作系统上的所有事件和状态,当VMBR修改这些事件和状态时,由于它完全控制了面向目标操作系统和应用程序的虚拟硬件,目标操作系统将无法发现这些修改。
检测及防御VMBR攻击的方法如下。
(1)计时的方法,通过检测一个指令的执行时间,判断该指令是否存在VMBR攻击。Rhee等人[68]提出利用预设的安全策略,通过监视内核的内存访问来防御动态数据内核VMBR攻击;Riley等人[69]提出了通过内存影子来检测内核VMBR攻击。
(2)通过可信模块(Trusted Platform Module,TPM)来保护VMM[70],[71]。通过启动过程的完整监测,可以防止Rootkit的隐蔽植入。TPM的设计不但可以抵御VMBR的攻击,也可以防御其他破坏VMM完整性的攻击。
7. DMA攻击
在虚拟机中有一种数据传输不受VMM控制,它就是DMA(Direct Memory Access,直接内存访问)传输。DMA攻击就是在DMA传输过程中将恶意代码输入到目标机,从而实现攻击的。
在DMA传输时,虚拟机通过Domain 0与硬件建立DMA连接,Domain 0将数据控制权交由虚拟机进行数据传输。在数据传输的过程中,数据将直接从网卡传输到目的虚拟机中,能够极大地提高大数据量的传输效率。但是,这种数据传输方式为攻击者攻击系统提供了捷径,攻击者可以利用DMA传输将恶意代码或病毒文件等传入没有安全防范的目标机中,实现其攻击目标。
除了上述的虚拟机攻击方法,虚拟机中的隐蔽通道也是较难解决的安全问题之一。虚拟机中的隐蔽通道通常是系统和用户不知道的传输通道,比如基于CPU负载的隐蔽通道[72],攻击者利用CPU负载传输私密数据流,既能很隐蔽地传输数据,又能成功地避免检测,Salaun[73]研究了虚拟机Xen上可能存在的隐蔽通道,从XenStore的机制、共享协议、驱动加载、数据传输等方面分析了可能存在的隐蔽通道。隐蔽通道的建立和数据传输通常需要“同伙的存在”,即接收者和发送者的存在。Cheng等人[74]根据这一特征,在中国墙(Chinese Wall)安全模型上进行了改进,利用限制冲突集数据传输来防御隐蔽通道。
恶意代码注入攻击、交叉虚拟机边信道攻击、定向共享内存攻击和虚拟机回滚攻击都会造成敏感信息泄露或未授权访问私有云资源。以数据泄露为例,攻击者可以通过边信道和虚拟机逃逸等攻击方式窃取其他虚拟机的数据。在此需要强调的是,这些安全威胁并不是独立存在的,它们可以相互依托并相互转化。据文献[34]统计,虚拟化平台的漏洞主要是权限许可和访问控制、信息泄露以及缓冲区溢出,而传统环境下的安全漏洞主要是拒绝服务、跨站脚本与SQL注入漏洞。