在逆转智能卡时,众所周知,旁道攻击对硬件非常有效。但是,它是什么,它可以用于软件逆向工程以及如何使用?
什么是 SCARE(侧信道攻击逆向工程)?
“旁道攻击”定义了任何将考虑非预期和/或间接信息通道以达到其目标的技术。它首先在智能卡密码学中定义,用于描述利用卡上嵌入式芯片无意中泄漏的信息的攻击,这些攻击可用于检索密钥和数据。例如,它可能被监控使用:
执行时间(定时攻击):区分执行了哪些操作并猜测,例如,选择了代码的哪个分支(以及测试的值)。
功耗(电源监控攻击):精确区分已执行的指令序列并能够重组变量的值。请注意,存在多种使用相同输入但分析方式略有不同的分析技术。例如,我们可以列出:单功率分析(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()
它不是一种选择(太容易在代码中检测到,无论如何你不能假设处理器的特定速度)。程序员必须确定他的程序每个分支的执行时间,并用额外的无用操作来平衡每个分支,这些操作的计算能力与来自其他分支的操作相同。重点是仅根据执行时间使每个分支与其他分支无法区分。
线程疯狂
另一种稀释旁道的方法是大规模多线程你的程序。想象一下,你的程序的每个分支都在一个单独的线程中执行,一个变量告诉当前程序实际上是在哪个线程中(如果可能的话,以一种神秘的方式)。那么侧信道分析将更加难以执行。
结论和进一步研究
侧信道攻击在软件逆向工程中被广泛低估,它可以极大地加速许多程序的逆向。但是,与此同时,混淆技术存在并且必须专门针对软件逆向工程而开发。因此,如果您看到与该领域相关的新事物越来越多,请不要感到惊讶。