导语:这篇文章主要是英特尔SGX技术的概述,作为第一部分的后续内容。在第二部分中,我将快速解释应用程序如何与其安全区域进行交互,我还将详细介绍SDK和PSW中包含哪些软件;最后,我总结了此技术的已知攻击和关注点,并就此进行了总结。
这篇文章主要是英特尔SGX技术的概述,作为第一部分的后续内容。在第二部分中,我将快速解释应用程序如何与其安全区域进行交互,我还将详细介绍SDK和PSW中包含哪些软件;最后,我总结了此技术的已知攻击和关注点,并就此进行了总结。
Interactions
从概念上讲,SGXEnclave可以看作是能够执行任意算法的黑匣子,这个黑匣子可以使用以下三种不同的方式与外界进行交流。
Enclave Call(ECALLs)
应用程序可以在安全区域内调用预定义的函数,将输入参数和指针传递给应用程序内的共享内存,从应用程序到安全区域的那些调用称为ECALL。
Outside Calls (OCALL)
Enclave执行时,可以对应用程序中的预定义功能执行OCALL;与ECALL相反,OCALL无法与应用程序共享安全区内存,因此它必须在OCALL之前将参数复制到应用程序内存中。
Asynchronous EXit(AEX)
执行也可能由于中断或异常而退出Enclave,这些Enclave退出事件称为异步退出事件(AEX),他们可以从区域内的任意点将控制权从区域转移到应用程序。
Programming
可信代码库(TCB)
开发使用SGX区域的应用程序需要标识要保护的资源,包含这些资源的数据结构以及管理这些资源的代码。然后,必须将已确定的所有内容放置在安全区域内,隔离区文件是与传统操作系统加载程序兼容的库,它包含安全区的代码和数据,在磁盘上以纯文本格式显示。
接口功能
应用程序及其Enclave之间的接口必须仔细设计。安全区声明应用程序可以调用哪些功能,以及应用程序可以调用哪些功能,Enclave输入参数可以通过非安全代码进行观察和修改,因此必须进行广泛检查,由于Enclave不能直接访问操作系统的服务,因此必须调用其应用程序,这些call不应泄露任何机密信息,也不能保证按照Enclave的预期进行。
SDK
该软件开发工具包(SDK)提供了他们需要开发启用新申请的一切开发函数。它由一个在应用程序和安全区域之间生成接口功能的工具,一个在使用安全区域之前对安全区域进行签名的工具,一个用于对其进行调试的工具以及一个用于衡量性能的最后工具组成。它还包含用于在Windows下使用Visual Studio或在Linux下使用Makefiles开发安全区的模板和示例项目。
软件平台
该软件平台(PSW)是软件栈,它允许启用新交所应用到目标平台上执行,它适用于Windows和Linux操作系统,由4个主要部分组成:
· 提供对硬件功能的访问的驱动程序;
· 多个支持库,用于执行和验证;
· 环境运行所必需的区域;
· 与Enclave进行装载和通信的服务。
Enclave
为了执行安全的环境,需要几个体系结构Enclave(AE),它们由英特尔提供并签名,他们执行启动策略,执行供应和验证流程。
启动Enclave
启动Enclave(LE),是负责分发EnclaveEINITTOKEN的结构,希望在平台上执行其他Enclave。它检查Enclave的签名和身份,以查看它们是否有效,为了生成令牌,它使用启动密钥,它是唯一能够检索令牌的区域。
供应区域
该供应Enclave(PvE中)是负责检索Enclave认证密钥通过与通信英特尔配置服务的服务器;为此,它使用PcE提供的证书来验证平台的真实性。
预配证书Enclave
预配证书Enclave(PCE)是负责签署发往处理器证书Enclave PVE中。为了做到这一点,它使用了Provisioning Key,它是唯一能够检索到它的Enclave,在PvE中和PCE作为一个单一的Enclave工作。
Enclave
引用Enclave(QE)以Enclave的身份在远程验证过程执行环境中提供信任的Enclave。它解密从PvE收到的验证密钥,并使用此密钥将REPORT结构(可本地验证)转换为QUOTE结构(可远程验证)。
平台服务区
该Enclave(PSE)平台服务是Bulid的Enclave,提供其它多种服务,如计数器的可信时间等。这些Enclave利用的管理引擎(ME)是一种分离和安全协处理器管理平台。
按键目录
每个支持SGX的CPU都包含两个存储在电子保险丝内部的根密钥:根供应密钥(RPK)和根密封密钥(RSK)。该RPK众所周知,英特尔启用远程验证过程,而RSK是唯一已知的平台。尽管SGX的攻击者模型不包括物理攻击,但仍努力使处理器架构难以调整,或者至少使提取密钥成为非常昂贵的操作。有了足够的硬件,就有可能以破坏性的方式读取电子保险丝。因此,电子保险丝上仅存储密钥的加密版本,一个物理不可克隆功能(PUF)用于存储对称密钥,该对称密钥用于在处理器执行期间解密其他密钥。
根密钥
根供应密钥
英特尔在制造过程中创建的第一个密钥是Root Provisioning Key(RPK)。该密钥是在专用的硬件安全模块(HSM)上随机生成的,该硬件位于称为英特尔密钥生成设施(iKGF)的设施内。英特尔负责维护一个数据库,其中包含HSM生成的所有密钥发送到多个被嵌入处理器电子熔断器内。
根密封键
位于电子保险丝内部的第二个键称为“ 根密封键”(RSK)。像第一个键一样,可以保证每个生产的单元之间在统计上有所不同;与RSK相反,Intel声明从其生产链中删除这些密钥的所有痕迹,以使每个平台都具有仅由其自身知晓的唯一密钥。
密钥派生
通过设计,某个安全区无法访问根密钥。但是,它可以访问从根密钥派生的密钥,派生功能允许Enclave作者指定密钥派生策略;这些策略允许使用受信任的值,例如MRENCLAVE,MRSIGNER和/或安全区的属性,Enclave不能导出属于另一个Enclave的MRENCLAVE或MRSIGNER的密钥。此外,当密钥派生策略不使用字段时,它将自动设置为零,结果,即使当非专用密钥可用时,也不能从它们派生专用密钥。
为了添加来自用户的熵,在推导过程中,使用所有者的值作为参数。该值在引导时通过派生密码进行配置,并在每个电源循环期间保存在非易失性存储器中。为了使Enclave能够检索相同的密钥,此值必须保持相同;相反,当平台所有者更改时,必须更改此值,因为它会阻止新所有者在恢复原始密码之前访问旧所有者的个人信息。
SGX基础结构支持其硬件和软件组件的TCB更新。每个组件都有一个SVN,它在每次安全更新后都会递增,新的SVN导致新的密封钥匙,存在允许新TCB访问旧TCB 的密封密钥的过程,以允许数据迁移,旧的TCB无法访问新TCB的密钥。
派生密钥
供应密钥
此密钥派生自RPK,用作Intel Provisioning Service和处理器之间的根信任(与TCB版本绑定)。由于将非SGX处理器接纳为一组合法SGX处理器会损害所有处理器的远程验证,因此必须采取极端的预防措施以禁止访问Provisioning Key。当前,只有在安全区是由Intel签名的情况下,Launch Enclave才可以访问此密钥(Intel的MRSIGNER硬编码在Launch Enclave代码中)。
预配Seal 密钥
该密钥从RPK和RSK派生。在该组中的处理器注册期间,每个平台的私钥都使用该密钥加密,并发送给英特尔认证服务。必须注意,私钥不能仅使用RPK加密,因为这会破坏所使用的匿名注册协议。同样,私钥不能仅使用RSK进行加密,因为它会允许非特权的Enclave访问平台的私钥。不幸的是,RSK的生成过程存在不确定性,因此可以假设英特尔知道每个平台的私钥。
Launch 密钥
此密钥从RSK派生,并且由启动区用于生成EINITTOKEN。每个未经英特尔签名的安全区都必须获得此令牌,否则处理器无法实例化它,只有特定的MRSIGNER(其相应的私钥仅是Intel才知道的)可以访问启动密钥,在SGXv2的MRSIGNER中的启动Enclave可以通过编程方式改变,但目前还不知道英特尔还打算如何访问控制应用到供应密钥。
Seal 密钥
该密钥源自RSK,用于加密与当前平台有关的数据。不要使用非专用的密封密钥(用于加密或身份验证),因为这会损害安全区的安全性。
报告密钥
该密钥从RSK派生而来,用于本地验证过程。
侧信道攻击
多年来,英特尔SGX因缺乏对各种侧信道攻击的适应能力而臭名昭著。尽管英特尔一直警告说,必须以防止侧通道攻击的方式编写安全区,但完美安全的技术不会对安全区开发人员施加这种约束。下面总结了对Intel SGX的一些攻击,以使读者大致了解执行此类攻击的条件以及从执行这些攻击中可以获得哪些信息。
对英特尔SGX的缓存攻击
为了在Intel SGXEnclave上执行缓存定时攻击,作者将两个内核线程固定到了共享相同物理核心和L1缓存的两个逻辑核心(请参见下图),受害者线程运行的算法版本易受安全区域内部缓存攻击的影响,使用RDPMC指令探测高速缓存行,该指令要求在超级用户模式下启动计数器,这完全在SGX安全模型之内。
与共享区的通信是使用共享内存而不是ECALL / OCALL进行的,因为不必从运行中的共享区进行上下文切换,这是攻击与实际情况相距甚远的地方,ECALL / OCALL会导致整个缓存被驱逐,从而阻止攻击进行。
攻击者线程不能处于不同的进程中,因为进程上下文切换需要更新页表(PT),因此必须更改包含PR基址的CR3寄存器,从而触发TLB和L1缓存刷新。
SGX SDK的AES实现不容易受到此类旁通道攻击。
AsyncShock:利用英特尔SGX Enclaves中的同步错误
AsyncShock背后的想法是促进Enclave内部现有同步错误的利用。特别是,它有助于利用“ UAF”和“使用时间检查(TOCTOU)”漏洞;在英特尔SGX威胁模型之内的受平台控制的攻击者可以在需要时中断安全区线程。
使用mprotect(2)系统调用来删除页面上的读取和执行许可权即可中断线程。因为传统的页面遍历是在检查是否允许访问EPC页面之前执行的,所以应用程序可以了解安全区域允许访问哪些内存页面(即使无法查看页面包含的内容),当线程退出安全区时,将在不受信任的环境中的适当处理程序中恢复执行。
应用程序启动允许执行的第一个线程。从包含free(3)函数的代码页中删除了读取和执行权限,当线程调用free(3)(1)时,会发生访问冲突,从而导致AEX和应用程序捕获分段错误(2)。
在允许线程继续之前,将为该页面还原权限,但将为包含调用指令的页面删除权限,当下一个标记的页面被击中(3),导致另一个AEX和分段错误(4)时,它将发出空闲信号(3);在信号处理程序中,权限将再次恢复,第一个线程停止,第二个线程启动,并进入隔离区(5)。
该示例的示例代码可以在下面找到:
// Thread 1 enters the enclave ... free(pointer); // Thread 1 is interrupted, exits the enclave pointer = NULL; ... // Thread 2 enters the enclave ... if (pointer != NULL) { // Thread 2 uses a pointer to freed memory } ...
这些漏洞与在结构内部的函数指针和可将释放的内存重新用于新分配的内存分配器结合使用,有可能允许远程执行代码(RCE),TOCTOU错误可能允许在Enclave中使用不正确的参数,这也可能带来巨大的安全隐患。
下面的简单示例:
... /* 1 */ static int g_index = 0; /* 2 */ static int g_value = 0; /* 3 */ static int g_array[256]; /* 4 */ /* 5 */ void ocall_set_index(int index) { /* 6 */ g_index = g_index; /* 7 */ } /* 8 */ /* 9 */ void ocall_set_value(int value) { /* 10 */ if (g_index < sizeof(g_array)) { /* 11 */ g_array[g_index] = value; /* 12 */ } /* 13 */ } ...
g_array无法使用无效的g_index进行访问,第一个线程可以执行ocall_set_value函数的第9行和第10行,然后被中断;然后,第二个线程可以执行ocall_set_index的第5至7行,以在第一个线程检查完g_index的值后更改它的值。然后可以恢复第一个线程,并使用第二个线程设置的g_index值完成在第11行执行的访问,这会导致超出范围(OOB)的访问。
这些攻击需要对平台进行完全控制,知道安全区内部正在运行什么代码,并且已发现同步错误。防止这种攻击的最佳方法是禁用安全区内的多线程,但这显然会阻碍程序的性能。另一个解决方案可能是加密隔离区的代码,并使用远程验证过程为隔离区提供解密其代码所需的密钥。
通过分支预测 SGX Enclave内部的细粒度控制流
在CPU内部,分支预测单元(BPU)使用分支目标缓冲区(BTB)记录对分支预测有用的信息。尽管此信息仅由处理器内部使用,但在Enclave模式切换期间,英特尔SGX仍未清除其分支历史记录。这允许在某个Enclave内采取(或不采取)的分支影响Enclave外部分支的预测。开发了一种称为分支shadow的技术来推断正在运行的Enclave的控制流。
想法是在不受信任的环境中复制安全区程序的控制流,仔细选择此新代码的映射地址,以在BTB内部引入冲突。通过首先在安全区域代码内执行分支,然后在shadow代码内执行分支,第二个分支的预测会受到第一个分支的结果的影响。要知道CPU预测了什么,Last Branch Record(LBR)只能在不受信任的环境中使用,因为在安全区中禁用了它。
为了使这种攻击起作用,必须尽可能频繁地中断Enclave执行,以执行必要的测量以推断Enclave的控制流。APIC定时器可用于每50个周期中断一次执行,如果需要更高的精度,禁用CPU高速缓存可以最多每隔5个周期中断一次。
下面是对Enclave内条件分支的检测的说明(绿色代表采用分支的情况,红色代表未采用分支的情况):
1. Enclave的条件转移指令被执行。如果采用,则将相应的信息存储在BTB中;由于这是在隔离区内发生的,因此LBR不会报告此信息。
2. Enclave的执行被APIC计时器中断,操作系统控制。
3. 操作系统启用LBR并执行shadow代码。
4. 如果采用了安全区中的分支,则BPU会正确地预测将采用该分支,即使目标地址由于位于安全区内而无效。如果未采用,则BPU错误地预测将不采用该分支。
5. 通过禁用和检索LBR内容,OS可以通过检查是否正确预测了带shadow的条件分支来了解是否采用了安全区分支。
有人提出了类似的技术来检测无条件分支和间接分支(攻击无法恢复目标地址)。这种攻击需要对平台进行完全控制,并且需要了解Enclave内部正在执行的代码。
思考
英特尔签名的Enclave被授予特殊特权,例如用于将允许执行的Enclave白名单的启动Enclave(LE),开发人员需要注册到英特尔程序中,才能签署安全区的发行版。存在一种开放源代码的计划来开发替代LE,应该允许它替代从SGXv2的LE。
恶意软件有可能在一个Enclave内执行其恶意代码,而基本上不受所有侵害。但是,请务必记住,安全区内的代码没有I / O,它仅依靠其随附的应用程序来访问网络,文件系统等。因此,从技术上讲,分析应用程序可以告诉Enclave可以对系统执行的很多操作,从而减轻了对“Enclave内部运行受保护的恶意代码”的担忧。相反,缺乏受信任的I / O是保护用户信息的一个问题,并且已经通过诸如受保护的音频视频路径(PAVP)之类的专有解决方案和诸如SGXIO的学术性解决了这一问题。
关于meltdown和spectre对新Enclave的影响。尽管它们不容易受到前者的攻击,但SgxPectre论文的作者验证了Spectre的变体允许读取安全区域内存和寄存器值,这使得能够恢复平台的密钥,从而恢复了验证密钥,从而有效地绕过了SGX提供的整个安全性。英特尔发布了一个微代码更新程序,以防止这些攻击,并且由于使用了安全版本号(SVN),它还能够确保已应用这些补丁程序才能通过远程认证过程。一种名为SpectreRSB的新攻击已发布,并且可以通过以返回堆栈缓冲区(RSB)而不是BTB 为目标来绕过补丁,英特尔将不得不发布另一个微代码更新来修复此新问题。
结论
英特尔SGX是一种非常有前途的技术,目前仍处于起步阶段。它满足了可信计算行业的需求,从而可以使Enclave免受平台上执行的其他软件的攻击,并且可以通过有限的方式避免受到猛烈的攻击。它这样做是在给平台所有者提供对执行的某种程度的控制以允许资源管理的同时,验证过程允许将机密安全地传输到Enclave;借助提供的SDK,开发支持SGX的应用程序变得非常容易。
但是,英特尔SGX的当前版本仍然存在一些问题。容易受到侧信道攻击的做法限制了平台提供的安全性,迫使开发人员主动确保其程序不会受到攻击。在理想环境中,开发人员无需担心此类考虑,SGX应确保不可能进行这些攻击。通过加密安全区的代码并通过远程验证来验证密钥,可以完全防止这些攻击。
本文翻译自:https://blog.quarkslab.com/overview-of-intel-sgx-part-2-sgx-externals.html如若转载,请注明原文地址: