Intel SGX(2)——内存
enclave page cache(EPC)
enclave 代码和数据放置在称为 enclave 页面缓存 (EPC) 的特殊存储区域中。该内存区域使用内存加密引擎 (MEE) 进行加密,这是一种新的专用芯片。内存总线上的外部读取只能观察到加密数据。页面仅在物理处理器核心内时才被解密。密钥在启动时生成并存储在 CPU 中。
EPC 机制扩展了传统的页面检查,以防止外部访问 EPC 页面。
Enclave Page Cache Map(EPCM)
Enclave Page Cache Map (EPCM) 数据结构用于存储页面状态。它位于受保护的内存中,其大小限制了 EPC 的大小(由 BIOS 设置,最大 128MB)。EPCM 包含了每个页面的配置、权限和类型。
内存管理
数据结构
- Page Information (PAGEINFO):用作 EPC 管理指令的参数以引用页面。其包含线性地址、虚拟地址和指向 SECINFO 及 SECS 数据结构的指针。
- Security Information (SECINFO):用于存储页面元数据,如访问权限(读、写、执行)和类型(SECS、TCS、REG 或 VA)。
- Paging Crypto MetaData (PCMD):用来跟踪与被放逐页面关联的元数据,它包含页面所属 enclave 的标识,一个指向 SECINFO 结构的指针和一个 MAC 值。
- Version Array (VA):用于存储从 EPC 放逐出的页面的版本号。它是一种特殊类型的页面,包含 512 个 8 字节的插槽来存储版本号。
指令
- EPA:此指令分配一个 4KB 内存页面,其中将包含页面版本号数组 (VA) 以防止重放攻击。每个元素的长度为 64 位。
- EBLOCK:该指令阻塞所有对准备放逐的页面的访问。以后对该页面的所有访问都将导致页面错误(“页面阻塞”)。
- ETRACK:该指令从 EPC 中放逐一个页面。该页面必须已被正确准备:它必须被阻塞并且不能被 TLB 引用。在将其写入外部存储器之前,对页面进行加密,并生成版本号和元数据,并执行最终的 MAC。
- ELDB、ELDU:该指令将先前被放逐的页面加载到内存中,无论是否处于阻塞状态。它检查元数据的 MAC、版本号(来自相应的 VA 条目)和页面加密内容。如果验证成功,则对页面内容进行解密并放置在所选的 EPC 页面中,并删除相应的VA 条目。
解释
EPC 内存由 BIOS 定义并且限制大小。SGX 有一种方法可以从 EPC 中删除页面,将其放置在未受保护的内存中,然后再将其恢复。由于 EPC 页面管理指令可以加密页面并生成额外的元数据,这样页面就保持了相同的安全属性。直到所有引用该页面的缓存条目都从所有处理器逻辑内核中删除后,才能删除该页面。内容以页面粒度(4KB)导出或导入。
内存内容
- SGX Enclave Control Structure (SECS):每个 enclave 都与一个 SECS 结构相关联,该结构将包含其元数据(例如其哈希和大小)。任何安全或非安全代码都无法访问它,只能由处理器本身访问。一旦实例化,它也是不可变的。
- Thread Control Structure (TCS):每个 enclave 都与至少一个 TCS 结构相关联,该结构指示进入 enclave 的执行点。由于 SGX 支持多线程,一个 enclave 可以有与 TCS 一样多的活动线程。与 SECS 结构一样,它只能由处理器访问,并且也是不可变的。
- Save State Area (SSA):每个 TCS 至少与一个 SSA 结构相关联,该结构用于在异常和中断处理期间保存处理器的状态。该数据结构在退出时被写入,在恢复时被读取。
- Stack and Heap:每个 enclave 都可以使用其栈和堆。 RBP 和 RSP 寄存器在进入和退出时被保存,但它们的值不会改变。堆不在内部处理,encalve 需要自己的分配器。