论文:SecPod: A Framework for Virtualization-based Security Systems
链接:
https://www.usenix.org/conference/atc15/technical-session/presentation/wang-xiaoguang
会议:usenix security 2015
操作系统内核对于一个计算机系统的安全是关键的。许多系统都被提出提高他的安全性。那些系统的一个基础的脆弱点就是页表,页表的数据结构控制了内存保护,它并没有从脆弱的内核中隔离出来,因此容易收到篡改。为了解决这个问题,研究人员依赖于虚拟化来实现可靠的内核内存保护。不幸的是,这样的内存保护需要监视客户页表的每次更新。这从根本上与硬件虚拟化支持的最新进展相冲突。在本文中,我们提出了一个可扩展的基于虚拟化的安全系统框架SecPod,它可以提供强隔离和与现代硬件的兼容性。SecPod有两种关键技术,页委托来审核内核对安全空间的分页操作;当内核通过滥用特权指令来企图推翻SecPod时进行捕获拦截。我们已经基于KVM实现一个SecPod的原型。我们的实现表明SecPod是有效高效的。
如今的内核都内置了一些防止攻击的措施,比如地址空间分布随机化和写执行抑或操作。 尽管很大程度上提高了攻击的门槛,但是这些系统都是建立在一个薄弱的基础上,即页表在内核中总是可写的。这就导致任何内核内存保护都可以通过操控页表来绕过。
许多安全工具需要拦截和响应虚拟机中的关键事件,每个截获的事件都会导致虚拟机和虚拟机管理程序之间比较大的代价的切换。另外,嵌套分页允许客户自由的更新他们的表而不涉及虚拟机管理程序,然而来宾页表GPT更新是许多安全工具感兴趣的一个关键事件,这就迫使hypervisor运行在一个低效的影子页模式,只有这样才能捕获和验证来宾页表的更新。为了解决这个冲突,需要做到既满足虚拟化安全工具的需求,又能充分利用硬件虚拟化的支持。
SecPod的两个关键技术是分页委托和执行陷阱。它可以将一个安全工具封装在可信的执行环境中,这个环境和易受攻击的内核共存,即一个专用的地址空间和内核地址空间并行。内核将所有的分页操作委托给安全空间,这样内核就被剥夺了直接修改有效页表的特权,安全空间通过对来宾页表更新进行消毒来实施不可绕过的内存隔离。执行陷阱阻止攻击者通过滥用特权指令破坏安全空间的企图。
早期x86的hypervisor使用影子分页来虚拟化来宾内存,这样使得来宾页表GPT被他的影子页表SPT所代替,也就是通过SPT将虚拟内存映射到物理内存。任何GPT的更新必须通过SPT同步才能发挥作用。
现在的x86有硬件虚拟化支持,嵌套分页就是对内存虚拟化的硬件支持,其中处理器使用两级页表NPT来转换来宾内存访问。guest完全控制其GPTS,而hypervisor管理NPTS,并且不知道对GPTS的更改。因此,可以通过重新映射GPTS中(受保护的)来宾虚拟内存来规避NPTS中强制的内存保护。例如,NPT中强制的数据执行预防(DEP)可以通过将客户内核代码重新映射到可写可执行物理内存来绕过。
SecPod架构下的地址转换
将地址分为了普通空间和安全空间,内核和用户地址范围都在普通空间,而内核的特权请求必须通过entry门和exit门进出安全空间.
除此之外,地址映射采用guest virtual address
=>GPT(normal space)
=>SPT(security space)
=>NPT
(hypervisor)=>physical address
对内核页表的任何更新都必须合并到SPT才能生效,因为SPT是CPU使用的唯一页表,内核可能保留自己的页表以方便实现,但它们从不加载到CPU以进行地址转换。这在技术上类似于传统虚拟化系统中的影子分页。
安全空间通过入口门为这些操作中的每个操作公开服务。 为了委派这些操作,我们可以用对安全空间中相应服务的调用来替换内核中的每个分页操作。而这些狗子已经被设计在内核中,比如pvops接口。
在这里利用Linux内核的PVOPS接口将分页请求转发到安全空间。 pvops接口源于Xen项目为了创建一个通用的半虚拟化内核而出现的接口,此内核可以适应不同的虚拟机管理程序以及本地的非虚拟化平台。PVOPS将关键的准虚拟化操作分成几个结构,pv_time_ops
,。pv_cpu_ops
,pv_mmu_ops
,pv_lock_ops
,pv_irq_ops
和代替PV的操作。比如原生的x86系统使用mov to cr3
加载页表,而pvops使用pv_mmu_ops->write_cr3
。
SecPod地址空间布局
上下文切换
Secpod实现了基于页表的隔离。 要切换空间,我们需要将下一个空间的页表加载到CR3中。 安全空间只有一个页表,即Secpod页表,而普通空间有许多影子页表,每个用户进程一个。
将虚拟化硬件配置为捕获这些指令(内核的一些特权指令,比如mov to cr3
),不管它们是良性的或者无意的。我们的设计保证合法的上下文切换不会被硬件捕获。在系统管理程序截获由guest执行的敏感指令后,它将事件通知安全空间。