目录
- 摘要
- 引言
- 贡献
- 背景
- 瞬态执行攻击
- 负载值注入
- LVI-NULL
- Intel SGX
- 虚拟内存与分段
- 对象重新定位
- 威胁模型
- 硬件
- 软件
摘要
负载值注入(LVI)在类似Spectre的混乱代理攻击中使用Meltdown类型的数据流。LVI已经在对英特尔SGX飞地的实际攻击中得到了证明,因此,部署的缓解措施会产生2到19倍的巨大开销。然而,正如我们所发现的,在固定硬件上,LVI-NULL泄漏仍然存在。因此,为了减轻LVI固定CPU上SGX包围区中的LVI-NULL,仍然需要昂贵的缓解措施。
在本文中,我们提出了一种针对SGX中LVI-NULL的轻量级缓解,LVI-NULLify。我们系统地分析和分类LVI-NULL变体。我们的分析表明,以前提出的针对LVI-NULL的缓解措施是无效的。我们的新缓解措施通过重新调整分段的用途来解决这个问题,分段是x86已经用于每个内存操作的快速遗留硬件机制。LVINULify由一个修改后的SGX-SDK和一个编译器扩展组成,该扩展将包围区置于LVI-NULL可利用内存位置的控制之下。我们在LVI固定的Comet Lake CPU上评估了LVI NULLify,并观察到在最坏情况下性能开销低于10%,这大大低于以前的防御,在最坏的情况下开销高达1220%。我们得出的结论是,LVI-NULLify是目前保护SGX飞地免受LVI-NULL攻击的实用解决方案。
引言
瞬态执行攻击,即Meltdown[41]、Spectre[34]或ZombieLoad[52],是用于泄露敏感数据的强大微体系结构攻击。这些攻击通常分为Spectre型和Meltdown型攻击[8]。Spectretype攻击[18,33,34,36,42]利用错误预测分支后的瞬态指令未提交,但仍在微体系结构状态下留下痕迹。
在负载值注入(LVI)方面,Van Bulk等人[60]提出了一种与Meltdown型攻击相关的新型瞬态执行攻击。Meltdown型攻击触发攻击者域中的错误负载暂时消耗其值,从而绕过权限检查。LVI导致受害者域中的故障,使受害者暂时消耗攻击者的值,即LVI暂时将数据注入受害者。
最近的处理器减轻了硅中的Meltdown型攻击[27],例如,Comet Lake处理器没有已知的Meltdown型漏洞。由于Meltdown类型攻击的硬件防御通常也可以减轻相应的LVI攻击,因此攻击者无法将任意数据注入受害者域。然而,在一些微体系结构上,硬件防御并没有从受害者域返回值,而是只将值清零[7,60]。虽然这可以防止数据泄露,但它可以用作侧通道来检测地址是否有效,例如,破坏KASLR[7]。更糟糕的是,这在LVI攻击变体中仍然是可利用的,即LVI-NULL[60]。使用LVI-NULL,攻击者仍然可以将“0”值注入受害者域。
LVI论文显示了LVI-NULL在AES-NI攻击中的危险,但LVI-NULL的拟议防御措施尚未得到彻底评估[60]。虽然LVI的软件解决方案也可以防止LVI-NULL,但成本高昂,英特尔建议开发人员“应根据风险分析和缓解对性能影响的评估,确定其环境所需的软件强化级别”[29]。每个加载指令都可能发生故障,需要为此类指令设置内存围栏[60]。这还包括用其他指令序列替换某些指令,例如返回指令[29,60]。在现实世界的工作负载上,这些缓解措施的最坏情况开销介于系数2和19之间[38,60]。这就提出了一个问题,即在具有针对LVI的硬件缓解措施的处理器上,是否仍然需要这些昂贵得令人望而却步的防御措施来防御LVI-NULL。
在本文中,我们提出了一种针对SGX中LVI-NULL的轻量级缓解措施。我们的缓解措施LVI-NULLify建立在对LVI-NULL变体的系统分析之上,对每个变体的攻击构建块产生了新的见解。特别是,我们发现六分之四的变体依赖于指针重定向到空页面。基于我们的分析和实验验证,我们发现Van Bulk等人[60]提出的LVI-NULL缓解措施是无效的。
LVI NULLify的思想是相对于包围区的存储器区域的开始来偏移在SGX包围区内执行的所有存储器访问。为了实现此属性,LVINULify重新调整了分段的用途。分段是x86上的一种快速遗留硬件机制,用于每次内存操作的地址转换。LVI NULLify的第一部分是一个编译器扩展,它只生成与段相关的数据加载。因此,任何“0”注入都只从包围区的内存区域开始加载数据,该内存区域完全由SGX包围区控制。LVI NULLify的第二部分是一个经过修改的SGX-SDK,用于维护与不可信用户空间程序的互操作性。
LVI NULLify的安全性依赖于飞地存储区域的特殊准备,从而减少任意值的瞬态注入。LVI NULLify将包围区内存区域中的第一页标记为不可执行。临时执行不可执行内存会导致立即停止,从而防止任何攻击。LVI NULLify还将这些页面标记为不可读。我们根据经验验证了这会立即暂停加载和相关指令。
在我们的评估中,我们表明LVI NULLify非常轻量级,在最坏的情况下运行时开销低于10%。这比以前针对LVI的防御要快得多,在我们测试的最坏情况下,其开销高达1220%。LVI NULLify的内存开销约为代码大小的21.5%,这是由于生成了明确使用分段的指令序列。我们说明了我们的缓解措施是一种实用的解决方案,可以保护易受LVI-NULL攻击但不易受LVI攻击的硬件上的SGX飞地。
贡献
我们系统地分析和分类LVI-NULL变体,揭示了常见的攻击需求和先前提出的防御的不足。
我们提出了LVI-NULLify,这是一种针对SGX中LVI-NULL的新的轻量级防御,以一种特殊的方式重新调整了分割的用途。
我们评估了LVINLLify的安全性和性能。我们证明了LVIfixed Comet Lake CPU上的SGX飞地只有通过我们的防御才是安全的。我们观察到性能开销低于10%。
背景
瞬态执行攻击
瞬态执行攻击[8]是一类新的攻击,利用所谓的瞬态指令(即已执行但从未失效的指令)来泄露敏感数据。Kocher等人[34]用Spectre引入了第一个子类,而Lipp等人[41]用Meltdown引入了第二个子类。当Spectre攻击利用硬件做出的控制或数据流预测时,Meltdown在从不同的安全域访问内存时利用延迟的权限检查。这种延迟权限检查允许无序执行对缓存中通常不可访问的数据进行编码,然后攻击者从缓存中提取数据。随后的工作显示了这两个子类中的其他变体[4,8,18,33,42,44,52,53,57,69]。其他工作总结了过渡执行攻击[5,8,70]和防御[6,8]的最新技术。
负载值注入
负载值注入(LVI)通过利用受害者的故障来扭转Meltdown[60]。因此,LVI将值注入到故障受害者的瞬态执行中,而不是泄漏值。对于LVI,攻击者准备一个微体系结构缓冲区,例如存储缓冲区或L1,方法是用应该注入受害者的值填充它。然后,受害者在从内存中获取数据以临时使用攻击者注入的值时,必须遭受故障或微码协助。随后,利用注入值执行后续指令,对微体系结构中的机密进行编码,或劫持控制或数据流。与Spectre类似,LVI要求小工具位于受害者体内,并且必须额外引发故障或协助受害者。
对于未缓解的处理器,LVI的最先进解决方案是在内存加载后插入lfence指令[29]。这些围栏确保故障负载在下一条指令之前失效,从而有效地停止LVI的所有变体。然而,这种类型的软件缓解会带来因子2和19之间的性能损失[38,60]。
LVI-NULL
从Cascade Lake微体系结构开始,Intel处理器包括针对Meltdown、Foreshadow和MDS攻击的硅内缓解措施,包括LVI[27]。这些缓解措施防止通过所有当前已知的缓冲器进行非零值注入。但是,这种缓解措施只能防止攻击者注入攻击者控制的数据。故障负载仍然暂时将“0”转发到相关指令[7,60],而不是停滞。因此,通过在受害者域中引发故障,攻击者将常数值“0”注入受害者的瞬态执行中。LVI的这种变体称为LVI-NULL。即使注入“0”也可能被利用效果,例如,将完全由“0”组成的循环密钥临时注入AES-NI计算[60]。
Comet Lake系列代表了英特尔最新的SGXenabled一代,可用于受LVI-NULL影响的移动和桌面工作站型号[27]。基于Sunny Cove架构的Ice Lake处理器似乎不受LVI-NULL的影响[27]。
Intel SGX
为了为安全飞地提供处理器级别的隔离和证明,英特尔开发了软件保护扩展插件(SGX)[12]。根据设计,SGX假定只有处理器是可信的。因此,攻击者可以在仍然处于威胁模型内的情况下完全控制操作系统。
运行安全飞地时,它会被放置在不受信任的用户空间进程的虚拟地址空间中。虽然操作系统不受信任,但它仍然负责维护虚拟到物理地址的映射。自然,这将使飞地容易受到地址重新映射攻击[12]。为了防止这些情况,SGX在Enclave Page Cache Map(EPCM)中维护自己的影子条目,该条目包含每个有效飞地页面的预期虚拟地址和许可位(R-W-X)。如果遇到非法的虚拟到物理映射,则会引发EPCM页面错误。
尽管侧信道攻击不在SGX威胁模型的范围内,但先前的工作表明,可以对SGX发起强大的侧信道攻击。根攻击者仍然可以通过缓存[2,43,50]、页表访问[62,64,71]、中断定时[63]或分支预测器[14,19,40]发起低噪声侧信道攻击。SGX也容易受到瞬态执行攻击[9,52,59,65],英特尔已经发布了微码更新来抵御这些攻击[23,25]。
虚拟内存与分段
在现代系统中,虚拟地址空间被用作抽象和隔离进程。因此,它们是由硬件本机支持的。每个进程都在自己的、基本上不重叠的虚拟地址空间中工作,不会无意中干扰另一个进程的内存。使用的虚拟地址需要使用多级页面转换表转换为相应的物理地址。当前进程的表的位置由专用寄存器指示,并由操作系统在上下文切换时切换。
除了分页之外,另一个概念是分段。其想法是拥有一组用于不同用途的分段,例如代码、数据、堆栈。虽然较旧的处理器使用分段来使用更多的物理内存,但较新的处理器主要将其用作保护机制。
段通过位于内存中的段描述符进行配置,然后与分页一起使用。每个段描述符都有一个基地址和一个限制。在地址转换期间,CPU将基地址添加到分段的虚拟地址,从而产生非分段的虚拟寻址。一些指令隐式地使用段(例如,堆栈段的推送和弹出),并且通过代码段隐式地执行代码获取。数据段可以显式地与内存引用指令一起使用。
在现代系统中,分页已经完全取代了虚拟地址转换的分段。因此,处理器制造商在64位长模式(IA-32e)中删除了除fs和gs以外的所有段的这一功能。现在,除这两个段外,所有段都要求基数为0和最大可能大小。fs和gs段仍然支持base和limit,因为它们被广泛用于实现用户线程的线程本地存储和操作系统中的核心本地存储。因此,要在64位系统上使用分段的基本和极限特性,用户级软件必须使用使用fs或gs的指令,并且操作系统必须设置具有基本和极限的fs或gs。
对象重新定位
重新定位是ELF文件格式的重要组成部分[1,13]。如果在对象文件中引用了一个符号,则链接器或动态加载程序必须解析该符号的地址,并将该引用的所有引用替换为实际的符号地址。重定位类型指定应如何计算此地址以及引用哪个符号。
SGX包围区的行为类似于动态库,可以加载到主程序虚拟地址空间内的任意地址上。因此,包围区和动态库需要一种机制来调整图像内的地址,以指向地址空间中的所需位置。实现这一点的最常见方法是使用相对寻址,其中库中的所有绝对地址都是通过指令指针计算的。这种类型的重新定位可以在链接动态库的过程中解决。
与相对寻址相反,动态库还支持绝对寻址,其中动态加载器在加载映像的基地址已知之后解析地址。这里,加载程序用实际的符号地址替换动态库中的占位符。
威胁模型
硬件
对于我们的缓解措施,我们假设当前或未来的Intel处理器带有SGX,可以缓解硬件中的LVI,但不会阻止LVI-NULL,例如Comet Lake微体系结构。我们假设不存在直接从飞地泄露数据的Meltdown类型的瞬态执行攻击[41,52,59,65]。此外,Rowhammer[16,30,32]或电压不足[31,45,47]等硬件漏洞超出了范围。我们还假设Spectre类型的攻击[8,9,34]可以在硬件、固件或软件中得到缓解。此外,我们假设超线程将被禁用。“英特尔SGX验证服务”指示是否启用了超线程,以便验证方可以强制执行其状态。
软件
我们假设一个特权攻击者明确在英特尔SGX威胁模型的范围内。对于飞地,我们假设它不易受到传统的侧通道攻击,如缓存攻击[2,43,50]或控制通道攻击[71]。我们假设攻击者可以根据需要经常启动飞地,因此依赖于精确的执行控制,例如单步或零步[62]。飞地中的错误,例如同步问题[49,66],或ABI或API级别上的验证丢失[61],超出了范围。
我们只考虑64位飞地,因为飞地可以通过32位分割[17]进行攻击(参见第2.4节),但由于行为的差异,不能通过64位分割进行攻击。
要点:我们的缓解措施针对易受LVI-NULL攻击的CPU上的64位SGX飞地,但不易受LVI攻击。