此次分享的是发表在IEEE S&P’20的题为《SEIMI: Efficient and Secure SMAP-Enabled Intra-process Memory Isolation》的论文。
Memory-corruption攻击一直是系统安全的主要威胁。为了应对这些威胁,研究人员提出了各种防御措施,包括CFI,CPI,和code (re-)randomization。所有这些方法要想有效,都需要一个安全原语,即对敏感数据的机密性/完整性进行进程内保护。SEIMI的核心是使用高效的Supervisor-mode Access Prevention(SMAP),这是一种最初用于防止内核访问user space的硬件功能,以实现进程内存隔离。
-
Shadow mechanism. 为了减少时间和空间成本,SEIMI重用最后三级页表,并仅复制第一级页表,即PML4。PML4页面有512个条目,每个索引512GB的虚拟内存空间,所以整个虚拟地址空间是256TB。其中,前256个表项指向user space,后256个表项指向kernel space,user space和kernel space各128TB。SEIMI将host页表的PML4页复制到一个新页,称为 PML4’页。在PML4’页面中,清除第 256~511 个条目(因为guest不应访问内核页面),PML4’页面的第 0~255 个条目与 PML4 页面中的对应条目具有相同的值。
-
Configuring the U-page and S-page. 每个页表条目都有一个 U/S 位,指示它是user-mode条目还是supervisor-mode条目。给定一个虚拟内存页面,如果各级页表中对应的条目都是user-mode条目(U/S 位为 1),则该页面将是 U 页面;否则,如果任何条目是supervisor-mode条目(U/S 位为 0),则该页面将为 S 页面。在host页表中,所有user space页都是U页。然而,由于SEIMI从host页表复制guest页表,因此大多数页表条目是相同的。为了在guest页表中配置S页,SEIMI采取Figure 1(a)显示的内存管理策略。PML4’页面的第0-254个条目被修改为supervisor-mode条目,其用于non-isolated内存区域,PML4’页的第255个条目是为隔离内存区域保留的user-mode条目。这样SEIMI将non-isolated内存区域配置为guest页表中的S页,然而,该区域仍然是host页表中的U页。
-
Supporting the read-only isolated S-page region. 为了将同一物理页映射为只读S页和可读写U页,SEIMI首先保留PML4’页中的第254个条目,并让它引用第255个条目引用的同一PDPT页面。然后将第254个条目设置为supervisor-mode模式条目(如Figure 1(b)所示)。与设置S页的方法类似,SEIMI翻转页表项的R/W位以将该页标记为只读。
Figure 1: The memory management in SEIMI.
SEIMI必须拦截VMX non-root模式ring 0中的所有特权指令,并阻止它们访问特权硬件功能。
-
Identifying Privileged Instructions. SEIMI已经确定了20组指令,如Table 1所示。第14-17行的指令是在ring 0和ring 3中表现不同的指令,其他所有指令都是特权指令。这些指令根据SEIMI如何拦截,进一步分为三种类型:EXIT-Type、INV-Type、EXP-Type。
-
Triggering VM Exit. SEIMI显式配置EXIT-Type特权指令来触发VM exit,以捕获并停止其执行。
-
Raising Exceptions. 对于EXP-Type指令,SEIMI 会在执行过程中引发异常。对于Table 1中的#UD、#GP、#PF异常,SEIMI分别给出了不同的处理方法。
-
Invalidating the Execution Effects. 对于INV-Type的指令,SEIMI的解决方案是使其执行效果无效,从而防止攻击者使用这些指令获取信息或更改任何内核状态。
Table 1: The privileged instructions and the instructions that will change the behaviors in different rings in the 64-Bit mode of X86_64.
-
System-call handling. SYSCALL指令用于完成系统调用,不能从VMX non-root或root模式转移控制流。为了解决这个问题,SEIMI选择将代码页映射到目标内存空间,将SYSCALL替换为VMCALL,该内存空间包含两条指令:VMCALL和JMP *%RCX。然后将guest中用于指定系统调用入口的IA32_LSTAR MSR寄存器设置为该VMCALL的地址。一旦进程执行了一条SYSCALL,控制流就会转而执行这条VMCALL指令,从而触发一次hypercall,并且这条SYSCALL的下一条指令的地址将被存储到%RCX寄存器中。SEIMI模块通过内核系统调用表引导hypercall并调用相应的系统调用处理程序。处理程序返回后,模块执行VMRESUME返回VMX non-root模式,并执行JMP指令跳转到SYSCALL的下一条指令。
-
Hardening system calls against confused deputy. SEIMI发现了一个新的confused deputy problem,该问题也存在于以前的进程内隔离机制(例如基于MPX和MPK的机制)中。具体来说,攻击可以利用系统调用来间接访问隔离的内存区域,因为操作系统内核有权访问整个user space,并且其代码不受基于地址和基于域的方法的约束。为了解决这个问题,SEIMI收集所有以内存地址和计数作为参数的系统调用。在内核模块中,SEIMI动态检查指定的地址和计数,以确保指定的内存范围与隔离内存区域没有重叠;否则,SEIMI立即在系统调用中返回错误。
-
Interrupts and exceptions handling. SEIMI配置了VMCS,以便在发生中断/异常时,控制流将传输到SEIMI模块。然后,SEIMI通过中断描述符表对中断/异常进行向量化,对target gate进行权限检查,并调用相应的处理程序。
-
Linux signal handling. SEIMI支持Linux signal,当控制流从VMX root模式传输到VMX non-root模式时,SEIMI会处理signal。
若有理解不当之处,还请批评指正。
![论文分享 | SEIMI 论文分享 | SEIMI](https://ctfiot.oss-cn-beijing.aliyuncs.com/uploads/2024/05/9-1716888176.gif)
原文始发于微信公众号(COMPASS Lab):论文分享 | SEIMI