今天分享的是IEEE S&P 2020的一篇文章《xMP: Selective Memory Protection for Kernel and User Space》。针对软件和操作系统可能面临的数据导向的内存漏洞攻击问题,这篇文章提出了一种内存划分方案,基于domain的隔离。
文章提到虽然intra-process isolation能提供软件隔离,但由于是面向用户级别的,无法对内核进行保护;并且作者认为实现该技术的硬件特性MPK在一些设备上不存在。为此,作者采用了虚拟化技术,即EPT二级页表来进行domain划分,从而对内核的关键区域和应用的敏感数据进行保护。此外,由于intel平台不支持类似Arm平台的PAC指针一致性保护,所以也提出了一种基于软件的指针一致性保护方法。
1. xMP Domains
基于Intel VMM,可以维护最多512张EPTs。利用VMFUNC指令,可以使得VM的EPT切换无需trap 到VMM,直接在guest VM中完成。对于n个要保护的domain,作者配置了n+1张EPT,1张restricted限制访问所有domain作为vCPU的默认配置,一张拥有对应的domain权限用于访问。
2.融入到Linux
作者为了保护linux的一些关键区域和敏感数据,对linux的内存分配器等组件做了大量的修改,主要对buddy allocator和slab allocator进行了适配,通过增加GFP flag等结构来管理和把内存放在相应的domain。此外,基于VMFUNC指令可以在Linux动态切换xMP domain,因此无需与VMM进行交互,提升了性能。
3.指针一致性
由于X86没有PAC硬件,作者提出了domain内的指针一致性,基于HMAC生成的哈希来认证指针,并将生成的HMAC截断存在页表的48-63 bit位。因为domain有自己的专属EPT,因此key只能在相应的domain里被读取,所以指针认证只在正确的上下文中才能成功通过。
4.应用
对于kernel结构,作者对页表和进程数据结构进行了保护。对所有pgd指针进行了保护。
对应用的敏感数据保护,作者选择了以下几个程序OpenSSL (Nginx), SSH-agent, Mbed-TLS, Libsodium.
原文始发于微信公众号(COMPASS Lab):《论文分享》xMP: Selective Memory Protection for Kernel and User Space