云计算时代已然到来,计算能力已经如同水和电一般,能够被我们随时使用,按需按量使用。依托于公有云设施,你只需轻松点击鼠标,即可购买处理器、内存、硬盘存储、网络带宽等资源,还可以伴随着需求的变化随时灵活调整用量,或增或减。实现这种魔法的核心技术之一正是虚拟化,它是一种能够将单一的硬件资源抽象成可细粒度调配的虚拟硬件资源池的技术。虚拟化技术的诞生极大地提高了计算资源的伸缩性和可管理性。
什么是虚拟机逃逸?
越来越多的应用不再直接运行在硬件上,而是运行在虚拟世界——虚拟机上。相对应的,真实世界中的每一台物理机被称为“宿主机”,通过虚拟化技术,它们被抽象成若干台虚拟机,每一台虚拟机之上可以运行不同的应用程序。这时候,为了防止不同虚拟机中运行的应用之间互相干扰,抢占权限,泄露信息,就要求“宿主机”有能力维持虚拟世界的秩序,让虚拟机之间完全隔离,让应用认识到它所存在的虚拟机就是世界的全部,而看不见其他虚拟机的存在。“宿主机”的这种掌控能力,就是虚拟化技术在设计时必须考虑的目标之一,也是云计算安全的基石。
然而虚拟化技术构建的安全屏障并非牢不可破。《黑客帝国》的主人公Neo生存的“母体”就是一个完全虚拟的世界,当他吞下红色药丸,即可完成“母体”的逃离,从而认识真实世界。虚拟化技术在设计或实现中存在的漏洞就是这颗“红色药丸”,虚拟机里运行的程序可以通过漏洞利用,突破禁锢,掌控“宿主机”,实现虚拟机逃逸。
虚拟机逃逸攻击打破了权限与数据隔离的边界,让攻击者从虚拟机里的“普通人类”,一跃成为掌控宿主机的“神”,得以窥探和管控同一片云下成百上千个虚拟机应用和海量数据。不得不说,虚拟机逃逸已成为云计算时代令人闻风丧胆的重大安全威胁之一,这样的攻击能否真的实现?难度究竟有多少?
过去十年,主流虚拟化技术无一幸免
过去的二十年里,虚拟化技术突飞猛进,虚拟化领域的各种流派都得到了极大的发展。在开源领域,KVM占据了主导地位,Xen以将近二十年的历史也占据了一席之地,甲骨文的VirtualBox大多运用在小型测试场景;在商业战场,VMware稳坐领头羊的位置,微软的Hyper-V在其身后不断发起冲击。
而所有的这些主流虚拟化软件,在过去的十年里,面对虚拟化逃逸攻击,无一幸免,让我们一一盘点这些历史上出现过的“红色药丸”。
2009年,Immunity的安全研究员Kostya在BlackHat上演示了VMware Workstation逃逸。研究人员发现了图形显示相关的SVGA设备中的多个漏洞。SVGA模拟设备为虚拟机的2D和3D图像绘制提供了大量命令,由于在这些命令的处理代码中并未做好参数检查,导致攻击者可以利用内存越界访问来实现虚拟机逃逸。
2011年,来自Ksplice的内核工程师Nelson Elhage在BlackHat上演示了KVM逃逸,逃逸中利用了虚拟PIIX4设备中的漏洞。PIIX4是一个主板上的芯片,支持PCI热插拔,由于虚拟设备在代码实现中并未考虑硬件移除时产生的后果,导致出现了一个释放后使用(Use After Free)的问题。
2014年,Francisco Falcon在REcon上演示了VirtualBox逃逸,逃逸中利用了VirtualBox在3D加速功能中出现的内存访问漏洞。
2016年,阿里云安全团队的Shangcong Luan在HITBSec上演示了Xen逃逸。研究人员发现了Xen在虚拟内存管理中出现的一个漏洞,并通过它实现内存的任意读写,最终实现了对宿主机的控制。同年,世界黑客大赛Pwn2Own中首次引入虚拟机逃逸比赛项目,吸引了全球范围内的安全研究人员的关注,并在2017和2018年连续两年均有参赛选手成功挑战VMware Workstation和VirtualBox虚拟机逃逸。
2018年,长亭科技安全研究实验室的f1yyy在GeekPwn上演示了VMware ESXi虚拟机逃逸。VMware ESXi是企业级虚拟化方案的核心系统,防护级别高于桌面版的VMware Workstation,这是全球范围内针对ESXi的首次逃逸。此次逃逸攻击不仅利用了虚拟网卡设备的多个漏洞,也组合了绕过防护策略的技巧,才得以成功。
2018年,微软安全工程师Jordan Rabet在BlackHat上首次演示了Hyper-V逃逸。厂商的员工对自家产品做公开的攻击演示,是非常少见的情形,很好地证明了微软对待安全的积极和开放态度。微软也为虚拟机逃逸漏洞单独设立了丰厚的漏洞奖励计划,开出了最高一个漏洞25万美元的奖励。在这样的激励下,全球的研究人员为HyperV贡献了不少研究成果。
以上列举了过去十年里具有代表性的虚拟机逃逸攻击案例。可以看到,在攻防对抗的研究浪潮里,主流的虚拟化软件KVM、Xen、VMware、VirtualBox、HyperV无一幸免。事实上,除了这些案例,其他被发现和修复的虚拟机逃逸漏洞还有很多很多,数不胜数。
虚拟设备已成重灾区
虚拟化技术包含了CPU虚拟化、内存虚拟化、I/O虚拟化等技术。回顾过去十年出现的虚拟机逃逸漏洞,I/O虚拟化技术中的虚拟设备是大部分漏洞产生的根源。
虚拟设备通常解决的是物理设备复用的问题,即如何将有限的硬件外设,例如网卡,抽象成多个网卡,来给不同的虚拟机使用。因此虚拟设备就应当有能力模拟出真实设备的完整功能,要能够为虚拟机提供所有真实设备本应支持的接口,并维护和记录自身状态。遇到需要真实硬件完成的功能时,再由虚拟设备进行传递和调用。
完整模拟硬件设备的功能并非易事,开发者需要遵循相关设备的功能说明书,以实现完整接口,供虚拟机使用。这些功能说明书动辄百页,代码实现复杂度较高。再加上虚拟设备种类繁多,出现编码问题的可能性就更大了。
在VMware多年的安全公告中,虚拟设备漏洞的整体数量占比超过了50%;在2016年的统计中,虚拟设备漏洞比例甚至达到了70%。多年来,Qemu项目中虚拟设备的漏洞数量达到了数百个,同时影响到了基于KVM和Xen的虚拟机。VirtualBox甚至公开警告用户谨慎使用一些虚拟设备,声称其中可能存在较大的安全风险。
所幸大量的研究人员已经将这一问题公开出来,一方面大量的虚拟设备漏洞得到发现和修复,另一方面也给虚拟化技术厂商和社区敲响了警钟。面对虚拟设备这一重灾区,未来是否有行之有效的解决方案?
虚拟机逃逸防护的未来
安全的本质是攻防,这句话在几十年的内存漏洞攻防战中得到了完美体现。从1972年美国空军的研究报告中提出“栈溢出”这个概念开始,关于内存破坏类型漏洞的攻防博弈就一直没有停下脚步。攻击者会探索无数精妙的技巧,用千变万化的方式触发漏洞,绕过层层阻碍,实现精巧的内存布局,最终获得程序执行的控制权。而防护者则会思考一些通用方法,在假设漏洞存在的情况下,想尽一切办法阻挠攻击者利用漏洞实现程序控制。这种通用的防御方法我们称为“缓解措施(Mitigation)”。
“栈不可执行”的缓解措施掐断了跳转Shellcode的漏洞利用思路,而倒在了ROP利用技术面前。过去的几十年里,新的缓解措施在不断被提出和应用,增加了攻击者利用漏洞的难度,但是针对性地绕过这些缓解措施的技巧同样也在不断诞生。在这种攻防博弈的过程当中,漏洞利用的难度在不断变大,软件的安全性也得到了不断提升。相比于操作系统刚诞生的年代,如今的攻击者需要越过多重缓解措施的屏障,才能利用漏洞获得程序执行的自由。iOS是利用缓解措施来防止越狱的最佳典范,2018年年末苹果引入的PAC机制将防护级别又一次提升到了顶峰。
虚拟机逃逸同样也是内存破坏漏洞防护和利用的重要战场之一。当前主流的虚拟化技术方案,大多为了性能的考虑,尚未重视缓解措施的使用,例如地址随机性不够、存在可写可执行权限内存等问题依然可以在某些虚拟技术的实现中找到。来自微软的安全工程师Jordan Rabet在2018年的BlackHat大会上也提出了多种利用缓解措施保护Hyper-V的思路。我们相信,在未来,缓解措施必能在虚拟机逃逸防护中发挥积极作用。
软件安全领域,另一种大获成功的防护思路是沙箱。如今,几乎每个浏览器都会启用沙箱机制,便是一个最好的佐证。在引入沙箱之前,任何一个能够控制浏览器执行代码的漏洞都可以一剑封喉,为所欲为——直接获取系统权限。而沙箱,就好比一个牢笼,将攻击者束缚在有限的一片天地,任凭攻击者在牢笼中肆虐,也无碍广阔天地的宁静祥和。本质来说,沙箱机制的基本思路是将被保护对象的权限降到最低,只给保护对象所需的最小权限集合。这种思路能够全面降低保护对象被攻陷后造成的风险,让攻击者即便成功利用了漏洞,能力也是受限的,不足以施展恶意行为。
在沙箱机制的使用上,VMware的ESXi产品走在了前列,VMware将运行虚拟设备的进程通过沙箱保护了起来。长亭科技安全研究实验室在GeekPwn中演示的虚拟机逃逸,额外使用了一个沙箱绕过的漏洞,才得以冲破牢笼,完成逃逸,可见沙箱机制的使用极大地增加了攻击者的难度。微软的Hyper-V目前也启用了沙箱技术保护Worker进程。总的来说,沙箱机制的引入,能够让防守层次化。攻击者只有突破了每一层,才能完成整个攻击;反过来说,任何一个层面缺乏突破手段,完整攻击就无法进行。
基于软件和硬件相结合的缓解措施,以及层层隔离的沙箱机制,或许是虚拟机逃逸防护的未来。