Towards Reinforcement Learning for Exploration of Speculative Execution Vulnerabilities
强化学习探索投机执行漏洞
https://arxiv.org/pdf/2502.16756
摘要
像Spectre这样的推测执行攻击可以用来绕过安全隔离机制,窃取其他程序的信息。在现有的处理器上探索推测执行攻击需要大量的手动逆向工程工作以及对处理器内部机制的深入了解。这种基于逆向工程的方法需要大量的人工投入,速度慢且不具备可扩展性。本文中,我们介绍了SpecRL,这是一个利用强化学习来探索商用现成微处理器中推测执行泄漏问题的框架。相比传统方法,这种基于强化学习代理的方式所需逆向工程的工作量更少,同时仍能识别推测执行漏洞。与现有的模糊测试方法[1]相比,在程序规模较大时,我们的方法耗时更短。
关键词—Spectre,推测执行,强化学习,侧信道攻击,分支预测
I 引言与背景
推测执行是一项在许多现代乱序处理器的微架构中实现的强大技术,用于提升性能。通过推测性地执行指令而不是停顿,处理器流水线中可以执行更多的指令,从而提高了指令级并行性。推测执行带来的性能优势的一个例子体现在条件分支上。
在条件分支中,紧跟在条件分支之后的指令只有在该条件分支被解析之后才能确定。对于顺序流水线处理器来说,此时处理器必须停顿,这对性能是一个很大的影响。相反,乱序处理器通过预测条件分支的结果,推测性地执行后续的指令,在等待条件分支解析的同时完成其他工作。如果预测的路径是错误的,处理器会清空流水线,并开始执行正确的路径。在错误预测路径上执行的指令被称为瞬态指令(transient instructions),它们的执行过程称为瞬态执行(transient execution)。
虽然推测执行和分支预测提升了处理器性能,但也带来了关键的安全漏洞。瞬态执行的指令可能会访问受保护内存中的敏感信息,造成意外的数据泄露。从指令集架构(ISA)层面的抽象来看,这种行为是合法的,因为瞬态执行不会在架构状态中留下痕迹。然而,从处理器的微架构视角来看,瞬态执行会在微架构状态的不同部分留下痕迹,因此可以通过各种微架构侧信道(microarchitectural side channels)将这些信息泄露出去。这一漏洞最著名的攻击形式就是2018年提出的Spectre(幽灵)攻击。
识别推测执行漏洞:推测执行泄漏漏洞的识别可以在芯片制造前(pre-silicon)或制造后(post-silicon)进行。
在芯片制造前的识别阶段 [3]–[5],漏洞识别相对直接,因为检测工具处理的是处理器的RTL(寄存器传输级)描述,拥有对整个微架构状态的完整知识和控制权。
而在芯片制造后的识别阶段 [1],漏洞识别则复杂得多,因为没有直接方法可以判断是否发生了推测性泄漏。Guarnieri 等人 [6] 提出了硬件-软件契约(hardware-software contract)的方法,通过关系测试来检测黑盒处理器中的推测性泄漏。下面是对使用契约定义的推测性泄漏的简要说明。
现有方法
Spectre [2] 漏洞是在对处理器行为进行大量逆向工程之后手动发现的。这种识别漏洞的方法是一个缓慢且成本高昂的过程,因为它要求研究人员对特定处理器的指令集架构(ISA)和微架构都有深入而全面的理解。
自那以后,人们开发出了用于在芯片制造前(pre-silicon)和制造后(post-silicon)阶段自动搜索推测性泄漏的工具。本文我们主要关注芯片制造后的漏洞探测阶段。现有的芯片后阶段检测方法,如 Revizor [1] 或 Medusa [7],依赖于**基于模糊测试(fuzzing-based)**的方式来生成测试用例。
然而,这些方法受限于巨大的搜索空间以及许多推测性泄漏所具有的顺序性特征。这是因为模糊器通常是一次性生成测试用例,导致其效率随着程序规模的增长呈指数级下降。
本文工作
我们提出了SpecRL,这是一种利用强化学习(Reinforcement Learning, RL)探索推测执行漏洞的新方法。近年来,强化学习已被广泛应用于计算机科学与安全领域的各类问题中。
与依赖专家知识的传统经验方法不同,基于学习的方法通常只需要数据和训练。只要有足够的数据和计算能力,它就可以基于经验知识实现超越人类的表现,这一点在 Google DeepMind 于 2017 年的研究成果中得到了验证 [8]。
对于那些我们可以在实际处理器上复现的推测执行漏洞来说,使用强化学习相较于监督学习的优势在于:它可以无需大量标注数据集,因为强化学习通过直接运行处理器来自行生成训练数据。
此外,强化学习具有天然的时序建模能力,在寻找更复杂的推测性泄漏时,相比于模糊测试方法也可能具有更好的表现。
正因如此,我们认为强化学习是一种探索推测执行漏洞的极具潜力的解决方案。
II. 强化学习建模
强化学习通常涉及智能体(agent)和环境(environment)。智能体通过执行*动作(actions)与环境进行交互,并通过观察(observations)和奖励(rewards)获得反馈。
在一次“步骤”中,训练过程遵循以下一般流程:
智能体从动作空间中选择一个动作;
学习环境对这个动作做出响应,返回相应的观察信息和奖励值;
智能体利用返回的观察信息和奖励值在训练过程中更新其策略(policy)。
在我们的应用场景中,每一个动作代表一条汇编指令,而智能体的目标是构建一个能够触发推测性契约违规(speculative contract violation)的汇编程序。
SpecRL 的环境遵循Gymnasium 标准 [9],其建模如下:
动作空间(Action Space):动作空间是一个由指令组成的向量 {i₀, i₁, ..., iₙ₋₁},长度为 n,其中 n 表示智能体可选择的指令数量。 观察空间(Observation Space):由于我们所处的是一个黑盒环境,处理器的微架构状态无法直接在观察空间中被看到。因此,我们依赖性能计数器侧信道信息来帮助我们获取关于处理器微架构状态的有用观察信息。
更具体地说,对于给定的指令序列,我们可以观察到以下内容:
- HTrace :
:通过 Prime+Probe 技术实现;
- CTrace
:通过基于 QEMU 的模拟器实现;
- 分支预测错误次数(#ofBRMisses)
:通过性能计数器INT_MISC.RECOVERY_CYCLES实现;
- 瞬态微操作数量(#ofTranUOps)
:通过计算性能计数器UOPS.ISSUED_ANY和UOPS.RETIRED_SLOTS的差值得出。
为了找出每条新增指令所产生的影响,我们必须逐步观察所关注的指令序列。
更正式地来说,给定一个指令序列:
为了找到每条新增指令所产生的影响,我们必须逐步观察所关注的指令序列。
更正式地来说,给定一个指令序列:
其中m是最大指令序列长度。
奖励函数(Reward Function):
SpecRL 的奖励函数设计为:当智能体执行的动作能够触发可观察的瞬态执行时,给予奖励。如果发生了推测性泄漏(speculative leak),则给予非常大的奖励;如果发生了错误预测(misspeculation),则给予较小但仍然可观的奖励;如果该错误预测可以通过侧信道被观察到,则给予略高于普通错误预测的奖励。
如果程序没有引发错误预测,或者错误预测不可观察,则给予相应的负向奖励(惩罚)。此外,在每一个步骤中还会给予一个轻微的负向奖励,以鼓励生成更简洁的指令序列。
环境细节(Environment Details):
这种强化学习建模方式带来了三个实现上的关键细节问题:
- 无限循环问题(Infinite Loops)
由于我们允许智能体依次添加指令,其中包括控制流指令,因此在获取相应执行轨迹(trace)之前,我们需要检查当前步骤是否会创建无限循环。然而,正如 Alan Turing 在其“停机问题(Halting Problem)”中指出的那样,这个问题无法静态判定[10]。
我们通过动态方式来规避这个问题:将带有新增指令的程序交给一个子进程运行,测量其模拟所需时间,若子进程运行时间过长,则丢弃该指令。这种方法还确保了每个步骤的最大轨迹生成时间,避免训练因过长的循环而停滞。
- 处理器的微架构状态(Microarchitectural State)
obsᵢ(第 i 次观察)反映了初始微架构状态以及指令序列的影响。为了保证相同的指令序列在不同运行中能获得相同的obsᵢ,我们需要确保处理器的微架构状态一致。
微架构状态包括分支预测器和缓存。我们在每次观察前执行WBINVD指令,并运行一个包含 5000 万条条件分支的程序,从而有效地将分支预测器的模式历史表(PHT)重置为确定性状态,并清空缓存,使得相同程序的不同观测之间,相关的微架构组件状态保持一致。
- 内存访问问题(Memory Accesses)
指令序列是在内核空间中的硬件上进行观察的,这意味着智能体所进行的所有内存访问都必须进行沙箱隔离(sandboxed),以防止造成内核崩溃。
训练流程(Training Flow):
SpecRL 的训练流程如图 1 所示。
智能体根据其当前状态和策略生成一个动作(即一条指令)。如果需要,该指令会首先被插桩(instrumented)或沙箱化。接着对该新指令序列进行无限循环检测。
如果指令序列通过了无限循环检测,那么这条新指令就会被添加到环境中的攻击程序中。随后,该攻击程序会在一系列输入下被执行,并通过以下方式进行观察:
实际硬件(用于 HTrace、#ofBRMisses 和 #ofTranUOps)
或者通过模拟器(用于 CTrace)
这些观察结果会被反馈给智能体,同时也会输入到奖励函数中,以返回一个奖励值给智能体。智能体利用这些新的输入来更新其策略,然后生成下一个动作,重新开始训练流程。
III、案例研究(Case Study)
本案例研究的重点是:(1)验证 SpecRL 是否能够发现推测执行漏洞;(2)比较在不同程序规模下,使用 SpecRL 与现有模糊测试工具进行检测时,检测时间的变化趋势。
实验设置(Setup):
我们在 AMD Matisse 架构的 CPU(AMD Ryzen 5 3600)上实现了我们所描述的强化学习建模方式。为此,我们基于 Gymnasium 标准创建了一个名为SpecEnv的自定义环境,并使用Revizor [1]来在硬件上测试契约违规行为。随后,我们将 SpecEnv 接入了 Ray 的 RLlib(一个用于驱动强化学习训练的库)中。
作为概念验证,我们专注于利用Spectre V1 类型的漏洞,这类漏洞依赖于错误训练分支预测器。我们的动作空间包括一组简单的指令集,包含:
减法指令(SBB)
有符号乘法指令(IMUL)
条件跳转指令(JNS)
无条件跳转指令(JMP)
由于每条指令的操作数可以有多种选择(寄存器、标签等),因此智能体的动作空间总共包含40 条不同的指令。
此外,在训练开始前,我们为测试程序随机生成了20 组输入数据。内存操作指令被沙箱隔离,所有读写操作均相对于寄存器 R14 进行。任何模拟运行时间超过1 秒的指令都会被丢弃。
我们使用 RLlib 提供的PPO(Proximal Policy Optimization)算法进行训练,并采用其默认配置参数。
为了与当前最先进的模糊测试方法进行对比,我们也使用类似的动作空间对 Revizor 进行了测试。
对于 SpecRL 和 Revizor,程序规模从10 到 150,每次增加 10。
实验结果(Results):
在所有程序规模下,SpecRL 平均在 7 分钟内就能发现一个泄漏漏洞。在更大的程序规模下,SpecRL 依然能够发现漏洞,甚至能处理长达60 条指令的序列。
如图 2 所示,检测时间与程序规模之间只有弱相关性,最多呈现线性增长趋势,这与预期一致。
而相比之下,Revizor 的检测时间随着程序规模大致呈指数级增长,如图 2 所示。
这是合理的,因为对于一个完全随机的模糊器来说,发现漏洞所需的测试用例数量(与检测时间成正比)可以用以下公式表示:
n−l+1an−1
其中:
- n 是程序规模
- a 是动作空间大小
- l是导致泄漏的指令序列长度
这些结果表明,在较大的程序规模下,SpecRL 能够更高效地发现推测执行漏洞.
IV. 未来工作(Future Work)
未来工作中一个较为直接的方向是动作空间(action space)的扩展。当前案例研究中使用的动作空间非常有限,仅包含4 条唯一指令。然而在现实中,x86 指令集包含数百条指令。历史上,强化学习算法在处理大规模动作空间方面一直面临挑战,因此将动作空间扩展到更大的指令集会带来一系列相关难题。
此外,目前的动作空间并未赋予智能体对程序输入的控制权。当前的输入是随机生成的,并在运行时通过“提升”(boosting)过程来检测推测性泄漏。尽管这种方法有效,但“提升”过程代价高昂,因为必须先对程序进行分析以找出依赖关系。如果在动作空间中引入对输入的控制,可能会加速训练过程,并让智能体更全面地感知执行环境,从而有可能完全学会如何错误训练分支预测器(mistrain a branch predictor)。
然而,让智能体控制输入的一个潜在缺点仍然是由此带来的巨大的动作空间膨胀问题。
未来的工作还可以探索启用分布式训练,这是 Ray 框架的核心优势之一。虽然当前设置是在单台机器上进行训练,但利用 Ray 的分布式特性可以实现训练过程的并行化,从而显著加快学习速度。这将使智能体能够更快地发现漏洞,也可能使其在合理的时间内发现更复杂的推测执行漏洞。
V.相关工作(Related Work)
Revizor [1]使用了软硬件契约(Software-Hardware Contracts),其主要区别在于 Revizor 使用了一个带有某些推测性过滤器的模糊测试器(fuzzer),而SpecRL 使用的是一个具有“顺序决策”能力的智能体(agent)。我们认为,对于那些需要对分支预测器进行“训练”的推测执行漏洞来说,这种方法更加直观。正如我们所展示的那样,Revizor 在程序规模较大时扩展性不佳,而 SpecRL 则表现良好。
AutoCAT [11]是首个探索使用强化学习进行微架构攻击的研究,但它仅关注缓存时序攻击(cache timing attacks),并未考虑分支预测器或微架构中的任何推测性因素。MACTA [12]则使用多智能体强化学习来实现缓存侧信道的攻击与检测,但同样也主要集中在缓存时序通道上,并且大多基于模拟器进行。
VI. 结论(Conclusion)
综上所述,本文介绍了SpecRL—— 一种利用强化学习发现推测执行漏洞的新方法。我们提出了 SpecRL 的强化学习建模方式,并通过一个案例研究对其可扩展性进行了分析。
随着推测执行漏洞的不断演变,SpecRL 为自动化和提升微架构安全分析提供了一个极具前景的方向。
原文链接:https://arxiv.org/pdf/2502.16756
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.