Security

分布式账本中的侧信道分析

分析分布式账本系统中的侧信道攻击威胁,提供全面的安全防护策略和评估方法。

分布式账本中的侧信道分析

> 介绍侧信道分析/攻击(SCA)和相应的对策,并提供有助于安全评估考虑这些因素的方向。侧信道与密码学实现相关,因此它们在区块链环境中引入了一类攻击向量。

本文的目标是介绍侧信道分析/攻击(SCA)和相应的对策,并提供有助于安全评估考虑这些因素的方向。侧信道与密码学实现相关,因此它们在区块链环境中引入了一类攻击向量。

> 注意:本文中的定义未必直接来自教科书和行业标准。希望深入了解该主题的读者可以参考相关且最新的研究和标准化成果。

引言

任何计算的执行都具有物理特性。它需要一定的时间来计算,同时也会消耗一些能量。它会产生电磁波动,甚至可能产生声音。我们将这些物理量称为计算的侧信道(SCs)。

如果我们在一计算执行过程中测量一个侧信道,我们会得到一个以时间为横轴、以该物理量值为纵轴的图表(除非我们测量的是总执行时间,那样只会得到一个值而不是图表)。这样的图表被称为轨迹。下面展示了一个 AES 轮次执行示例的功率轨迹。注释指出了计算的不同内部阶段。

侧信道信息可用于推断执行输入的信息。假设一个计算,对于不同的输入值,执行时间不同。此外,假设该计算是确定性的,它是在隔离状态下执行的(没有其他操作并行发生),并且我们具有完美的测量精度且没有测量噪声。我们可以对所有可能的输入值执行计算,并收集它们对应的执行时间(不考虑存储需求)。在上述假设下,我们可以测量具有未知输入值的执行所需的时间,将其与存储的执行时间进行比较,从而推断出输入值。如果我们将其应用于密码学算法的上下文中,我们最终会得到一个能够帮助我们根据获取的跟踪信息推断秘密值(私钥、非 ces、明文等)的工具。在本篇文章的其余部分,我们将重点关注密码学算法。

实际上,我们并不期望输入值和跟踪之间存在1-1的映射关系,计算的执行并非与其他执行或系统的内部运作相互隔离,测量结果会受到噪声的影响,并且受限于所用设备的精度,从而导致额外信息的丢失。此外,我们无法假设相同的计算会产生相同的跟踪结果(不考虑噪声和其他因素),因为通常情况下,在相同输入上对同一计算进行后续执行并不保证其表现完全一致(想想系统中断、缓存、概率性优化、纠错操作等)。

我们可以将导致我们偏离理想情况的因素分为两类:一类是导致信息丢失的因素,另一类是向追踪中污染无用信息(从而对获取信息的分析引入不确定性)的因素。前者可以通过简单地收集更多信息来应对,简单来说就是获取更多相同计算的追踪。后者可以通过统计工具的组合来应对,以专注于重要信息并识别和移除无关信息。

侧信道也可以用于影响目标操作,而不仅仅是被动地收集信息。修改目标行为的能力为一种不同类型的攻击创造了机会,称为主动侧信道(又名故障攻击或扰动攻击)。例如,通过反复访问相邻单元来改变内存单元的比特值(Rowhammer),或向硬件组件射击激光束以绕过关键安全检查( 激光故障注入 )。我们在此提及这类攻击是为了完整性,不会进一步详细阐述。

在本文的其余部分,我们将介绍一些术语,深入探讨两种重要的侧信道攻击类型,讨论应对措施,并以一种在侧信道攻击(SCAs)背景下进行安全评估的方法作为总结。

威胁建模

在本节中,我们详细阐述了在侧信道攻击(SC 攻击)的背景下定义攻击者特征时起重要作用的一些特性。我们将定义一个松散的框架,用于本次讨论。

需要注意的是,侧信道攻击的有效性并不依赖于弱的密码学假设(即离散对数)、编码错误或规范与实现之间的不匹配。侧信道引入了新的攻击向量,扩展了现有的线程模型。

对系统的了解

一个重要因素是攻击者对目标系统了解多少。至少,攻击者需要具备一些关于目标系统上执行的算法的知识(或者能够做出有根据的猜测),以及是什么触发了它们的执行。通常,假设攻击者了解实现细节(可以访问源代码或硬件设计),因为这类信息通常可以通过其他方式获得(逆向工程、有根据的猜测、行业标准等)。

邻近性

一个决定性因素是攻击者需要与目标保持的邻近程度。这个因素更广泛地用于评估任何类型的漏洞(参见 CVSS)。我们可以借鉴并稍作修改常用于此因素的量化方法,并在侧信道攻击(SCA)的背景下使用它。我们可以使用以下评级:

物理 - 攻击者需要能够物理访问/修改目标

本地/邻近 - 攻击者拥有或能够获得逻辑上与目标位置相近的位置(例如:同一局域网,能够对共享硬件执行操作)

网络 (或远程)- 这是限制程度最低的等级,通常意味着攻击者可以通过互联网利用漏洞

需要物理接近的典型攻击例子是电力和电磁基础上的侧信道攻击。这些攻击要求物理测量目标硬件的功耗或电磁辐射,大多数情况下需要探测甚至修改硬件。

在另一端,当网络通信时间波动足够明显时,我们主要发现时间攻击。

时间攻击也可以是局部的,当它们是局部的时候,它们更有效,因为网络抖动更少。在局部类别中,我们找到一类强大的攻击,称为微架构攻击。这些攻击利用了现代 CPU 上运行的进程共享许多 CPU 子组件(缓存、执行流水线等)的事实。共享和交错使用会泄露计算内部操作的信息。

根据目标及其运行条件,可能存在远程发起攻击的机会,而传统上这类攻击需要物理接近。例如,CPU 具有用于电力调节的测量组件。如果该组件通过某个接口暴露给操作系统,那么就有机会在不进行物理探测的情况下获取电力轨迹。当然,这类攻击将受到所需权限、测量精度降低等因素的限制,但机会确实存在。在防范侧信道攻击(SCA)时,明智的做法是不要固守固定思维,至少要考虑上述最坏情况。

攻击复杂度

该指标区分易于复制和需要针对每个目标满足特殊要求的攻击。典型排名为低和高 。

示例:

对一个服务发起远程时序攻击可能被评定为高复杂度,因为时序波动将取决于服务器硬件,而不同目标的服务器硬件可能存在显著差异

对一个特定智能卡型号发起功率攻击可能被评定为低复杂度,因为不同目标在最低技术层面上有很大可能表现出相同的行为

权限

不同的攻击需要目标对象具有不同的权限。这里通常的值是 无/低/高 ,其中低和高通常对应于用户与管理员访问。

一个无案例可能是一种远程时序攻击,攻击者只需要等待特定的流量(或生成适当的流量)来触发目标计算。

一个低案例在微架构攻击中很常见。例如,假设目标是托管在共享服务器上的服务。攻击者需要是托管提供商的终端用户,并尝试与目标共位。

被评为高的案例在侧信道攻击中较为罕见。我们可以通过假设功率传感器接口只能由具有管理员权限的用户访问,从上述远程功率攻击中创建一个假设性示例

侧信道分析方法

侧信道分析流程可分为四个阶段:设置、采集、处理和分析。实际攻击被定义为分析后的最终(第五步)。通常每个阶段都会揭示新信息,从而帮助完善之前的步骤。此外,之前步骤中做出的假设可能被证明是错误的,导致需要重复之前的步骤。该流程如图所示:

设置阶段主要涉及准备目标和与之的连接。这可能包括修改硬件(例如移除电容器)、蚀刻、焊接、选择和连接设备。在非物理攻击中,这可能包括识别服务、准备网络监控等。当攻击是交互式时,即攻击者需要主动与目标通信而不是仅仅监控时,攻击者可能需要准备输入和响应数据。在设置阶段结束时,攻击者必须有一种连接到目标的方法,并且需要有一种方法来触发或接收通知,以便在相关计算被执行时进行操作。

在获取过程中,攻击者获取侧信道痕迹。这是一个简单的触发/通知 - 测量 - 存储流程的迭代。需要获取的痕迹数量由处理过程和主要的分析步骤决定。攻击者最初获取的是经验估计的痕迹数量。

处理过程对获取的痕迹应用通用信号处理技术,以实现降噪、减少未对齐痕迹的抖动等。这是一个重要步骤,有助于从痕迹中去除无用信息。

分析是最重要和定义性的步骤。此步骤的目标是评估我们是否拥有足够的信息来发起攻击。有不同类型的分析。最简单的一种是目视检查痕迹,以检测直接映射到秘密数据的模式。下面的痕迹展示了这种情况:

目视检查可能无法直接提供攻击者所需的信息,但可能暗示攻击者应关注的方向和分析的步骤。更常见的是,分析包括统计方法,例如检测跟踪和秘密数据之间的相关性。当分析显示跟踪和秘密数据之间存在强关联时,分析师可以得出结论,即目标在给定侧信道下存在弱点,攻击者已准备好发起攻击并获取秘密数据。

侧信道攻击利用分而治之的范式。侧信道信息有助于逐个揭示秘密值的一部分。候选值根据分析步骤的信息进行排序,并在攻击过程中进行尝试

时序攻击

我们继续解释时序攻击。本节中的示例假设攻击者具有完整的目标知识,并在 CPA 模型下进行操作。我们还主要关注分析和攻击阶段。

示例 1

一个简单的时序攻击示例是非恒定比较敏感数据。

fn check_password(in_pwd: [u8], pwd: [u8]) -> bool {

if len(in_pwd) != len(pwd) {

return false;

}

for i in 0..len(pwd) {

if in_pwd[i] != pwd[i] {

return false;

}

}

return true;

}

input_password = read();

compare(input_password, correct_password);

check_password 函数将在输入 m2 完全扫描时,或 m1 与 m2 首次出现差异时返回。这里的执行时间取决于提供的输入之间匹配的前导字符数量。

攻击者可以尝试所有可能的单字符密码并收集执行时间测量值。正确猜测第一个字符的密码将具有略微不同的执行时间,这会向攻击者发出信号,让其继续暴力破解第二个字符,以此类推。在这个示例中,时序信息充当了正确密码字符的预言机,并用作导航密码空间启发式的方法。

攻击者的努力是 (n/2)∗l(n/2)∗l,其中 nn 是密码的字母表,ll 是密码的长度。与需要付出 nl/2nl/2 努力的简单暴力攻击相比,这是一个巨大的减少。

示例 2

一个更高级的时序攻击示例基于以下代码片段。假设这是一个算法,它接受一个密钥 dd 和一个消息 mm,并输出 mm 的签名。

fn sign(m: Message, d: SecretKey) -> Signature {

let x = m;

for i in len(d)-1..0 {

x = x^2 mod n;

if d[i] == 1 {

some_operation(x,m);

}

}

return x;

}

我们可以看到,密钥 dd 的每个比特位用于确定是否执行某些代码。这造成了密钥的比特值与算法终止所需时间之间的依赖关系。

为教育目的,我们从一个不成功的攻击示例开始。假设为了简化,if 内部的代码执行时间恒定。作为第一次尝试,我们可以快速看出,我们可以声称算法的总执行时间会泄露秘密的汉明重量(设置为 1 的位数)。对于给定的 m,攻击者可以轻松地收集所有汉明重量的离线时间测量值,并将获取的跟踪与它们进行比较。这在确定秘密值方面没有帮助,除了某些平凡情况。当攻击者知道长度为 n 的秘密的汉明重量 kk 时,他们有减少的暴力破解工作量 eff=(nk)2eff=(nk)2。由于秘密应该随机生成,我们最终得到一个统计上预期的汉明重量约为 50%,或者不同地 k=⌈n/2⌉k=⌈n/2⌉或 k=⌊n/2⌋k=⌊n/2⌋,这是一个最大化 effeff 的值。此外,随机生成的秘密落入平凡情况的概率可以忽略不计。例如,猜测 128 位秘密密钥的统计预期工作量将是 (12864)2(12864)2,这是无法达到的。

侧信道攻击,正如 Kocher 最初所描述的,采用分而治之的策略,逐个猜测秘密的比特,并借助统计启发式方法进行指导。在攻击的任何阶段,攻击者都拥有对 bb 比特秘密的当前猜测,并试图正确猜测下一个比特 b+1b+1。攻击者知道一组输入消息及其对应的测量值。此外,他们还模拟了所有输入消息中前 bb 个猜测比特的计算时间。为了以高概率正确猜测下一个比特 b+1b+1,攻击者计算了 b+1b+1 比特模拟执行时间的统计方差。如果 b+1b+1 的猜测正确,方差将减小;如果错误,方差将增大。方差是帮助攻击者逐个确定秘密密钥值的预言机。

上述方法存在其他变体,它们在准确性、通用性等方面提供了不同的权衡

微架构攻击

微架构攻击是一种利用进程间共享硬件组件的信息泄露进行侧信道攻击的攻击类型。泄露的来源示例包括缓存内存和分支预测组件。在此,我们将分享一个示例来展示基于缓存的攻击,即缓存时序攻击。缓存时序攻击存在多种不同变体,主要类型包括 FLUSH+RELOAD、PRIME+PROBE 和 EVICT+TIME。

让我们快速且简化地了解缓存的工作原理。主内存位于 CPU 外部,它容量大但速度慢,而位于 CPU 芯片内部的缓存内存则容量小但速度快。主内存被划分为多个块,这些块映射到缓存地址(这是简化的描述,读者可查阅组关联缓存获取更准确的描述)。每当 CPU 需要访问主内存中而缓存中不存在的地址内容时,它将相应的内存块加载到缓存中。

缓存时序攻击依赖于内存访问时间在从缓存获取数据与从主内存获取数据之间呈现的差异。攻击者可以预先准备缓存,迫使受害进程从主内存获取特定数据,然后在受害进程完成操作后,通过尝试访问相同的缓存行/组来检测访问,并测量所需时间,从而推断受害进程是否访问了特定地址。如果这些数据的地址与一个秘密值相关联,那么攻击者就能发现这个秘密。

例如,假设受害者进程使用第三方库来调用 AES。假设 AES 实现使用查找表来处理 S-box,并且这些表跨越了多个缓存行/组。由于查找表是常量,它们的地址在库的二进制文件中预先映射到执行(我们以简化的系统视图来假设,不考虑地址随机化等)。攻击者可以在受害者调用 AES 时使用 FLUSH+RELOAD。这要求攻击者在 AES 轮次调用之前刷新相关的缓存行/组,然后等待受害者进程执行 AES 轮次,最后访问查找表并测量访问所需的时间。如果测量的时间被认为较低,则表明受害者访问了与该缓存行/组对应的地址,如果被认为较高,则表明没有。由于 AES S-box 通过密钥的字节来寻址,攻击者可以通过多次测量推断出密钥的值。

需要详细阐述微架构攻击的攻击模型。这些攻击不需要物理访问权限。所需的权限可以低至零。由于缓存被进程、虚拟机、虚拟机监控程序甚至安全隔离区共享,攻击者只需要与同一硬件共处,而不一定需要在同一虚拟服务器上。在所有情况下,攻击者都应该有办法获取时间测量数据,无论是通过时间原语还是通过其他技术( 有时相当有创意的技术 )。攻击者还需要办法操纵缓存,并且根据可用的方法,这可能影响所需的权限。

对抗策略

在探讨不同的反制措施之前,重要的是要讨论解决这个问题的实际方法:移除物理量与敏感数据之间的依赖关系。

在时序攻击的背景下,这个解决方案意味着要使算法对于秘密的不同值都执行相同的时间量。在示例 1 中,我们可以比较输入和正确密码的所有字符。这看起来可能像:

fn check_password(in_pwd: [u8], pwd: [u8]) -> bool {

if len(in_pwd) != len(pwd) {

return false;

}

let result = true;

for i in 0..len(pwd) {

result = result && (in_pwd[i] == pwd[i]);

}

return result;

}

在示例 2 中,我们可以模拟 if 选择逻辑,而不会受到时序变化的影响:

fn sign(m: Message, d: SecretKey) -> Signature {

let x = m;

for i in len(d)-1..0 {

x = x^2 mod n;

x = d[i] * some_operation(x,m) + (1-d[i]) * x;

}

return x;

}

缓存时序攻击中的一个解决方案可能是将数据适配到缓存行中,这些数据由密钥的部分地址所指向,或者,加载所有可以通过从密钥派生的值来寻址的数据到缓存中,而不管在每次特定的内存访问中需要哪些数据。

完全消除依赖是最有效的对抗侧信道的方法,但不幸的是,对于大多数侧信道来说,这通常成本过高,甚至是不可能实现的。在本节中,我们将概述常见的对抗措施。

反制措施的目标是使潜在攻击的成本足够高,以至于不值得攻击者付出努力和资源。成本和努力的量化是风险评估的结果,不在此篇文章的范围内。为了更结构化的呈现,我们将不同的反制措施分为4类,这些类别对应于侧信道分析的4个阶段。

针对设置阶段的目标反制措施通常包括隐藏探测点的机制,这些探测点需要攻击者付出额外努力才能到达,或者检测攻击者存在的机制。一些针对物理攻击的隐藏例子包括使芯片引脚无法访问、使用诱饵和屏蔽。通用的检测方法可能包括物理防篡改机制,如保险丝和预设按钮。对于远程和纯软件侧信道攻击,有一些依赖行为分析的检测机制被提出。

除了通过削弱或屏蔽侧信道源来减少信号之外,在获取阶段很难引入许多障碍。

通过添加噪声(尽管效果不佳),处理阶段可能会变得更困难。引入错位也会增加处理工作量。错位可以被视为抖动;在跟踪中看到的不同事件并非在同一时间点发生,甚至整个跟踪都可能时间上发生移动(相对于触发点)。

最后,更重要的是,针对分析阶段的反制措施包括引入虚假操作,这会导致引入无用信息,并采用去相关技术,如遮蔽和掩码,以减少侧信道泄露的有用信息量。虚假操作应尽可能与真实操作难以区分,以最大化效果。遮蔽是一种技术,其中敏感数据与一些随机数据相结合,并将结果用作秘密输入。当算法完成后,执行一个去遮蔽操作以获得算法的实际结果。遮蔽的效果是侧信道泄露被遮蔽秘密的值。如果攻击者获得了被遮蔽的秘密,它仍然需要遮蔽值才能推导出实际秘密。如果遮蔽值是周期性随机选择的,那么不同的轨迹组指的是不同的被遮蔽秘密,从而使其更难获得被遮蔽的秘密,甚至从一开始就难以获得。

没有通用的方法来衡量反措施的有效性。一些指标包括反措施增加获取相同信息所需的追踪数量程度、攻击者必须额外采取的步骤数量,以及击败反措施所需的工具、设备和知识的复杂程度。

必须注意保护反制措施本身。例如,如果使用盲化但盲化是可预测的或容易获得的,它将无效。有时也可以对反制措施应用侧信道攻击,例如绕过盲化操作的故障攻击。

通常使用一系列反制措施是好的,因为攻击的复杂性可以相对于实施它们的成本以有利的不成比例的方式提高。

侧信道分析下的安全评估

结束关于 SCA 的讨论,我们探讨在考虑 SCA 的情况下进行安全评估的话题。快速回顾一下,SCA 的用途是从物理量的测量中检索秘密信息。测量需要在使用秘密信息的计算执行时并行进行。

在这里我们将采用基于资产的安全评估。这一选择源于我们已明确定义了资产,即秘密。可以首先生成一个资产注册表,其中列出了所有秘密值。下一步将是识别秘密被使用的点,这些点是潜在的 SCA 暴露点,我们将称这些点为感兴趣点(PoI)。PoI 应与针对它们的可行 SCA 类型一起保存。

接下来,使用一个包含攻击者画像(列出攻击者的能力)的威胁模型,可以对兴趣点(PoI)进行排名(并排除),从而帮助优先安排安全工作。

此时,我们关于兴趣点对侧信道攻击(SCA)敏感性的信息大多是基于假设,而非可靠结果。一个可行的方向是进行侧信道分析,具体评估系统的安全级别。另一个选项是进行根本原因分析,尝试估算安全级别。

第一种选择通常能提供更多信息,因为它考虑了攻击者的努力和才智。在这次分析中,分析师扮演攻击者的角色,在给定的限制条件下进行操作,这可以揭示仅通过系统分析无法识别的漏洞。采用这种方法,可以考虑到并评估更广泛的应对措施,因为 SCA 的所有 4 个阶段都得到了执行。这通常是成本最高的方法。

在攻击参数可以通过审查系统的实现和部署来清晰且系统地量化时,第二种选择更有意义。这通常发生在目标点(PoI)直接暴露且相对独立于系统其他部分时。这种方法将提供有助于决定针对 SCA 分析阶段反制措施的信息。

无论采用哪种方法,我们都应该最终决定使用哪些反制措施。最后,在实施反制措施后采取的最佳步骤是重新评估安全级别,通过另一轮 SCA 来实现,这次 SCA 也将包括攻击反制措施本身。

希望经过所有这些努力,您的系统应该是相对安全的。无论如何,您应该保持警惕,注意可能影响系统的任何变化,并定期查看资产登记册和兴趣点,以确保一切保持安全。

区块链解决方案中的侧信道分析

区块链系统面临独特的侧信道分析:

如同所有使用密码学的系统一样,区块链解决方案容易受到侧信道攻击(SCA)的影响。区块链领域与其他采用密码学的行业在某些方面有所不同。大多数解决方案依赖于符合标准的密码学原语,而区块链则倾向于使用新颖的密码学。这为攻击者和安全工程师创造了不同的动态。由于针对标准化原语的侧信道攻击已有大量前期工作和知识体系,攻击者只有有限但众所周知的选择。区块链不一定遵循这一路径,这可能会迫使攻击者投入更多精力去发现攻击向量。同样的情况也适用于反制措施;标准化原语有成熟的选择供安全工程师使用,而较新和新颖的密码学则没有足够的时间来追赶。这为针对较新密码学的侧信道漏洞出现提供了更多可能性。 此外,虽然市场上已有现成的针对标准化原语的抗侧信道实现方案,但对于新型密码学而言情况并非如此。这使得保障新型密码学在区块链项目中的实现安全成为这些项目的责任。

区块链中 SCA 应用的一个直接例子是通过攻击钱包来获取账户的私钥。针对软件钱包和硬件钱包发起 SCA 攻击的方式有所不同,但两种类型都存在漏洞。攻击者可以绕过密码安全检查,立即使用钱包或提取并使用账户的私钥。虽然这个例子与区块链相关,但它并非针对区块链解决方案本身,而是针对单个用户。一般来说,系统中任何使用密钥的环节都是 SCA 的潜在目标。我们 Anoma 项目中的一个例子是验证者通过采用交易阈值加密提供的反做市保护。密钥在验证者之间分片分发,执行加密操作需要达到共识。攻击者从验证者那里提取足够的密钥分片后,可以成功破解交易加密。假设密钥在本地没有得到良好保护,攻击者可能会尝试入侵验证者服务器并获取密钥。 如果系统容易受到侧信道泄露的影响,攻击者将不需要进行入侵,而是通过测量网络响应时间(如果它们以某种方式依赖于密钥值)或与它们共位并尝试进行微架构攻击。根据其他因素,攻击者可能会发现发起侧信道攻击更容易或更具可扩展性。

另一个例子是利用元数据(如交易执行时间、参与者距离等)来破坏屏蔽池的隐私。使用这些数据的攻击者,例如,可以根据某些行为模式尝试找出源自同一账户的屏蔽交易,或者根据交易元数据与外部事实信息之间的关联来识别某个个体为账户的所有者(例如,Alice 上周五下午 5:12:53 买了咖啡,并且只有一笔交易是在这个特定时间进行的)。

最终思考

侧信道攻击是攻击加密实现的一种有力工具,可能影响区块链解决方案的安全性。这也是一个活跃的研究领域,倾向于产生新的、创造性的攻击方式。区块链项目可以通过关注该领域的最新研究,并在其安全评估中包含侧信道分析来受益。

由 George Gkitsas 撰写,他曾是 Heliax 的零知识密码学研究与协议开发者,以及构建 Anoma 协议的团队一员。

如果你对零知识密码学和 Rust 中的前沿密码协议工程职位感兴趣,可以查看 Heliax 的开放职位 。