注:不知道是出于啥原因,很少找到对虚拟化安全防御相关的中文资料,去年很想写这个话题,但我家三星笔记本uefi硬是没法关闭导致无法从硬盘安装双系统又加上virtualbox不支持vt-x嵌套(试了N种方法未成),当然我也没有u盘,故在看完phrack上经典的vm escape文章后留下遗憾,然最近打开一年未开机的笔记本竟然发现解锁版vmware完美支持vt-x嵌套,经过一顿实验后,决定写写这个久违又很感兴趣的话题,抛错引玉也希望能看到更多的分享和资料。
本文分为如下章节:
威胁建模/风险分析
一个真实的逃逸实例
逃逸监控
逃逸防御
应急响应 6谷歌怎么做的
1、威胁建模/风险分析
威胁建模是个很好的系统化进行风险分析的方法,在理解架构、数据流、攻击面时尤为重要。
kvm-qemu实现相对复杂,用尽量通俗的话描述一下。
一个操作系统运行需要cpu,内存,IO/外设,在利用intel vt-x实现的kvm(内核模块),用户态的qemu进程实现了guest系统外设(磁盘/网卡/显示等)的虚拟化(全虚或virtio的半虚拟化,还有利用vt-d实现pci透传的设备不在此探讨。),涉及磁盘读写、网络收发包等实现均由qemu进程中实现(kvm处理io请求后发送给qemu),内核模块kvm利用硬件特性实现了cpu/内存的虚拟化,包括执行guest系统中的代码,处理内存的地址转换(影子页表或intel ept),响应外部中断,kvm对guest系统中的涉及特权/敏感操作的代码实现进行了模拟(读写特殊寄存器等等)。
补充一张网上摘来的KVM运行时图。
下图对数据流走向及信任边界进行了标识。
攻击面分析:
guest-kvm模块
kvm中特权/敏感指令的模拟,中断响应、切换vmx模式等只要在kvm中实现可被guest数据流触发的代码中存在漏洞被利用,kvm实现相对较轻量,所以漏洞相对较少。guest-qemu进程
qemu模拟IO/设备实现中存在漏洞被利用,目前主流公有云的采用了virtio半虚拟 化,而最多的漏洞出现在全虚的设备模拟。
guest-透传的pci设备
guest-宿主cpu
guest代码在宿主cpu执行,cpu硬件漏洞也可能成为利用点。
存在的主要威胁/风险如下:
guest逃逸到宿主机
guest读取同宿主机其他guest数据
宿主机内核被guest拒绝服务/crash
2、一个真实的逃逸案例a) 基于qemu全虚设备模拟的逃逸
详情可参考phrack文章,利用逻辑优美、执行稳定,是少有的可直接拿来验证/演示的实现,为作者点赞赞。(http://phrack.org/papers/vm-escape-qemu-case-study.html)
文章利用两个漏洞实现了完美的虚拟机逃逸,第一个信息泄露漏洞(cve-2015-5165)完美的获得了虚拟机在宿主机物理内存、text段地址、shellcode依赖函数地址。第二个漏洞(cve-2015-5174)利用第一个漏洞的地址泄露实现了代码执行,shellcode直接在宿主机上执行bash,没有用bindshell/反弹的逻辑,避免了宿主机地址不确定/防火墙存在的限制,利用代码中无论是获取地址及shellcode的逻辑都非常优美,值得仔细研究