题目: SGXElide: enabling enclave code secrecy via self-modification
作者: Erick Bauman, Huibo Wang, Mingwei Zhang, Zhiqiang Lin
单位: The University of Texas at Dallas
出版: CGO 2018
解决的问题:
- SGX的二进制是可以被逆向的,加载也是由不可信的OS来完成,因此被攻击的可能性很大。因此有必要保护代码的保密性。
- 已有的例子如游戏反外挂。另外在DRM方面,也有各种技术,如control flow flatting, signal-based control flow hiding, code encryption and packing,就是为了防止二进制漏洞被人利用,反过来导致信息泄露。
- 很可惜,SGX SDK自己说:enclave的二进制文件是可以反汇编的,因此这些算法并不会保密。因此作者说,其实SGX只保护了数据保密性,而不是代码保密性,而完整性是都有保护的。SGX只在加载之后才开始起作用。
- 既然如此,本文将代码当成数据,在SGX SDK之上构建应用,进而保护应用代码保密性。
贡献点:
- 建立针对SGX程序的代码保密性做系统性的保护模型;
- 给出框架SGXElide;
- 在Linux上证明移植的简易,同时没有运行时负担。
SGX的默认保护模型:
- 数据+代码完整性:MAC(消息验证码)+远程验证
- 数据保密性:运行时数据对外不可见,换出数据MEE硬件自动加密
- 代码保密性:运行时不可见,但静态二进制容易被分析。
- (笔者观察,静态情况下数据的保密性也是不存在的,一个enclave.so和普通so无任何差别)
挑战:
- 一个直接的思路是对enclave的代码页加密,运行时解密,但可惜的是,v1不允许修改其权限,无法对代码段执行写操作。
- 无法完全加密,必须留一块在外头做bootstrap代码,而且是明文!
- 密钥不能放在镜像中,否则会被逆向抽取。只能从远程的可信机器中获取。
思路:
- 学习加壳技术,但无法照搬。
方法:
- 创建dummy enclave;
- 对所有函数加密;
- 使用远程验证获取密钥;
- 从存储中获取全加密镜像,加载后解密。
架构:
见原文图1、图2。
相关工作:
- SGX-LAPD,利用编译器对page攻击做防御;
- T-SGX和Cloak都利用HTM防止旁路攻击;
- SGX-Shield利用ASLR抵御内存攻击;
- SGXBounds检查缓冲区溢出。
体会:
- Zhiqiang Lin团队擅长VMI和LLVM。发表了sgx-lapd,引入对SGX程序的程序分析后,有了本作品自然不过,都是对代码的加固。
- 该工作难度似乎不大,其实验选的都是加密小程序,工作量不大。
- Dummy Enclave最早由DSN ‘17上关于Enclave的动态迁移的设计提出。