组会纪要

2023-10-27 组会纪要

Posted by 袁子昕 on October 27, 2023

基于软件隔离的侧信道攻击防御

一、可信执行环境软件侧信道攻击研究综述

1 可信执行环境介绍

随着计算设备在各种领域的应用,计算设备中存储着越来越多的个人信息和秘密数据。例如,移动和嵌入式设备不仅绑定了用户身份证和银行卡,而且增加了移动支付功能。然而,这些安全敏感的信息缺乏专用的保护机制,容易被攻击者窃取,从而给用户造成极其严重的安全隐患。为了给用户应用程序提供一个安全的执行环境,学术界提出了可信执行环境(trusted execution environment,TEE)的概念,它通过隔离硬件和软件来保证应用程序执行环境的安全。

  • 通用执行环境(Rich Execute Environment,REE)
    • 环境中可以运行通用操作系统
    • 易受到攻击的开放环境,如:敏感数据窃取、移动支付盗用等
  • 可信执行环境(Trust Execute Environment,TEE)
    • TEE位于主处理器内部并且与通用操作系统 (rich operating system,Rich OS)并行运行
    • 可信应用(trusted application,TA):在TEE中运行的应用程序
    • 客户应用(client application,CA):在 REE中运行的应用程序
    • 典型TEE架构:AMD SEV(secure encrypted virtualization)、ARM TrustZone和Intel SGX(software guard extensions)

1.1 AMD SEV(安全加密虚拟化)

安全加密虚拟化SEV技术是AMD虚拟化体系结构的安全扩展,可以实现虚拟机监视程序(hypervisor)与虚拟机之间的隔离,但它缺乏对主内存页面的完整性保护;

它将内存加密技术与现有的AMD-V虚拟化体系结构相结合,保护虚拟机免受物理攻击,实现不同虚拟机之间以及hypervisor与虚拟机之间的隔离。

AMD SEV采用的内存加密技术称为安全内存加密(secure memory encryption,SME),SME由嵌入式高级加密标准(advanced encryption standard,AES)引擎执行,当数据写入DRAM或从DRAM读取数据时,该AES引擎会根据不同VM的加密密钥(VM encryption keys,VEK)对其进行加密或解密操作。AMD SEV允许每个VM都拥有自己的虚拟机加密密钥,虚拟机加密密钥在每次系统启动时随机生成并存储在SoC上的寄存器中,由安全处理器AMD-SP管理.

image-20231027114206568

1.2 ARM TrustZone

ARM TrustZone是ARM处理器架构的硬件安全扩展。ARM TrustZone技术将CPU逻辑上划分为普通世界(normal world)和安全世界(secure world),每个世界都有自己的操作系统来管理该世界的应用程序。

普通世界用于运行商业操作系统(例如Android、iOS等),该操作系统提供了通用执行环境REE;安全世界则始终使用安全的小内核(TEE-kernel)提供可信执行环境TEE,机密数据可以在TEE中被存储和访问。这样一来即使正常世界中的操作系统被破坏或入侵(例如iOS已被越狱或Android已被ROOT),黑客依旧无法获取存储在TEE中的机密数据。监视器模式(monitor mode)负责普通世界和安全世界的上下文切换。

image-20231027165847731

1.3 Intel SGX

Intel SGX是x86体系结构的扩展。为了保护应用程序中关键代码和数据不被恶意软件破坏。SGX通过增加一组与安全相关的指令集来创建一种被称enclave的可信执行环境。飞地代码和数据存储在保留内存区域 (preserved random memory,PRM)的EPC中,并使用内存加密引擎(memory encryption engine,MEE)对EPC进行加密,用于确保应用程序的机密性和完整性;EPC的访问控制由EPCM(enclave page cache map)负责,它被用于存储每个页面的状态(如配置、权限、类型等),任何non-enclave的应用程序都不能访问EPC的内容,这使得恶意应用程序无法访问这些敏感数据,在不同应用程序之间实现运行隔离。

image-20231027170106524

2 软件侧信道攻击

系统运行会对计算设备的物理实现造成影响,这种影响将通过不同的channel传输出来. 传统的侧信道攻击将目标设备在运行期间产生的时间、声音、电磁辐射、功耗等物理信号作为channel,通过收集这些物理信号分析机密信息. 传统的侧信道攻击大致可以分为两个阶段:

(1)信号探测阶段,攻击者利用物理器件探测目标加密设备在运行时产生的物理信号,该物理信号可作为信息泄露的channel;

(2)信号分析阶段,由于系统执行不同的运算会导致channel信号发生变化,因此攻击者可以通过分析收集到的channel信息恢复机密信息

这类传统的侧信道攻击不仅要求攻击者物理接触目标设备,而且还需要花费大量时间对信号进行分析 和噪声处理,攻击成本高,效率低下。

随着攻击技术的发展,软件侧信道攻击成为目前主流的攻击技术之一,该攻击依赖微体系结构泄露的侧信道信息,再通过软件方式将机密信息从channel中提取出来,它不需要物理探测设备以及对物理信号进行解析。

软件侧信道攻击可以分为3个阶段:

(1)硬件分析阶段,:分析处理器硬件层面存在的安全缺陷,找到能泄露受害者机密信息的微体系结构组件;

(2)攻击构建阶段:利用软件方式构建攻击,将硬件安全缺陷泄露的机密信息提取到不同的微体系结构组件中;

(3)提取机密信息阶段,根据不同的微体系结构组件,构建对应的侧信道攻击,以微体系结构状态的形式(例如,cache侧信道攻击中的时间信息)提取机密信息。

2.1 TEE架构中侧信道攻击面分析

现代CPU执行指令的过程一般分为5个阶段:取指令、指令译码、指令执行、内存访问和结果写回。

  1. 取指令阶段CPU将一条指令从内存中取到指令寄存器,此过程中可能涉及到的组件有缓存、分支预测单元。
  2. 取出指令之后,计算机进入指令译码阶段,在该阶段,指令译码器对取出的指令进行翻译,识别并区分出不同的指令,此阶段尚未发现侧信道漏洞。
  3. 当指令译码完成之后,接着进入指令执行阶段,此阶段会完成指令的具体任务,此过程可能涉及到的组件有瞬态执行相关部件(如,reorder buffer,reservation station以及retirement buffer)。
  4. 根据指令需要,有可能要访问内存,读取操作数,这样就进入了内存访问(MEM)阶段,此阶段可能涉及到的组件有TLB、page table、cache、DRAM等。
  5. 结果写回阶段会把指令执行阶段的运行结果写回到CPU的内部寄存器或内存中。

image-20231027170411304

我们可以将微体系结构组件划分为CPU内部的优化组件、分支预测器、存储结构和操作系统功能组件这4类,。

那么软件侧信道攻击技术与这4类微体系结构组件之间的关系如下:

  • 瞬态执行攻击依赖CPU内部的优化组件
  • 分支预测攻击利用分支预测器泄露机密信息
  • TLB侧信道攻击、cache侧信道攻击和基于DRAM的侧信道攻击与存储结构相关
  • 基于page table的侧信道攻击通过操作系统功能组件获取机密信息
  • 组合攻击实质上是物理攻击与软件侧信道攻击相结合形成的攻击手段

image-20231027170541435

2.2 缓存侧信道攻击

缓存侧信道攻击的根本原因有两个:

(1)缓存是多个进程共享的硬件资源;

(2)缓存命中和缓存未命中之间的访问时间存在明显差异。

2.2.1 Prime-Probe

Prime-Probe方法具体步骤如下:

步骤1. Prime: 攻击者用预先准备的数据填充特定多个cache 组

步骤2. Trigger: 等待受害者响应服务请求,将cache数据更新

步骤3. Probe: 重新读取Prime 阶段填充的数据,测量并记录各个cache 组读取时间

如果这期间发生了缓存替换则访问时间会更长,由此可以确定哪一块缓存被受害者访问。

image-20231027170704329

问题1:确定了哪块缓存被受害者访问了有什么用呢?

需要注意的是,攻击者无法直接读出缓存中的数据,但是确定了哪些缓存被受害者访问过后,可以针对这些缓存快猜测一些数据,然后读取这些数据并测量缓存的响应时间,若发生了cache miss(访问时间长)则说明猜测的数据错误;若发生了cache hit(访问时间短)则说明猜测的数据是正确的。

2.2.2 Flush-Reload

Flush-Reload(FR)方法是prime-probe方法的变种,基于共享内存实现,是一种跨内核、跨虚拟机的缓存探测方法。在Flush 阶段,攻击者将监控的内存块从缓存中驱逐出去,然后在Trigger阶段等待目标用户访问共享内存。在Reload阶段,攻击者重新加载监控的共享内存块。如果在等待的期间,目标虚拟机访问过的内存块不需要重新加载,时间将会较短,因为这些数据已经被存在缓存中中。根据加载时间长短,可判定目标虚拟机访问过的数据。

image-20231027171336794

2.2.3 Evict-Time

Evict-time攻击方法可以确定受害者进程使用了哪些缓存集。第一步,攻击者测量受害进程的执行时间。然后,攻击者逐出目标缓存集,并再次测量受害程序的执行时间。从执行时间的差异中,攻击者可以找出已被受害程序使用的缓存集。

2.2.4 Flush-Flush

Flush-flush这种攻击利用了刷新指令的时序差异。刷新指令的执行时间因数据是否缓存而异。如果缓存了数据,则刷新指令需要更多时间来执行。第一阶段与Flush-Reload攻击相同。但是,在最后一步中,攻击者再次刷新数据以检查受害者是否已访问数据。

3 防御措施

image-20231027171515312

image-20231027171523424

4 研究展望

这篇文章在最后提出了一些未来可供研究者研究的方向。

  1. 挖掘微体系结构侧信道漏洞

根据之前对TEE侧信道攻击面的描述,当前针对可信执行环境的TEE软件侧信道攻击几乎都利用了处理器微体系结构组件的优化功能。也就是说,现代处理器中的微体系结构优化组件在提升计算效率的同时牺牲了计算设备的安全性,利用这些组件可能会造成严重的安全问题. 因此,未来需要继续挖掘TEE隔离架构中微体系结构优化组件的侧信道漏洞,通过详细分析Intel SGX和ARM TrustZone等可信执行环境在硬件层面的处理流程、安全检查机制以及隔离机制,寻找可能会影响TEE隔离机制的侧信道漏洞

  1. 探索TLB在上下文切换期间的处理逻辑

当前,TEE隔离架构中没有出现基于TLB的侧信道攻击案例,但是TLB理论上存在侧信道漏洞。例如,上下文切换期间有选择地刷新TLB条目,攻击者通过监 视TLB即可了解受害者进程的内存访问模式. 因此,需要继续探索TEE隔离架构中的TLB漏洞,并且构建出基于TLB的侧信道攻击实例

  1. 探索“硬件为主,软件为辅”的防御措施

TEE软件侧信道攻击利用了现代CPU内部微体系结构的优化组件来提取受害者的机密信息,因此基于软件的方法只能起到缓解作用而不能一劳永逸,彻底解决TEE侧信道攻击问题需要朝着“硬件为主,软件为辅”的方向探索防御措施. 这类防御措施的技术原理如下: 针对当前TEE侧信道防御措施中软件方案开销较大以及难以抵御的攻击(例如,瞬态执行攻击或组合攻击等),硬件层面,硬件开发人员需要尽快重新设计DRAM和CPU结构,消除DRAM和CPU中优化技术带来的侧信道漏洞; 软件层面,软件开发人员应该继续探索减小性能开销的技术(例如,静态分析技术). 针对当前TEE侧信道防御措施中软件方案开销较小或易于抵御的攻击(例如,分支预测攻击),软件开发人员可以通过注入噪声等方法进行缓解

  1. 寻找通用的缓解措施

目前,在针对基于Flush的cache侧信道攻击或针对基于page table的侧信道攻击的研究中,研究人员已经找到了抵御这些攻击的通用方法。除此之外,大多数防御措施都只针对具体的攻击,没有尝试将该防御措施扩展到其他类似攻击的防御中,这不利于软件层面的防御措施的应用与发展。因此未来针对防御措施的研究需要在原有对策的基础上找到能够抵御同类攻击的通用缓解措施。

二、SmokeBomb: Effective Mitigation Against Cache Side-channel Attacks on the ARM Architecture

1 ARM缓存架构

高速缓存是位于核心内存和主内存之间的小而快的内存块。它在主存储器中保存项目的副本。对高速缓冲存储器的访问比对主存储器的访问要快得多。每当CPU读取或写入特定地址时,它首先在缓存中查找它。如果它在缓存中找到地址,它会使用缓存中的数据,而不是执行对主存储器的访问。通过减少缓慢的外部存储器访问时间,显著提高了系统的性能。通过避免驱动外部信号,使用缓存还降低了系统的功耗。

Cortex‑A53 和 Cortex‑A57 处理器通常使用两级或多级缓存实现,即小型 L1指令和数据缓存和更大的统一 L2 缓存,在集群中的多个内核之间共享。此外,可以有一个外部 L3 缓存作为外部硬件块,在集群之间共享

ARM架构下的缓存通常使用的更换策略时伪随机替换策略,即当缓存已满要添加新的数据到缓存中时,会随机驱逐缓存中的缓存行。

image-20231027171937223

根据较高级别的缓存是否继续保存加载到较低级别缓存中的数据对缓存体系结构进行分类。

多层次间cache的包含关系主要有三种:

  • Inclusive: L2包含所有的L1 valid cache line,L2需要记录所有L1的状态信息。
  • Exclusive: L1和L2包含的valid cache line互斥,两个L1之间仍然可以包含相同的valid cache line。
  • non-inclusive: L1和L2之间可以有相同的valid cache line,但又不是完全的包含关系。

这几个图可以很好的展示不同缓存之间的关系。

image-20231027172152939

2 威胁模型

  1. 考虑在 ARM 体系结构上使用inclusive和non-inclusive缓存的多核计算环境,其中进程使用共享库(如openSSL)
  2. 攻击者可以使用evict-time、flush- reload、evict-reload和flush-flush攻击方法来提取加密信息,包括密钥
  3. 假设最坏的情况是攻击者可以在 ARMv8 CPU 上使用刷新指令( ARMv8 体系结构默认限制用户空间应用程序执行刷新指令)

3 工作动机

这项研究的工作动机是为了解决在非英特尔架构上的缓存攻击问题,例如在移动设备(如智能手机和手表)中使用的ARM架构。对高速缓存攻击的大部分研究都是在英特尔架构上开始的,然而,随着移动设备的使用越来越广泛,缓解非英特尔架构上的缓存攻击也变得越来越重要。

虽然目前已经提出了许多软件解决方案来缓解缓存侧信道攻击,但是一些技术的目标是保护共享CPU缓存(即ARM架构中的L2缓存),这意味着它们无法保护程序免受针对专用核心缓存(即L1缓存)的攻击。

在本文中,作者提出了SmokeBomb,这是一种用于常用CPU缓存配置的软件缓存侧信道缓解方法,它明确确保每个进程都有一个专用空间来安全地访问关键数据。SmokeBomb 保留 L1 缓存供敏感操作独占使用,并拒绝攻击者查找已使用和未使用的敏感数据之间的计时差异。如果无法访问可测量的时差,攻击者就无法进行基于缓存的侧信道攻击。

4 本文贡献

  1. 提出了一种新颖的基于软件的缓存侧信道缓解技术,可以缓解inclusive cache和non- inclusive cache上的侧信道攻击

  2. 使用LLVM编译器基础设施和内核模块实现SmokeBomb,该模块使其能够应用于大多数ARM Cortex-A处理器

  3. 展示了 SmokeBomb 如何提供针对缓存侧信道攻击的强大保护,并通过在设备上对其进行评估来证明其有效性和效率

5 概述

5.1 研究目标

SmokeBomb可以使所有敏感数据的访问出现一致计时结果,因此无法推断实际使用了哪些敏感数据。为此,作者设计了SmokeBomb来实现特定的防御目标:

  1. 可以抵御跨核L2数据缓存攻击
  2. 可以抵御基于目录协议的跨核 L1数据缓存攻击。
  3. 可以抵御单核L1数据缓存攻击

为了实现这些目标,SmokeBomb首先在编译期间检测应用程序以查找和修补敏感代码,将敏感数据置于SmokeBomb的保护之下。然后,SmokeBomb 在执行修补的敏感代码之前、期间和之后的不同时间点执行三个步骤:

  1. 敏感代码执行前预加载敏感数据

  2. 敏感代码执行时保留敏感数据

  3. 敏感代码执行后刷新敏感数据

如图所示,为使用和不使用 SmokeBomb 的缓存使用率差异。x 轴表示代码执行的时间,y 轴表示保存敏感数据的缓存行数。y 访问上的任何可观察到的变化都表示潜在的缓存侧信道攻击媒介。

image-20231027172523093

如果没有 SmokeBomb,当敏感代码从 t1 执行到 t2 时,缓存中的关键数据量会逐渐增加。在 t2 处,所有关键数据可能已被提取到缓存中,并将保留在那里,直到逐渐被替换,如 t2 到 t3 所示。因此,攻击者可以推断哪些敏感数据是 t1 到 t3 的关键数据。但是,使用 SmokeBomb,当敏感代码在 t1 开始执行时,整个或仅一定数量的敏感数据会被提取到缓存中,当敏感代码在 t2 处退出时,会刷新。因此,SmokeBomb 将为所有敏感数据带来一致的计时结果。

5.2 SmokeBomb的API

在应用程序中,SmokeBomb 由用户空间程序中的以下两个 API 启动和完成: init_smokeBomb和exit_smokeBomb。

5.2.1 init_smokeBomb(unsigned int *addr,unsigned long size)

功能:敏感数据预加载到缓存中,并更改进程的调度策略

addr: 起始地址

size: 敏感数据大小

int smoke_bomb_initunsigned long svaunsigned long eva\
unsigned long dsvaunsigned long dsizeint *sched_policyint *sched_prio
{
	_smoke_bomb_ensure_page_mapsvaeva - sva;
	_smoke_bomb_ensure_page_mapdsvadsize;
	_smoke_bomb_set_sched_fifosched_policysched_prio;
	return _smoke_bomb_cmdSMOKE_BOMB_CMD_INITsvaevadsvadsva + dsize;
}

5.2.2 exit_smokeBomb()

功能:从缓存中刷新敏感数据并还原调度策略的出口

无参数

int smoke_bomb_exitunsigned long svaunsigned long eva\
unsigned long dsvaunsigned long dsizeint sched_policyint sched_prio
{
	int r;

	//_smoke_bomb_restore_page_map(dsva,dsize);	
	r = _smoke_bomb_cmdSMOKE_BOMB_CMD_EXITsvaevadsvadsva + dsize;
	if r
		return r;

	if sched_policy >= 0 && sched_prio >= 0
		_smoke_bomb_restore_schedsched_policysched_prio;
	return 0;
}

5.3 SmokeBomb定义的指令

由于大多数 ARM 处理器都没有高速缓存锁定指令,因此作者利用未定义指令异常处理程序来实现我们自己的高速缓存锁定指令,这些指令由处理程序软件调用。

SmokeBomb 查找并修补访问非敏感数据的缓存相关指令(例如 LDR 或 STR),因为它们可以通过将非敏感数据提取到 L1 缓存来更改缓存状态。在运行时,这些指令将被 SmokeBomb 的异常处理程序捕获和处理。我们将修补后的指令称为 xSB 指令,例如 LDRSB,它执行原始 x 指令的预期操作,但也确保敏感数据仅在 L1 缓存中保留。

6 具体实施方法

6.1 敏感代码处理

SmokeBomb需要对敏感代码进行两次修改。首先,之前中提到的两个 API 调用必须在敏感代码之前和之后插入。其次,敏感代码中的缓存更改指令必须修改为 SmokeBomb 定义的指令,这些指令的操作码在 ARMv7 和 ARMv8 指令集中不存在。SmokeBomb软件通过未定义的指令处理程序模拟它们。

SmokeBomb 通过只需要敏感数据的注释(在我们的实现中,使用属性语法注释)为开发人员自动执行此过程,并且 SmokeBomb 在编译期间派生所有必要的代码修改。开发人员可以直接注释静态数据,也可以为动态分配的数据添加数据指针。请注意,由于 SmokeBomb 是一种保护机制,因此我们依靠开发人员来识别应保护的数据。但是,存在自动识别此类数据的方法,可以修改这一汇编过程,以自动插入甚至注释本身。

6.2 预加载敏感数据

在执行敏感代码之前,SmokeBomb 会预加载敏感数据(或者,如果敏感数据大于 L1 缓存,则预加载选定的敏感数据)。将数据预加载到缓存中的一种方法是简单地使用LDR获取数据,但是,这很慢,因为CPU将等到数据实际到达寄存器或内存。为了获得更好的性能,SmokeBomb 通过使用 Cortex-A 系列中可用的预加载数据 (PLD) 指令,采用了称为数据预取的硬件功能。SmokeBomb通过使用ARMv7中的PLD指令和ARMv8中的PRFM PLD指令来触发预取器[10,13]。为简洁起见,我们使用“PLD指令”来指代这两种指令表格。PLD指令的执行速度比LDR快得多,将数据提取到缓存中。

PLD指令将数据(缓存行大小)从内存加载到缓存。但是,使用 ARM 的伪随机缓存替换策略,在流程早期加载的敏感数据可能会被流程后期加载的敏感数据逐出。SmokeBomb必须确保不会发生这种情况,以便可以安全地加载整个敏感数据。我们在两种测试环境中的实验表明,伪随机替换策略仅在没有空缓存行可用时触发。如果我们可以通过在数据应该驻留的集合中刷新一个缓存行来使其可用,则保证数据占用空缓存行,而不是逐出集合中的任何其他行。

对于非包容性缓存,PLD 指令也会自动将数据加载到二级缓存中,这会导致跨核缓存攻击,因为二级缓存行是可逐出的。为了防止这种情况,我们使用上一小节中描述的相同方法来确保敏感数据始终以已知方式加载到缓存中。然后,我们刷新二级缓存中的敏感数据。当 SmokeBomb 预加载敏感数据时,可以逐出 L2 缓存中其他进程的数据。为了尽量减少这种影响,SmokeBomb 仅使用二级缓存的最后一种方式。对于非独占缓存,SmokeBomb 会将敏感数据加载到 L2 缓存中。

下图说明了 SmokeBomb 如何绕过伪随机替换策略将敏感数据预加载到缓存中。我们首先将敏感数据的虚拟地址转换为物理地址,并分别计算其 L1 和 L2 缓存的设置编号,因为缓存是物理索引和标记的。然后,我们分别在 L1 和 L2 缓存中刷新该集合的一条路,以便为敏感数据腾出空间,如图 2 的 (1)–(2)所示。为方便起见,我们在此步骤中从 L1 的最后一种方式刷新到第一种方式。然后,我们使用PLD指令将数据加载到缓存中,如图2的(3)所示。由于 L1 和 L2 缓存中有一个可用的缓存行,因此数据将转到该可用行。我们刷新刚刚加载的 L2 缓存行,如图 2 的 (4) 所示。我们重复此过程,直到将整个敏感数据或选定的敏感数据加载到缓存中。在这个循环中,如果 L1 缓存的某个方式被敏感数据完全占用,我们开始填充之前的方式

image-20231027173125828

6.3 保留敏感数据在L1 cache

预加载敏感数据(或选定的敏感数据,如果敏感数据大于一级缓存的大小)后,在执行敏感代码期间将其保留在缓存中以防止侧信道攻击至关重要。此外,缓存中不得包含未选择的敏感数据。通过仅保留预加载的敏感数据,SmokeBomb 在整个敏感代码执行过程中实现了一致的缓存状态。

但是大多数 ARM Cortex-A 系列处理器不支持硬件缓存锁定技术,为了设计软件缓存锁定技术,我们使用未定义的指令异常处理程序,它可用于实现自定义的“软指令”。

SmokeBomb首先加载原始指令引用的数据。如果此数据的地址已在 L1 缓存中,则无论数据是否敏感,处理程序将立即返回到敏感代码。这是因为如果在预加载敏感数据后非敏感数据已经在缓存中,则意味着数据与敏感数据一起存在于缓存中。我们通过检查 L1 数据缓存重填事件来确定数据是否在 L1 缓存中。如果事件未发生(即发生 L1 缓存命中),则内存系统不会从主内存获取数据。因此,预加载的敏感数据仍然仅在 L1 缓存中。

image-20231027173226050

如果数据既不是已在 L1 缓存中的非敏感数据,也不是预加载的敏感数据,则数据将被提取到 L1 和 L2 缓存中,如图中的 (1) 所示,这可能会导致存储敏感数据或选定敏感数据的缓存行被逐出。由于我们无法确定由于伪随机替换策略而逐出哪种方式,因此 SmokeBomb 只需像预加载过程中一样重新加载集中的敏感数据。但是,如果加载数据的地址与任何预加载的敏感数据不一致,SmokeBomb 将返回到敏感代码而不重新加载。

为了重新加载敏感数据,SmokeBomb 会使用其虚拟地址刷新位于集合中的数据。一旦敏感数据从 L1 缓存中逐出,SmokeBomb 就无法知道 L2 缓存的哪一种方式包含数据。因此,SmokeBomb 从缓存中完全删除了集中的敏感数据,如图 3 的 (2) 所示。然后,SmokeBomb按照预加载方法重新加载敏感数据,再次填充集合,如图的(3)-(7)所示。因此,该进程具有仅在 L1 缓存中预加载的相同敏感数据。

为了防止抢占,SmokeBomb 在开始执行敏感代码时会暂时只更改单个进程的调度策略(系统上的其他进程在默认调度策略下继续运行)。与可以操纵抢占策略本身的内核线程不同,用户级线程不能摆脱抢占。但是,用户级进程可以运行,直到它使用具有最高静态优先级的先进先出 (FIFO) 调度策略自愿放弃 CPU。在 Linux 内核中可用的调度策略中,FIFO 调度是唯一不会以时间片方式调度线程的策略。

6.4 刷新敏感数据

敏感代码完成后或调度受保护的进程时,如果 SmokeBomb 不刷新它,整个敏感数据将逐渐逐出。尽管在敏感代码终止后将敏感数据留在缓存中似乎无害,但作者设计了实验来验证刷新的必要性:特别是,在使用 LRU 替换策略时,攻击者是否可以利用缓存。

我们在Cortex-A72上进行了实验,它使用L1缓存的LRU替换策略。然后,受害者在访问三个不同的内存地址后立即终止自己。然后,攻击者加载与敏感数据一致的数据,以逐出最近使用的缓存行。在最后一步,攻击者检查敏感数据的访问时间。

image-20231027173440102

我们进行了3000次这个实验。上图显示了攻击结果,其中受害者实际访问的三个地址在预加载的敏感数据中缓存命中次数最多(红色方块)。蓝色方块代表受害者未访问的预加载内存地址,其缓存命中次数低于红色方块。为了防止这种攻击,SmokeBomb会在敏感代码终止时从缓存中刷新敏感数据,以防止信息泄露。

7 评估

7.1 实验环境

实验环境包括三星Tizen设备和Raspberry PI3,分别使用Cortex-A72和A53处理器型号,如表1所示。这些设备具有不同的指令集:ARMv7 和 ARMv8。

原型由两部分组成:

  1. 带有二进制修补工具的LLVM传递
  2. 可加载的内核模块。

除了加载内核模块之外,无需更改操作系统即可部署,开发人员可以通过在其应用程序中注释敏感数据(或使用自动识别数据的方法,例如 CacheD)来采用。

image-20231027173533043

7.2 一级缓存作为私有空间的有效性

这个实验用于验证将敏感数据预加载到缓存中并将其保存在L1缓存中的方法是否适用于非包容性缓存模型。

首先使用 PLD 指令加载 8 KB 的数据。其次,我们使用 DC CISW 指令刷新二级缓存。第三,我们使用LDR指令再次加载相同的数据,检查L2缓存重填事件。正如预期的那样,没有发生二级缓存重填事件,因为所有数据访问都触发了一级缓存命中。

image-20231027173609500

7.3 实例测试

7.3.1 OpenSSL—AES algorithm

第一个实例是openSSL库中的AES加密算法,AES是一种对称密码算法。AES算法的T表是一个众所周知的侧信道攻击目标。T表是AES算法预先计算好的一个查找表。测试时用到了四个1KB的T表,总共4KB敏感数据。加密过程4个表(Te),解密过程4个表(Td),共8个。每一轮操作都通过16次查表产生。如果密钥长度为128位,则AES加密和解密过程有10轮,密钥也会扩展为10轮密钥。此密钥扩展使用针对T表的查找,并且通过缓存侧通道确定,这些查找操作产生的侧信道信息会被攻击者用于恢复密钥数据。

在没有SmokeBomb的防御的情况下,作者经过150次攻击迭代后成功恢复了密钥。但是,在应用 SmokeBomb 后,攻击者无法观察到两个测试设备上 T 表的所有条目的任何计时差异。

image-20231027173727882

7.3.2 决策树

决策树算法用于根据某些输入数据(称为属性)做出决策。参数是属性,输出是算法的决定。决策树的每个节点都是一个测试属性并根据测试结果获取分支的点。叶节点表示属性做出的最终决策。由于根据属性访问不同的内存地址,因此这可能会导致缓存侧信道攻击导致信息泄露。

对于这个实验,我们使用ID3算法创建了一个决策树[29]。我们还实现了一个共享库,它使用决策树提供服务。攻击场景如下:受害者调用共享库中的函数,从决策树中获取结果。要调用该函数,受害者需要选择特定信息作为属性。一组属性用作函数的参数。攻击者试图识别受害者选择的属性和树做出的决定。

SmokeBomb 应用于遍历决策树的函数中,该函数通过将决策树注释为敏感数据(一行代码更改)来遍历决策树。由于每个不同的节点都测试唯一属性并做出最终决策,因此节点的内存地址与属性(或最终决策)之间存在一对一的对应关系。在没有保护的情况下,攻击者可以清楚地找出输入记录和最终决策,如图 6 所示。SmokeBomb 强制敏感数据保持一致的缓存状态,因此攻击者无法使用访问时间将数据分类为关键数据。图 6b 特别显示了敏感代码执行过程中的攻击结果。我们模拟了攻击,以便在执行退出 API 之前重新加载敏感数据。攻击结果都是因为目录协议导致的缓存命中,表示敏感数据被完全保留。

image-20231027173800382

7.3.3 大规模敏感数据

这个case主要用于展示SmokeBomb在保护敏感数据大于L1缓存的应用程序时防御的有效性。

如果敏感数据大于L1数据缓存,则SmokeBomb仅选择前8 KB作为选定的敏感数据。

我们以这样一种方式进行攻击,即攻击者可以在受害者完成访问敏感数据后(在刷新数据之前)检查数据重新加载时间。

如图显示了结果:攻击者无法推断实际访问模式,只能看到前8个条目的缓存命中,其余条目的缓存未命中。这种一致性可防止缓存侧信道攻击,即使敏感数据大于L1缓存也是如此。

image-20231027173827268

7.4 性能

image-20231027173901979

image-20231027173906379

image-20231027173912199

image-20231027173920990

image-20231027173925970

8 工作局限性

  1. 指令缓存不受保护:可能允许攻击者了解受害者进程执行了哪些指令(尽管不是访问了哪些敏感数据)。应用SmokeBomb来完全保护指令缓存存在一个基本问题:ARM有一个预加载指令(PLI)指令,但实际上我们不能使用此指令将指令提取到L1指令缓存中。PLI指令的效果在ARM架构参考手册中没有明确定义。预加载指令(PLI)指令在几个Cortex-A处理器中被视为NOP指令,或者它将指令提取到L2缓存而不是L1指令缓存。因此,加载 L1 指令缓存的唯一通用方法是执行指令。
  2. 无法为独占缓存(exclusive cache)提供完整的防御:这是因为如果攻击者将敏感数据加载到其 L1 缓存中,并将数据从 L1 逐出到 L2 缓存,则数据也可能从受害者的 L1 缓存中逐出。根据独占缓存的定义,整个缓存中只有一个数据副本。因此,如果独占二级缓存由多个内核共享,则一级缓存的缓存行可能会受到其他内核数据使用的影响。因此,攻击者可能会推断出与密钥数据相关的信息。此类信息泄漏在理论上并非不可能,但实际上很难实现,因为攻击者必须在两个 SmokeBomb API 之间的极短执行时间内逐出数据后识别受害者是否重新加载数据。此外,重新加载的数据可能不是关键数据。不幸的是,我们无法对独占缓存模型进行任何实验,因为市场上没有可用的设备。只有Cortex-A55在ARM CPU之间使用专用的二级缓存,但是,这是专用的每核统一二级缓存,不在内核之间共享。
  3. 需要重新编译源码,不能应用于编译的二进制文件:尽管 SmokeBomb 只需要对敏感数据进行注释,但它必须重新编译源代码,因此不能应用于编译的二进制文件。最后,SmokeBomb 的实现取决于硬件规格,例如缓存的大小和包容性。因此,需要稍作更改才能为每个不同的CPU实现SmokeBomb。
  4. 依赖于特定的架构:虽然 L1 缓存中的专用空间的概念不是特定于 ARM 的,但 SmokeBomb 是为 ARM 体系结构实现的,并且大量使用了 ARM 体系结构的特定功能。
  5. 需要开发者手动注释敏感数据才能保护