什么是 SCARE(侧信道攻击逆向工程)?

逆向工程 硬件 物理攻击 智能卡
2021-06-21 22:23:50

在逆转智能卡时,众所周知旁道攻击对硬件非常有效。但是,它是什么,它可以用于软件逆向工程以及如何使用?

1个回答

旁道攻击”定义了任何将考虑非预期和/或间接信息通道以达到其目标的技术。它首先在智能卡密码学中定义,用于描述利用卡上嵌入式芯片无意中泄漏的信息的攻击,这些攻击可用于检索密钥和数据。例如,它可能被监控使用:

  • 执行时间(定时攻击):区分执行了哪些操作并猜测,例如,选择了代码的哪个分支(以及测试的值)。

  • 功耗(电源监控攻击):精确区分已执行的指令序列并能够重组变量的值。请注意,存在多种使用相同输入但分析方式略有不同的分析技术。例如,我们可以列出:单功率分析(SPA)、差分功率分析(DPA)、高阶差分功率分析(HO-DPA)、模板攻击……

  • 电磁辐射(电磁攻击):与功耗密切相关,但也可以提供功耗中没有的信息,尤其是在 RFID 或 NFC 芯片上。

如果您对学习如何利用这些信息更感兴趣,那么我建议您从阅读Power Analysis Attacks 开始不要因为这本书是关于智能卡的事实而“害怕”。大多数信息也适用于“普通”(SoC)嵌入式设备的一对一。

忘了提及有一个名为OpenSCA 的开源平台和一些名为 FOBOS(用于侧信道的灵活开源板)的开源硬件,我似乎无法在家中找到正确的链接。

在软件逆向工程中的应用

现在说到侧信道攻击在软件逆向工程中的应用,几乎所有的攻击都会依赖于使用非故意或间接的信息泄漏。最近最好的例子是Jonathan Salwan 的这篇文章描述了他是如何通过使用Pin计算在各种输入上执行的指令数量来猜测破解密码的

更广泛地说,这种技术长期以来一直在软件逆向工程中使用而没有命名,或者可以改进许多分析。基本思想是首先考虑如果一个软件太晦涩而无法快速理解,我们可以将其视为一个黑盒,并考虑使用侧通道技术通过引导试错来猜测封闭的数据技术。

软件逆向工程中可用的边信道列表比我们在硬件中的要长得多。因为它包含了之前的列表并添加了一些新的频道,例如(非详尽列表):

  • 指令计数:允许根据输入识别不同的行为。

  • 读/写计数:同上,有更多的可能性来识别模式,因为它也包括指令读取。

  • 引发的中断计数:根据引发的中断类型、时间和方式,您可能会识别不同的行为,并能够确定实现目标的良好路径。

  • 访问指令地址:允许重建在精确时刻处于活动状态的程序部分。

  • 访问的内存地址:允许重建存储或访问在内存中的数据模式或复杂的数据结构(例如在堆中)。

该列表远非详尽无遗,但基本上可以使用 Valgrind VM 或其他工具来执行此类分析并快速推断有关给定程序行为的信息,从而加快逆向工程。

混淆和可能的对策

尝试构建能够抵御此类攻击的软件也将从智能卡行业借鉴很多。但是,不仅如此。这里有一些我能想到的技巧(但我们能找到的还远远不够完整)。

装甲计划分支

指令计数非常有效地检测代码中采用了哪个分支,如下所示:

if (value)
   ret = foo();
else 
   ret = bar();

随着foo()bar()具有不同指令数。

这可以通过执行foo()bar()无论如何value然后决定 的值来解决ret

tmp_foo = foo();
tmp_bar = bar();
if (value)
  ret = tmp_foo;
else
  ret = tmp_bar;

这种技术使您的程序更难从旁道攻击中猜测出来,但效率也低得多。必须找到适当的权衡。

对抗定时攻击

定时攻击非常容易执行且难以解决,因为sleep()它不是一种选择(太容易在代码中检测到,无论如何你不能假设处理器的特定速度)。程序员必须确定他的程序每个分支的执行时间,并用额外的无用操作平衡每个分支,这些操作的计算能力与来自其他分支的操作​​相同。重点是仅根据执行时间使每个分支与其他分支无法区分。

线程疯狂

另一种稀释旁道的方法是大规模多线程你的程序。想象一下,你的程序的每个分支都在一个单独的线程中执行,一个变量告诉当前程序实际上是在哪个线程中(如果可能的话,以一种神秘的方式)。那么侧信道分析将更加难以执行。

结论和进一步研究

侧信道攻击在软件逆向工程中被广泛低估,它可以极大地加速许多程序的逆向。但是,与此同时,混淆技术存在并且必须专门针对软件逆向工程而开发。因此,如果您看到与该领域相关的新事物越来越多,请不要感到惊讶。