背景知识
1. Intel SGX
Intel SGX狭义上是指一组CPU指令,该组指令增强应用程序代码和数据的安全性,为它们提供更强的保护以防泄漏或修改。开发人员可将敏感信息放入Enclave中,Enclave是内存中具有更强安全保护性的执行区域。
Intel SGX广义上是指以SGX指令为基础所构建的包括Intel CPU等硬件、CPU提供的硬件指令、驱动、Platform Software(用于构建不可信运行时环境uRTS)、SDK(用于构建可信运行时环境tRTS)等在内的一种新的安全机制,既Intel SGX软硬件栈。
SGX平台需要Intel 6代及以上处理器,并且BIOS支持并开启了SGX选项。
2. 常用名词
Intel SGX:Intel Software Guard Extensions的简称。
Enclave:下述条目针对Enclave不同的角度来表述,实际表述中不太加以区分,并且更侧重于指Enclave实例。
Enclave内存:Enclave是内存中具有更强安全保护性的执行区域。
Encalve环境:通过Enclave内存及硬件保护机制、可信运行时共同来保护敏感代码数据的环境,或者说安全世界。
Enclave代码:希望放在Enclave中执行的敏感代码数据。
Enclave文件:保存着Enclave代码数据的镜像文件。与实例的区别好比程序代码与进程的区别,一个静态,一个动态。
Enclave实例:指从Enclave文件具体执行起来的进程。
EPC:Enclave Page Cache。Enclave的物理内存是一种抽象的表示,Enclave物理内存会最终落实到一个个具体的物理页,这些页就是来自于EPC。也就是说EPC是一块加密的处于系统保留内存的物理内存区域,用来存放Enclave的页和SGX数据结构。
EP:Enclave Page。EPC中一个个具体的页。为了方便读者理解,也可称为EPC页
SGX世界观:SGX将软硬件资源等划分成安全世界和不安全世界
安全世界:包括可信运行时和用户的Enclave实例,安全世界中Enclave实例会利用可信运行时提供的API完成敏感功能等。而每个开发者进程都有自己的独立的Enclave环境,不同Enclave的安全世界相互隔离。
不安全世界:包括不可信运行时和用户的非敏感代码以及具有内核权限的驱动。
uRTS:Untrusted Runtime Service,不可信运行时环境,不安全世界、普通世界的一部分。
tRTS:Trusted Runtime Service,可信运行时环境,安全世界、Enclave环境的一部分。
AE:Architectural Enclave。由SGX平台提供完成特定功能的特殊的Enclave,包括:Launch Enclave,用于决定在当前SGX平台上运行哪些其他Enclave(主要指用户的Enclave实例);Provisioning Enclave,提供长期平台证明密钥;Quoting Enclave,使用非对称平台证明密钥,用于为远程使用者签署本地证明报告;Platform Service Enclave,平台服务Enclave,用于提供如可信的时间等安全功能。
OCALL:从安全世界进入不安全世界所用到的桥函数。
ECALL:从不安全世界进入安全世界所用到的桥函数。
ISV:Individual Software Vendor个体软件厂商
SgxEdger8r:SGX Edge Routine,主要用于在编译过程中对.edl文件中的ecall和ocall重新封装编写,即将用户编写的e/ocall改写成实际执行的e/ocall
3. 常用结构体
SECS:SGX Enclave Control Structure。每个Enclave实例都具有一个该结构体,用于保存关于该实例的信息,如Enclave的线性基址(对于整个程序而言)和大小。保存在EPC中该Enclave的内存空间,只能由CPU访问。
TCS:Thread Control Structure。每个Enclave实例可以拥有很多个具体执行Enclave函数的Worker Thread,每个线程都对应一个TCS,用于描述这个线程的信息,如线程执行flag、SSA的位置、当前使用的SSA(若干个SSA组成一个栈)。存储在EPC中,只能由处理器访问。
SIGSTRUCT:ENCLAVE SIGNATURE STRUCTURE。每个Enclave文件具有一个SIGSTRUCT来证明它是被某个SGX平台签署的。(见后续“EINIT指令过程”章节)
EINITTOKEN:EINIT TOKEN STRUCTURE。从Enclave文件创建Enclave实例时,需要向AE申请一个令牌,后续EINIT指令使用EINITTOKEN结构来检查是否允许执行Enclave。(见后续“EINIT指令过程”章节)
EPCM:ENCLAVE PAGE CACHE MAP。被硬件用来跟踪EPC内容,每一个Entry对应一个EP。软件不可访问。每个Entry会说明EPC页的线性地址等。
SGX的可信保障及优点
- Enclave这块特殊内存采用加密技术,保障内存代码、数据的机密性和完整性。
- 任何对Enclave进行的访问都需要经过严格地访问控制。
- 可信计算基础(TCB)缩小到CPU的SGX Enclave这一硬件保障设施,而不再要求操作系统和特权程序是可信的。
- 支持虚拟化技术和容器技术。
SGX的不足
- Enclave处于用户态,如果Enclave中的代码数据依赖于Enclave外部数据,则存在安全隐患,需要Enclave代码对传入的外部数据检查。
- SGX 本身无法抵御侧信道攻击,因为不是为侧信道防御而设计的,但是可以在程序开发过程中进行设计防御。
- Enclave 需要对原程序进行改造,通过特殊的.edl文件声明将敏感代码放入Enclave中执行,将不敏感代码放在普通内存中执行。
- Enclave所支持的特殊加密内存的大小很小,因此开发者应该只将至关重要的敏感的代码数据放入其中。
- SGX会产生一定程度的系统开销。
SGX与TrustZone区别
TrustZone将系统划分为安全世界和普通世界,实现了执行环境以及存储、网络和屏幕等设备的安全隔离,敏感代码放入安全世界执行。TrustZone里面程序是直面硬件资源的,并且TrustZone内部的多个程序间并没有安全隔离,直到有相关工作在TrustZone里面安置了一个安全内核,如T6安全微内核(上海瓶钵主导的工作,在Trustzone里实现了安全操作系统的功能,实现了敏感应用之间的隔离,还可以让开发者更好地使用物理硬件,安全微内核只有六千行代码,非常轻量级,同时经过安全审计)。【SecTEE】等工作也试图在TrustZone内部提供Enclave的概念(包括了SGX所提供的可信度量、加密、访问控制、密封、本地认证、远程认证中的部分功能),之前也听到有相关工作在ARM芯片的普通世界构建Enclave,而不是在TrustZone内部,似乎硬件实现机制有一些区别,忘记了。
SGX中,对于每一个进程,可以创建多个类似于“安全世界”的Enclave,并且不同进程之间的Enclave是互相硬件隔离的——通过MEE使用独立的密钥加密Enclave内存进行保障。
SGX内存布局及访问控制
这一块很多资料来源于:
王鹃, 樊成阳, 程越强, 等. SGX 技术的分析和研究[J]. Journal of Software, 2018, 9: 2778-2798.
1. SGX结构简介
每个进程可以创建若干个Enclave实例(不过比较常见的情况是一个实例),Enclave执行程序的敏感代码,保护敏感数据。Enclave之间、Enclave与普通世界之间都存在访问控制(后续“SGX访问控制”章节会讲述)。基本结构如图4所示(详细的软件栈构造会在后续“SGX软件栈”章节中描述)。
- 硬件暴露的功能。硬件向外暴露Enclave Page Cache(EPC是一块加密的处于系统保留内存的物理内存区域,用来存放 Enclave的页和SGX数据结构,也就是说Enclave的物理内存会最终落实到EPC)和EPCM(用于管理EPC页的访问控制,EPCM只能由硬件访问)及硬件指令。
- 内核权限环境(既驱动)的功能。内核权限环境有一个管理分配给Enclave的EPC页的页表,此外还能利用内核权限硬件指令管理Enclave的生命周期,并把生命周期管理的功能向上提供给不可信运行时环境。
- 用户权限环境的功能。用户权限下的不可信运行时可以管理Enclave生命周期。用户权限下的可信运行时帮助Enclave环境执行敏感代码以及调用用户权限硬件指令,所提供的库必须是经过安全审计的库,而且只能通过静态链接。
图1:SGX基本结构
2. Processor Reserved Memory布局
如图2所示,BIOS通过配置一组范围寄存器分配Processor Reserved Memory(PRM)。其中包括EPC和其他保留给硬件使用的内存。EPC中会分配Page给SGX数据结构供Enclave使用。
图2:Processor Reserved Memory布局
3. Enclave内存结构
如图3所示,每个Enclave内存由EPC中分出的若干Page构成,用于存储Enclave代码、Enclave数据——比如涉及金融等敏感操作的代码数据、TCS。
线程控制信息TCS。Enclave代码的执行是由某个具体线程(进程只有一个线程时就是指进程对应的主线程,或者说进程)来执行,那么这个线程在Enclave中需要保存一份描述其针对于Enclave管理用的相关控制信息,既Thread Control Structure(TCS),换句话说,TCS保存着进出Enclave时候所恢复或保存的Enclave线程信息。举个例子就是,线程1从普通世界进入安全世界,需要佩戴安全世界的工作证,当离开安全世界,需要放下安全世界工作证,拿上linux环境的工作证。
图3:Enclave结构
4. Enclave Page Cache Map结构
如图4所示。Enclave Page Cache Map(EPCM)是一个硬件结构,保存着分配给Enclave的Page的控制信息,一个Page对应一个 EPCM 表项,控制信息包括页面是否已被使用、该页的拥有者、页面类型、地址映射和权限属性等。EPCM 结构由 PMH(Page Miss Handler)硬件模块访问,这个模块通过查询页表、范围寄存器、EPCM 进行内存访问。
图4:Enclave Page Cache Map结构
5. SGX访问控制
Enclave基本访问控制如图5所示。
- Enclave 外部的应用程序按照段页保护机制访问PRM外部内存(普通内存)。
- Enclave 外部的应用程序不能访问 Enclave 内存
- Enclave 内部的代码在EPC范围内只能访问属于自己的内存区域,不能访问别的Enclave内存。
- Enclave 内部的代码按照段、页保护机制访问PRM外的内存。
- Enclave 内部的代码不能访问其他PRM内存。
图5:Enclave基本访问控制