Windows10下使用Intel SGX功能(四):SGX技术分析

参考文献

SGX 介绍

SGX 发展情况

SGX技术目前已经发展到SGX2。比如安全证明功能只能在SGX2上才能运行。

sgx发展

SGX2相较于SGX1增加了Enclave动态内存管理(Enclave Dynamic Memory Management,简称为EDMM)能力。

在SGX1的指令集中,创建Enclave时需要提前确认Enclave需要用到的内存大小。并且在运行过程中代码模块不能动态加载到Enclave中。这种设计一是增加了Enclave的启动时间,因为需要确认所有内存地址。二是限制了EPC的空间大小,因为需要预分配,考虑到合理性,SGX1 EPC内存上限被设置为256M。这就导致了在运行过程中超过256M的堆栈,会被以换页的形式加密换出到系统内存中,类似换页就会带来较大的性能开销。

SGX2设计引入了EDMM机制,提供了在保证安全性的同时可动态扩缩Enclave内存的能力。EDMM方案中EPC中内存的分配主要有基于OCall事件触发的分配以及基于缺页终端触发的分配两种模式。其核心都是由SGX Driver分配内存页,再由Enclave确认分配生效,分配机制对应用层透明。

SGX2在引入EDMM后,安全性没有降低。SGX2依旧确保Enclave内存页的一致性,一致性可以被度量。由于内存分配依赖OS,为了防止OS提供错误的内存页,每一次内存调整Enclave都需要二次检查内存页(包括权限)的正确性。

SGX 指令

SGX定义了18条新指令。13条由 Supervisor 使用,5条由用户使用。所有这些指令都是在微代码中实现的(因此它们的行为可以被修改)。完整的指令列表见下文。

sgx指令

SGX 数据结构

英特尔SGX还定义了13个新的数据结构。8个用于 enclave 管理,3个用于内存页管理,2个用于资源管理。

  • SGX Enclave Control Structure (SECS)
  • Thread Control Structure (TCS)
  • State State Area (SSA)
  • Page Information (PAGEINFO)
  • Security Information (SECINFO)
  • Paging Crypto MetaData (PCMD)
  • Version Array (VA)
  • Enclave Page Cache Map (EPCM)
  • Enclave Signature Structure (SIGSTRUCT)
  • EINIT Token Structure (EINITTOKEN)
  • Report (REPORT)
  • Report Target Info (TARGETINFO)
  • Key Request (KEYREQUEST)

内存

Enclave Page Cache (EPC)

Enclave代码和数据被放置在一个特殊的内存区域,称为Enclave Page Cache(EPC)。该内存区域使用**内存加密引擎(MEE)**进行加密,这是一个新的专用芯片。内存总线上的外部读取只能观察到加密的数据。只有在物理处理器核心内的页面才会被解密。密钥在启动时生成并存储在CPU内。

SGX下CPU的页面检查流程如下:

Enclave Page Cache Map(EPCM) 结构用于存储页面状态。它位于受保护的内存内,它的大小限制了EPC的大小(由BIOS设置,最大128MB)。它包含每个页面的配置、权限和类型。

内存管理

数据结构

  • 页面信息(PAGEINFO) 结构被用作EPC管理指令的参数,用于引用一个页面。它包含其线性和虚拟地址,以及指向SECINFO和SECS结构的指针。
  • 安全信息(SECINFO) 结构用于存储页面元数据:访问权限(读/写/执行)和类型(SECS、TCS、REG或VA)。
  • 分页加密元数据(PCMD) 结构用于跟踪与被驱逐页相关的元数据。它包含该页所属的 enclave 的身份,一个指向SECINFO结构的指针和一个MAC。
  • 版本阵列(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 memory management

内存结构

  • SGX enclave 控制结构(SECS):每个 enclave 都与一个SECS结构相关联,该结构将包含其元数据(例如,其散列和大小)。任何安全和非安全的代码都不能访问它,只有处理器本身可以访问。一旦被实例化,它也是不可改变的。
  • 线程控制结构(TCS):每个 enclave 至少与一个TCS结构相关联,它表示进入 enclave 的一个执行点。由于SGX支持多线程,一个 enclave 可以有多少个活动线程就有多少个TCS。和SECS结构一样,它只能被处理器访问,而且也是不可改变的。
  • 保存状态区(SSA):每个TCS至少与一个SSA结构相关联,在处理异常和中断时,它被用来保存处理器的状态。它在退出时被写入,而在恢复时被读取。
  • 堆栈和堆:每个 enclave 都可以使用其堆栈和堆。RBP和RSP寄存器在进入和退出时被保存,但它们的值不会改变。堆不是内部处理的, enclave 需要他们自己的分配器。

Enclave 应用程序流程

SGX内部流程在Helloworld中可以看到,大概分为其流程大致如下:
sgx view process

  • 一个应用程序会分为2个部分:secure / trusted 和 untrusted / non-secure部分;
  • 由应用程序启动 enclave 内存保护区;
  • 当一个enclave函数被调用时,只有enclave内的代码可以看到它的数据,外部访问总是被拒绝的;当它返回时,enclave数据留在受保护的内存中,如下图所示。

Enclave 创建

完整性检查
每个Enclave都有唯一的哈希值表示其属性、位置、内容和保护页等。如果两个Enclave的哈希相同,则认为这两个Enclave相同。该方法被称为MRENCLAVE

签名检查
每个Enclave也由其作者签名。MRSIGNER包含作者的公钥的哈希值。MRENCLAVE和MRSIGNER是使用SHA-256哈希函数产生的。

数据结构

  • EINIT Token Structure (EINITTOKEN)
    EINITTOKEN结构被EINIT指令用来检查一个Enclave是否被允许执行。它包含了 enclave 的属性、哈希值和签名者身份。它是通过使用启动密钥进行的HMAC来验证的。

  • Enclave Signature Structure (SIGSTRUCT)
    每个 "Enclave"都与一个SIGSTRUCT结构相关联,该结构由其作者签署,并包含 “Enclave"措施、签署者公钥、版本号(ISV,反映安全级别)和产品标识符(ISVPRODID,以区分来自同一作者的"Enclave”)。它可以确保Enclave没有被修改,然后用不同的密钥重新签署。

指令

  • ECREATE:该指令实例化了一个新的Enclave,定义了它的地址空间和信任根。这些信息被存储在新分配的SECS中。
  • EADD:该指令允许向Enclave添加一个新的页面。操作系统完全负责选择该页及其内容。EPCM的初始条目表示页的类型和它的保护。
  • EEXTEND:这条指令允许将一个页面的内容按256字节的块添加到Enclave中。它必须被调用16次才能将一个完整的页面添加到措施中。
  • EINIT:这条指令在初始化前检查enclave是否与它的EINITTOKEN(相同的措施和属性)相对应。它还检查该令牌是否用启动密钥签名。
  • EREMOVE:这条指令从Enclave中永久删除一个页面。

key recovery

启动过程

  1. 应用程序请求加载enclave到内存
  2. 使用ECREATE 指令创建和填充SECS结构体;
  3. 使用EADD指令将每个页面加载到受保护的内存中;
  4. 使用EEXTEND指令将每个页面添加到 Enclave 的存储结构中;
  5. 通过EINIT指令最终完成 Enclave 的创建。

enclave creation

SGX驱动主要完成如下工作:

  1. Enclave加载。
  2. 内存空间分配与销毁。
  3. 换页和缺页中断处理。
    enclave运行时

uRTS主要完成如下工作:

  1. Enclave加载和卸载。
  2. 调用管理,处理所有ECall和OCall请求。其中ECall指调用Enclave内的请求,OCall指从Enclave内调用外部的请求。
  3. 异常处理,判断具体异常反向调用Enclave。

tRTS主要完成如下工作:

  1. Enclave加载。
  2. 调用管理,处理ECall和OCall。
    Enclave代码和数据放置在被称为Enclave Page Cache(EPC)的特殊内存区域中,该内存区域使用内存加密引擎(MEE)进行加密.

进出 Enclave 空间

指令

  • EENTER: 这条指令将控制权从应用程序转移到 Enclave 内一个预先确定的位置。它检查TCS是否空闲并清除TLB条目。然后它将处理器置于 Enclave 模式,并保存RSP/RBP和XCR0寄存器。最后,它关闭了基于事件的精确采样(PEBS),使 Enclave 的执行看起来像一条巨大的指令。
  • EEXIT:这条指令使进程回到它的原始模式,并清除位于 Enclave 内地址的TLB条目。控制权被转移到位于应用程序内并在RBX寄存器中指定的地址,并且释放了TCS结构。在退出之前,"Enclave"需要清除其寄存器,以防止数据泄漏。

进/出 Enclave 流程

  1. 执行EENTRY命令;
  2. 保存应用程序的CONTEXT;
  3. 处理器切换到 enclave 模式;
  4. 执行EEXIT命令;
  5. CPU切换到常规模式。

enclave lifecycle

中断处理

指令

  • ERESUME:这条指令从当前的SSA恢复上下文并恢复执行。

中断处理流程
中断和异常会导致异步 Enclave 退出(AEX)。异步退出指针(AEP)指向位于应用程序内部的处理程序,该处理程序将在中断服务程序(ISR)处理完异常后恢复执行。处理程序可以通过执行ERESUME指令来决定是否恢复 Enclave 的执行。当AEX发生时, Enclave 的上下文被保存在当前的SSA中,应用上下文被恢复。当执行ERESUME指令时,"Enclave "上下文被恢复。TCS包含一个表示当前SSA的计数器,形成一个上下文的堆栈。

  1. 中断或异常到达处理器;
  2. Enclave 上下文被保存,应用程序上下文被恢复;
  3. 在操作系统的处理程序中继续执行;
  4. 处理程序返回(IRET)到AEP,一个蹦床函数;
  5. AEP执行ERESUME,如果它决定恢复 Enclave 执行;
  6. 以前保存的 Enclave 上下文被恢复;
  7. 执行在 Enclave 内停止的地方恢复。

sgx interrupt handling

Architectural Enclaves

为了允许安全环境的执行,需要几个特殊 Enclave(AE),它们由英特尔提供并签署。它们强制执行启动策略,执行配置和证明过程,甚至更多。

Launch Enclave(LE)
Launch Enclave(LE)是负责将EINITTOKEN结构分配给其他希望在平台上执行的 Enclave 的 Enclave。它检查 Enclave 的签名和身份,看它是否有效。为了生成tokens,它使用启动密钥,它是唯一能够检索到它的 Enclave。

Provisioning Enclave(PvE)
供应 Enclave(PvE)是负责通过与英特尔供应服务服务器进行通信来检索证明密钥的Enclave。为了做到这一点,它使用由PcE提供的证书来证明平台的真实性。

Provisioning Certificate Enclave(PcE)
供应证书Enclave(PcE)是负责签署目的地为PvE的处理器证书的 Enclave。为了做到这一点,它使用供应密钥,它是唯一能够检索它的 Enclave。PvE和PcE目前是作为一个单独的 Enclave 实现的。

Quoting Enclave(QE)
Quoting Enclave(QE)是负责在远程验证过程中提供对 enclave 身份和执行环境的信任的 Enclave。它对其从PvE收到的证明密钥进行解密,并使用该密钥将REPORT结构(可在 Enclave 验证)转化为QUOTE结构(可远程验证)。

Platform Service Enclaves(PSE)
平台服务Enclaves(PSE)是为其他 enclave 提供多种服务的架构 Enclave,如单调的计数器、可信时间等。这些 Enclave 利用了管理引擎(ME),这是一个隔离的、据说是安全的协处理器,负责管理平台。

SGX 密钥管理

根密钥

Intel SGX 相关 TEE服务都是通过密钥进行认证。每个支持SGX的CPU都包含两个存储在电子保险丝内的根密钥根供应密钥(RPK)和根密封密钥(RSK)。RPK为英特尔所知,以实现远程验证过程,而RSK只为平台所知。尽管SGX的攻击者模型排除了物理攻击,但已经努力使处理器的结构很难被控制,或者至少使提取密钥成为一个非常昂贵的操作。只要有足够的硬件,就有可能读取电子引信,但要以破坏性的方式。这就是为什么只有加密版本的密钥被存储在电子引信上。一个物理不可克隆函数(PUF)被用来存储对称密钥,在处理器执行过程中用于破译其他密钥。

根供应密钥(RPK)
英特尔在制造过程中创建的第一个密钥是根基配置密钥(RPK)。这个密钥是在一个名为 “英特尔密钥生成设施”(iKGF)的设施内的专用硬件安全模块(HSM)上随机生成的英特尔公司负责维护一个包含HSM产生的所有密钥的数据库。RPK被发送到多个生产设施,以嵌入处理器的电子引信内。

根密封密钥(RSK)
与第一把钥匙一样,它被保证在每个生产单位之间有统计学上的差异。与RSK相反,英特尔宣布从他们的生产链中清除这些密钥的所有痕迹,以便每个平台都有一个只有自己知道的独特密钥。

密钥衍生

根据设计,"Enclave"不能访问根密钥。然而,它可以访问从根密钥衍生出来的密钥。衍生功能允许 "Enclave"作者指定一个密钥衍生政策。这些策略允许使用可信的值,如MRENCLAVEMRSIGNER 和/或 Enclave的属性。Enclave不能衍生属于另一个Enclave的MRENCLAVEMRSIGNER的密钥。此外,当密钥派生策略不使用某个字段时,它将自动被设置为零。因此,即使是在非专用密钥可用的情况下,专用密钥也不能从它们那里派生出来。

为了增加来自用户的熵,在派生过程中,一个叫做 “所有者纪元(Owner Epoch)” 的值被用作一个参数。这个值在开机时通过密码的推导进行配置,并在每次电源循环时保存在非易失性存储器中。这个值必须保持不变,以便 Enclave 能够检索到相同的密钥。相反,当平台所有者改变时,这个值必须改变,因为它可以防止新所有者访问旧所有者的个人信息,直到恢复原始密码。

key_derivation

衍生的密钥列表

Provisioning Key(供应密钥)
这个密钥来自RPK,并被用作英特尔供应服务和处理器之间的信任根(与TCB版本相联系)。由于接纳一个非SGX处理器进入合法的SGX处理器组,会损害所有处理器的远程认证,因此必须采取极端的预防措施,禁止对供应密钥的访问。目前,只有在 "Enclave"被英特尔签署的情况下,"Enclave"才允许访问这个密钥(英特尔的MRSIGNER被硬编码在 "enclave"代码中)。

Provisioning Seal Key(供应密封密钥)
这个密钥是由RPK和RSK衍生出来的。在组内处理器的注册过程中,每个平台的私钥都用这个密钥进行加密,并发送给英特尔认证服务。必须注意的是,私钥不能只用RPK来加密,因为这将破坏所使用的匿名注册协议。同样,私钥也不能只用RSK来加密,因为这将允许非特权 enclave 访问平台的私钥。不幸的是,已知RSK的生成过程存在不确定性,人们可能认为英特尔知道每个平台的私钥

Launch Key(LF密钥)
这个密钥来自RSK,并被启动 enclave 用来生成EINITTOKEN。每个没有被英特尔签署的 enclave 都必须获得这个令牌,否则处理器就不能实例化它。只有特定的MRSIGNER(其相应的私钥只有英特尔知道)可以访问启动密钥。在SGX2中,启动 "enclave"的MRSIGNER可以通过编程方式改变,但目前还不知道英特尔打算如何对 "供应密钥 "实施访问控制。(需要看看SGX2的官方文档对这部分密钥的改变

Seal Key(密封密钥)
这个密钥来自RSK,用于加密与当前平台有关的数据。重要的是,不要使用非专用的密封密钥(无论是用于加密还是认证)因为这将损害 enclave 地的安全。

Report Key(本地证明密钥)
这个密钥来自于RSK,用于本地验证过程。

密钥关系如下:
key overview

密钥更新

SGX基础设施支持其硬件和软件组件的TCB更新。每个组件都有一个SVN,在每次安全更新后都会递增。一个新的SVN会导致一个新的封印密钥。有一个过程允许较新的TCB访问较老的TCB的密封密钥,以允许数据迁移。一个旧的TCB不能访问新的TCB的密钥。

sgx密钥更新

测信道攻击

多年来,英特尔SGX因缺乏对各种侧信道攻击的抵御能力而臭名昭著。虽然英特尔总是警告说,Enclave必须以防止侧信道攻击的方式编写,但一个完美的安全技术不会对enclave开发者施加这种限制。下面总结了一些对英特尔SGX的攻击,让读者了解执行这种攻击需要什么,以及执行这些攻击可以获得什么信息。

英特尔SGX上的高速缓存攻击

Johannes Götzfried等人模拟了一种高速缓存攻击。为了对英特尔SGX enclave 进行缓存定时攻击,Johannes Götzfried等人将两个内核线程钉在共享同一物理核心和L1缓存的两个逻辑核心上(见下图)。被攻击线程正在运行一个容易受到enclave内缓存攻击的算法版本。探测缓存线是使用RDPMC指令完成的,这需要在监督员模式下启动一个计数器,这完全是在SGX安全模型内。
高速缓存攻击

该攻击是假设与 "Enclave"的通信是使用共享内存而不是ECALL/OCALL进行的。因为不必从运行中的 "enclave"进行上下文切换。但是实际应用中使用ECALL/OCALL与enclave进行通信,所以实际应用中该操作被拒绝,从而阻止攻击的进行。

同时,Johannes Götzfried等人方案中攻击者线程不能在不同的进程中,因为进程上下文切换需要更新页表(PT),所以包含PR基址的CR3寄存器必须被改变,这将触发TLB和L1缓存刷新。

SGX SDK的AES实现不容易受到这种旁门左道的攻击。

引用论文:Johannes Götzfried, Moritz Eckert, Sebastian Schinzel, and Tilo Müller. Cache Attacks on Intel SGX. In Proceedings of the 10th European Workshop on Systems Security (EuroSec’17). ACM. 2017

AsyncShock:利用Intel SGX Enclaves中的同步漏洞

同步化错误是由多个线程对共享数据的不当同步访问引起的。SGX SDK提供了同步化原语,如互斥和条件变量。这些基元并不完全在 enclave 内运行:例如,线程阻塞需要一个系统调用,而在enclave内是不可用的。此外,不建议在 enclave 之外管理锁变量,因为攻击者可以改变它。英特尔采用了一种混合方法,即锁变量在 enclave 内维护,而系统调用则在 enclave 外发出。因此,使用同步化原语可能会导致enclave退出。下图显示了互斥锁操作的这种行为。
多线程同步漏洞

Nico Weichbrodt等人的攻击模型前提是攻击者已经控制整个平台,可以利用Use After Free (UAF)和Time Of Check Time Of Use (TOCTOU)的问题来控制线程的启动与终止,攻击工具为AsyncShock工具。中断线程是通过使用mprotect系统调用来删除页面上的读取和执行权限的。因为在检查对EPC页的访问是否被允许之前,会进行传统的页面行走,所以应用程序可以了解到enclave被允许访问的内存页(尽管它没有办法看到这些页包含什么)。当线程退出 enclave时,在不受信任的环境中的适当处理程序中恢复执行。

下面的示例是一个利用 UAF 漏洞的示例代码:

char * glob_str_ptr;
int other_functions(const char * c) {
    
     /* do other things */ }
int puts(const char * c) {
    
    
    printf("%s ", c);
    return 0;
}
struct my_func_ptr {
    
    
    int( * my_puts)(const char * );
    char desc[8];
}
my_func_ptr;
void ecall_setup() {
    
    
    glob_str_ptr = malloc(sizeof(struct my_func_ptr));
}
void ecall_print_and_save_arg_once(void * str) {
    
    
    struct my_func_ptr * mfp = malloc(sizeof(struct my_func_ptr));
    mfp - > my_puts = puts;
    if (glob_str_ptr != NULL) {
    
    
        memcpy(glob_str_ptr, (char * ) str, sizeof(glob_str_ptr));
        glob_str_ptr[sizeof(glob_str_ptr)] = ’\’;
        mfp - > my_puts(glob_str_ptr);
        free(glob_str_ptr);
        glob_str_ptr = NULL;
    }
    free(mfp);
}

攻击流程如下:

  1. AsyncShock一直处于休眠状态,直到它的一个被覆盖的函数被调用。应用程序首先创建一个被AsyncShock ①立即暂停的线程。
  2. 第二个线程被创建,并被允许执行②。此时,"读取 "和 "执行 "的权限被从包含free函数的代码页中移除。第二个线程进入了 enclave 并开始执行。
  3. 当它调用free ③时,发生了访问违规,导致AEX和AsyncShock ④捕获的分段故障。这个页面的权限被恢复,但在线程被允许继续执行之前,另一个页面的权限被移除。
  4. 当下一个被标记的页面被击中⑤,导致另一个AEX和分段故障⑥,AsyncShock知道free已经返回。在信号处理程序中,权限再次被恢复。AsyncShock停止线程,并给沉睡的线程发出信号,让其执行⑦。至此,漏洞利用就结束了。
    在这里插入图片描述

参考论文:Nico Weichbrodt, Anil Kurmus, Peter Pietzuch and Rüdiger Kapitza. AsyncShock: Exploiting Synchronisation Bugs in Intel SGX Enclaves. In: ESORICS 2016. Lecture Notes in Computer Science, vol 9878. Springer. 2016.

利用分支阴影推断SGX内部的细粒度控制流

在CPU内部,分支预测单元(BPU)使用分支目标缓冲区(BTB)来记录对分支预测有用的信息。虽然这些信息只在处理器内部使用,但英特尔SGX在 "enclave"模式切换期间不清除其分支历史。这允许在 "enclave"内采取(或不采取)的分支影响对 "enclave "外的分支的预测。为了推断运行中的 "enclave"的控制流,Sangho Lee等人开发了一种叫做 "分支影子 "的技术。

这个想法是在不受信任的环境中复制 enclave程序的控制流,仔细选择这个新代码的映射地址,以便在BTB中引入碰撞。通过先在 enclave 代码中执行分支,然后在阴影代码中执行,第二个分支的预测会受到第一个分支结果的影响。为了知道CPU预测了什么,最后一个分支记录(LBR)只能在不被信任的环境中使用,因为它对 enclave 是禁用的。

为了使这种攻击奏效,必须尽可能频繁地中断 enclave 的执行,以进行必要的测量,推断 enclave 的控制流。APIC定时器可用于每~50个周期中断执行,如果需要更多的精度,禁用CPU缓存允许每~5个周期中断。
下面是对发生在 enclave 内的条件性分支的检测的解释(绿色代表采取分支的情况,红色代表没有)。
分支阴影推断攻击流程

  1. enclave的条件性分支指令被执行。如果采取了,相应的信息被存储在BTB内。因为这是在 enclave 内发生的,所以LBR不报告这个信息。
  2. enclave的执行被APIC的定时器打断,OS接管控制权。
  3. 操作系统启用LBR并执行影子代码。
  4. 如果在enclave中的分支被执行,BPU正确地预测该分支将被执行,即使目标地址是无效的,因为它在enclave内。如果没有采取,BPU就会错误地预测该分支不会被采取。
  5. 通过禁用和检索LBR内容,操作系统可以通过检查阴影条件分支是否被正确预测来了解enclave分支是否被采取。

论文作者提出了类似的技术来检测无条件分支和间接分支(目标地址不能被攻击恢复)。这种攻击需要对平台的完全控制,以及对在enclave内执行的代码的了解。它还引入了一个enclave可能能够检测到的显著减速(但它不像执行RDTSC那么简单,因为enclave内部不允许)。

参考论文:Sangho Lee, Ming-Wei Shih, Prasun Gera, Taesoo Kim, Hyesoon Kim, and Marcus Peinado. Inferring fine-grained control flow inside SGX enclaves with branch shadowing. In Proceedings of the 26th USENIX Conference on Security Symposium (SEC’17), USENIX. 2017.

其他侧信道攻击

更多的侧信道攻击方法见论文:杨帆, 张倩颖, 施智平, 关永. 可信执行环境软件侧信道攻击研究综述. 软件学报, 2023, 34(1): 381–403. http://www.jos.org.cn/1000-9825/6501.htm

测信道攻击总结

测信道攻击的很大一个前提是平台已经被攻击者完全控制,这对攻击者来说也是一项非常耗时和昂贵的工作。所以测信道攻击存在,但是攻击难度还是有一些大。
一家之言,仅供参考

使用Intel SGX 的信任问题

SGX用户表达的第一个担忧是,他们必须信任英特尔。值得注意的是,英特尔表示,它不会在其制造设施中重新训练嵌入每个CPU芯片的RPK。但是,如果事实证明他们确实这样做了,以任何可能的方式,这将使每个平台的安全性失效。此外,由英特尔签署的enclave被授予特殊的权限,如Launch Enclave (LE),用于白名单,允许哪些 enclave 执行。开发人员需要在英特尔程序中注册,以便能够签署 enclave 的发布版本。现在有一个开源计划,要开发一个替代的LE,应该允许它从SGXv2开始取代目前的LE。

第二个问题是,恶意软件有可能在enclave内执行其恶意代码,而 enclave基本上不受任何东西和任何人的保护。然而,重要的是要记住,enclave内的代码没有I/O。它完全依赖其配套的应用程序来访问网络、文件系统等。因此,从技术上讲,分析一个应用程序可以告诉你很多关于enclave对系统的作用,减轻了对 "enclave内运行的受保护的恶意代码 "的恐惧。在相反的方面,缺乏受信任的I/O是一个保障用户信息的问题,在这个问题上已经做了一些工作,有专有的解决方案,如受保护的音频视频路径(PAVP)和学术性的如SGXIO。

第三个问题是曾经出现了关于Meltdown和Spectre对SGX enclave的影响。虽然它们不受前者的影响,但SgxPectre论文的作者已经证明,Spectre的变种允许读取enclave内存和寄存器值。这使得恢复平台的密封密钥,从而恢复认证密钥,有效地绕过了SGX所提供的整个安全性。英特尔后来发布了一个微代码更新,以防止这些攻击,由于安全版本号(SVN),它也能够确保这些补丁已经被应用,以通过远程认证过程。2018年发布了一个名为SpectreRSB的新攻击,它能够通过针对返回堆栈缓冲区(RSB)而不是BTB来绕过这些补丁。英特尔不得不发布另一个微代码更新来修复这个新问题。

部分名词解释

缩写
名词
名词解释
uRTS Untrusted Run-Time System 在英特尔SGX Enclave环境之外执行的代码,执行的功能包括: - 加载和管理 enclave ; - 对 “Enclave” 进行调用并接收来自 "Enclave "内的调用。
tRTS Trusted Run-Time System 在英特尔SGX Enclave环境中执行的代码,执行的功能包括: 1. 接收进入 enclave 的调用和在 enclave 之外进行调用。 2. 管理 "Enclave"本身。 3. 标准C/C++库和运行时环境
- Edge Routines 可以在 enclave 外(不受信任的边缘例程)或 enclave 内(受信任的边缘例程)运行的函数,用于将应用程序的调用与 enclave 内的函数绑定,或将 enclave 的调用与应用程序中的函数绑定。
- 3rd Party Libraries 在本文中,是指任何为在英特尔SGX enclave 环境中工作而定制的库。
ECall Enclave Call 对 "enclave"内的接口函数进行的调用
OCall Out Call 对 "enclave"外的接口函数进行的调用
- Trusted Thread Context 在 enclave 内运行的线程的上下文,包括: 1. Thread Control Structure (TCS) 2. 线程数据/线程本地存储-- enclave 内的数据和特定于线程的数据。 3. 状态保存区(State Save Area, SSA):当 "enclave "因中断或异常而必须退出时,用于保存寄存器状态的数据缓冲区。 4. 堆栈:位于 enclave 内的一个堆栈

猜你喜欢

转载自blog.csdn.net/shuizhongmose/article/details/129534432