SEIMI:Efficient and Secure SMAP-Enabled Intra-process Memory Isolation

标题和来源

2020S&P:SEIMI: Efficient and Secure SMAP-Enabled Intra-process Memory Isolation

contribute

  • 提供了一种新奇的domain-based的隔离机制:利用SMAP的机制提出了一种有效防御内存腐败攻击。
  • 一种隔离user 代码的新方法:定义了一种新的安全威胁,在ring运行不信任的user code,然后提出了对于这种威胁的隔离方法。表明了运行user code在privileged mode 是可行的。
  • New insights from implementation and evaluation:(emmmm,这也算贡献吗,讲道理,但是毕竟中科院的论文,说是贡献就是吧,毕竟咱菜)

background

  • A:Information Hiding(IH)technique:即利用随机化的方式将内存放在一个随机位置。
  • B:Intra-process Memory Isolation:进程内部的内存隔离比IH的方法更安全一点。这里指把sensitive data保护起来。其中sensitive data分为三类:1)Confidentiality only. 2)Integrity only 3)Both confidentiality and integrity。同时现有的memory-isolation机制分为两类:一类是address-based,一类是domain-based。前者利用边界检查等方式进行隔离(MPX),后者利用RW权限来进行隔离(MPK)。

PS:前面那三类sensitive data,第一类和第三类貌似有点难以区分,第二类指的是和完整性相关但是不用加密的,比如返回地址啊,PID这类的数据,第一类和第三类比如秘钥啊,随机数啊这些的东西。

  • C:Intel VT技术
  • SMAP和smep技术:防止kernel运行userspace的code(smep),防止kernel获取userspace的数据(smap),类似的有ARM中的PAN和RISC-V中的SUM。同时RFLAGS寄存器的AC(access control)flag用于控制是否允许Supervisor-mode访问User-page。

Threat model

  • seimi的目的是为了提供进程内部的隔离,即提供一块安全的内存区域,防御被内存腐败攻击。并且假设目标程序可能具有能够被攻击的漏洞,使得攻击者获得二进制读写能力。但是seimi认为程序编写者不是恶意的,即恶意软件不算在保护的范畴。
  • 同时假设内存腐败防御是安全的,也就是说打破seimi的内存隔离是损坏内存防御的前提条件。
  • 当seimi有效的时候,攻击者不能执行code注入攻击和code-reuse攻击,即不能恶意地修改SMAP flag。
  • 同时认为OS是信任的并且安全的。

Design

high-level

image-20210902153800618

隔离的domain被认为是user-page,其余的内存都被设定为S-page,如图所示。当受信任的code要访问isolate memory时候,执行STAC去disbale smap,当完成访问后执行CLAC去enable samp。并且smap是线程安全的,即一个线程所在的CPU核disable了smap,别的CPU核仍然是不允许访问的(这是由于smap是由RFLAGS寄存器控制的,线程安全的),并且STAC/CLAC指令比switching MPK更快。

同时由于在ring-0(S-mode)运行untrust的程序可能会攻击内核,所以seimi把kernel放在ring -1运行,即用VT-x技术将应用程序和kernel分离,将应用程序放在VMX non-root mode(guest),kernel放在root mode(host)。

challenge and approaches

  • 需要区分SMAP的Read和write权限:通过分配两个虚拟地址指向同一个物理地址来区分,其中一个映射设置为U-page,可以用于read和write,另一个映射设置为S-page,并且只允许读。
  • 防止泄露一些关键的特权级数据结构比如IDT,PGTable,SDT等:把特权数据结构以及他们的操作放在了VMX root mode下。通常当内核访问这些数据结构的时候都是通过系统调用,中断和异常来操作的,所以利用VT-x技术去拦截这些操作,导致VMExit。
  • 可能会在特权级下滥用硬件的特性,比如使用mov 指令修改pagetable的WPbit来修改权限等:1)触发VMexit,并暂停执行。2)使运行结果失效。3)引发处理器异常并禁用执行。

architecture

image-20210908115842290

如上图示SEIMI的整体架构,它将kernel放在VMX root mode 下,进程运行在vmx non-root模式下的ring0和ring3,其中ring3部分用以isolation,别的process运行在vmx root 模式下的ring3.

SEIMI包含了三个组件,包括

  • 内存管理:用以目标process的管理和配置regular/isolated 的内存区域
  • 特权级指令的预防:预防特权指令被攻击者滥用
  • event的重定向。:配置和截断vmexit,当应用使用syscall,中断和异常时候,触发vmexit。

内存管理

因为non-root mode没有 kernel,所以page table要在host的kernel中进行管理,然后将host的pagetable 拷贝到guest作为guest的pagetable,并且修改相应的S-page和U-page即可。并且这样带来一个好处是guest并不能获取page table,因为那是host kernel memory 分配的,guest不能访问到host。同时为了减轻开销,复制全部的page table比较耗时,所以只复制第一层的page table。由此提出了一个shadow mechanism。

image-20210908124656272

A shadow mechanism for (only) page-table root.

如图a所示,将host的PML4的前面256个entry设为u-page,后面256设为S-page。然后把这一页copy给process(图片中称为PML4’ page),它将后面256个kernel的entry清除(因为guest不能访问kernel的页),其余的256个user的page是一样的。

Configuring the U-page and S-page.

在page table中,如果所有级别的页表的U/S bit都是1,则它将是u-page,否则任何一个级别的是0,则它是S-page。而在guest中,0-254entry被设置成S-page,255设置成U-page。从而形成二者的隔离。

Supporting the read-only isolated S-page region.

SEIMI将#254 entry设置成R/W为0,而#255 entry设置成R/W为1,从而在user mode下是可读可写, supervisor mode下只能读。

特权级指令的预防(这部分内容比较多且细节,详细内容看paper,讲很清楚)

image-20210908130214527

上表列出了所有预防的特权指令,

文中细讲了exp type中的部分指令:

#UD VMCS中配置了运行这些会触发

#GP:如何利用段描述符和segment cache来阻止切换segment等等。

#PF:page fault

INV:不让运行

重定向event

system call handling

由于syscall指令不能将控制权从non-root mode切换成root-mode,由此可以用vmcall代替syscall。其中利用设置IA32_LSTAR MSR寄存器,当syscall发生时候,控制流转而运行vmcall指令,然后下一条指令地址会被存储在RCX寄存器中,然后seimi通过在rootmode中重定向到相应的syscall,然后再通过vmresume指令返回,并jmp %rcx运行。

Hardening system calls against confused deputy

一些系统调用比如read和write会以地址和count作为参数,通过对这些系统调用进行校验,防止访问到隔离的区域(即non-root mode下的ring0 想去访问ring3.)

Interrupts and exceptions handling

所有的异常和中断都会触发vmexit,从而进入到seimi中,然后seimi根据中断向量表,进行检查后call handler。

Linux signal handling

具体看paper。