Sgxelide

Posted by Maxul's Technical Notes on April 27, 2018

题目: 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之上构建应用,进而保护应用代码保密性。

贡献点:

  1. 建立针对SGX程序的代码保密性做系统性的保护模型;
  2. 给出框架SGXElide;
  3. 在Linux上证明移植的简易,同时没有运行时负担。

SGX的默认保护模型:

  1. 数据+代码完整性:MAC(消息验证码)+远程验证
  2. 数据保密性:运行时数据对外不可见,换出数据MEE硬件自动加密
  3. 代码保密性:运行时不可见,但静态二进制容易被分析。
  4. (笔者观察,静态情况下数据的保密性也是不存在的,一个enclave.so和普通so无任何差别)

挑战:

  1. 一个直接的思路是对enclave的代码页加密,运行时解密,但可惜的是,v1不允许修改其权限,无法对代码段执行写操作。
  2. 无法完全加密,必须留一块在外头做bootstrap代码,而且是明文!
  3. 密钥不能放在镜像中,否则会被逆向抽取。只能从远程的可信机器中获取。

思路:

  • 学习加壳技术,但无法照搬。

方法:

  1. 创建dummy enclave;
  2. 对所有函数加密;
  3. 使用远程验证获取密钥;
  4. 从存储中获取全加密镜像,加载后解密。

架构:

见原文图1、图2。

相关工作:

  • SGX-LAPD,利用编译器对page攻击做防御;
  • T-SGX和Cloak都利用HTM防止旁路攻击;
  • SGX-Shield利用ASLR抵御内存攻击;
  • SGXBounds检查缓冲区溢出。

体会:

  1. Zhiqiang Lin团队擅长VMI和LLVM。发表了sgx-lapd,引入对SGX程序的程序分析后,有了本作品自然不过,都是对代码的加固。
  2. 该工作难度似乎不大,其实验选的都是加密小程序,工作量不大。
  3. Dummy Enclave最早由DSN ‘17上关于Enclave的动态迁移的设计提出。