记录黑客技术中优秀的内容, 传播黑客文化,分享黑客技术精华

使用DFA攻击硬件的AES算法,并从PlayStation Vita中提取硬件密钥

2019-03-13 12:20

在过去的几个月里,我一直试图从PlayStation Vita中提取硬件密钥。为此我还专门写了一篇论文,里面详细介绍了我所使用过的所有的技术细节和理论依据,感兴趣的读者可以点此详细了解。本文是对具体的操作过程进行讲解,为大家提供一个直观地理解。

注:PlayStation®VITA是索尼的一代掌机,简称PS Vita、Vita或PSV,以下我会将PlayStation Vita统称为PSV。

DFA

DFA全称为:Deterministic Finite Automaton,即确定有穷自动机。其特征为:有一个有限状态集合和一些从一个状态通向另一个状态的边,每条边上标记有一个符号,其中一个状态是初态,某些状态是终态。但不同于不确定的有限自动机,DFA中不会有从同一状态出发的两条边标志有相同的符号。

高级加密标准(AES)算法具有抗差分和线性攻击能力,却容易受到故障攻击,该攻击对密码系统破坏较大。

DFA的主要思想是:我们可以像在处理器上一样对AES硬件使用故障攻击,但是我们不使用它来控制代码执行,而是使用它来使用正确的密钥进行错误的AES加密。由于AES是一种脆弱的算法,稍作修改会导致它以非正常的方式泄露有关密钥的信息,而我们正是利用了这一算法的弱点。

不过,目前除了学术界对“针对AES解密的DFA攻击方法”有研究外。实际的应用案例并不多,在我们对Github进行了搜索后,我们只发现了两个严重的AES DFA攻击实现示例。 dfa-aes是2009年一个实现示例,其中经过8个周期和2的32次暴力破解,可以产生准确的AES-128密钥。 2002年至2016年期间,虽然有很多人发表了许多相关的论文,描述了相关的故障攻击。但是,我们无法找到这些论文附带的任何源代码示例。最后,我们从phoenixAES中找到了相应的源代码,尽管它们不是最先进的(文献中的大多数代码在实践中并没有多大意义)。因为编写代码很无聊且需要花费很长时间,所以这个示例是很有意义的。

撇开这个问题不谈,完成攻击的主要的工作是完善我们的故障设置,以便在8周期的暴力破解中向AES引擎(AES engine )注入精确故障,比如故障不超过一个字节。一旦我们的故障设置完成,我们就可以将收集到的样本置入phoenixAES或dfa-aes。使用DFA攻击硬件的AES算法,并从PlayStation Vita中提取硬件密钥

DPA

在介绍我们如何布置DFA故障的设置之前,我们有必要向介绍一下对PSV的DPA攻击。差分功耗分析(Differential power analysis)是一种边信道攻击,如果攻击者在使用密钥操作时观察AES引擎的功耗,就可能找到泄漏的密钥。首先,攻击者会假设一个密钥值。然后,他们定义AES引擎的功耗使用模型,以预测密钥值在假设正确的情况下会消耗多少功耗。最后,使用该密钥值运行引擎并测量实际功耗以查看预测的准确性。通过多次重复,就可可以找到整个密钥。 Chipwhisperer wiki对差分功耗分析的运行过程进行了很好的介绍,你可以点此查看。

为了在要攻击的目标上执行DPA,你需要能够精确测量芯片中的电流(current)。一种方法是应用法拉第定律:变化的磁场会产生电压。你可以使用“磁探针”测量电流.Colin O'Flynn在Blackhat中描述了如何构建自己的磁探针,我按照他的办法构建了一个,使在其上运行ChipWhisperer示例。

1.jpg

不幸的是,上图所示工具的环状大小决定了测量的精确程度,且一个好的工具非常昂贵。而测量电流的另一种方法是应用欧姆定律:通过电阻的电流变化等于通过电阻的电压变化。这需要修改电路,以在电源和目标芯片之间引入小的电阻器。

随着芯片消耗更多功耗,它将需要更大的电流,这导致电阻器两端的电压下降更大。为了利用并联电阻测量,我们需要先将PCB中从电源到目标芯片的线切断。然后我们将目标芯片连接到我们的定制电路板,该电路板有一个分流电阻和测量探针端口。我们使用外部电源为电路板供电,其实我们可以使用Vita自带的电源,但它更容易连接外部电源。

2.jpg

自定义设计的psvcw板有一个分流电阻,一个滤波电容器,以及用于差分探针和CW glitcher的端口,顶部还有探测eMMC信号到目标芯片的电线。我们使用它们将有效载荷闪存到eMMC,并触发电压故障以获得代码执行。

3.jpg

外部电源连接到psvcw

然而,即使使用并联电阻法,我们也无法获得良好的信噪比(SNR或S/N,是指一个电子设备或者电子系统中信号与噪声的比例)。我们观察到,在AES加密期间,SRAM读写操作在功耗跟踪中占主导地位(涉及多个幅度),因此很难找到跟踪和密钥之间的任何相关性。由于PSV的SoC是为低功耗而设计,所以我们确定DPA有确切设置,如果要获得提高信噪比所需的正确设备,成本将会太高。

4.png

在0-50个周期内,会开启触发GPIO信号,在250-350个周期内,进行AES操作。到第600个周期时, GPIO会关闭,整个过程中的小幅度下降可能是F00D处理器操作引起的。

尽管名称相似,但DPA和DFA完全不相似。 DPA是(被动)侧通道攻击,而DFA是(主动)故障攻击。然而,所有尝试DPA的工作都没有白费。首先,我们获得了关于AES操作发生时间的宝贵信息。通过将单个AES操作的跟踪与我们收集的其他跟踪(即没有AES操作或有多个AES操作)进行比较,我们可以得出结论,AES操作发生在触发后功耗在250-350个周期下降的地方。为此我们对PCB进行了修改,在测量中插入了一个并联电阻并降低了信噪比,这也同时满足了我们更精确的对故障进行设置的目的。这一点很重要,因为在以前,我们的攻击目标是在安全处理器出现故障时,获得代码执行。为了到达这个效果,可以在多个周期中出现故障。由于AES引擎在每个周期执行4次操作,且都引起了电压高峰,为了不被目标设备的配电网络过滤掉,插入了一个并联电阻是很有必要的。

PlayStation Vita的安全架构

为什么攻击者会对来PSV如此有兴趣呢?因为PSV是一种非常独特的设备,可以独立实现许多安全功能。且该设备于2012年发布,要知道当时大多数Android手机还没有基本的漏洞利用缓解措施,例如启用地址随机化,而它的直接竞争对手(3DS)在硬件和软件安全方面都与它差几个等级。

PSV操作系统是完全专有的,其中一些代码来自NetBSD(一个完全开放源代码的类UNIX系统),另一些代码来自索尼PSP。在大多数设备运行BSD,Linux或某些RTOS的世界中,作为一名逆向工程师,看到新的操作系统总是令人兴奋的。但专有并不意味着安全,虽然很难找到转储内核的原始漏洞,但我们在2013年利用了几个NetBSD衍生模块进行了尝试分析,发现其中的代码并不是安全的,而是晦涩难懂的。然而,值得称赞的是,整整一年都没有人能够攻破这些内核,即使在我们分析了它之后,也没有人能够在接下来的三年里做到这一点(直到我们发布了一个越狱版本)。内核本身具有所有针对缓冲区溢出攻击的标准缓解和针对泄漏地址的保护,另外,它还有一些在当时看来非标准的缓解措施,如SMAP和系统调用防火墙。 PSV也使用了ARM TrustZone,但在Android手机将所有秘密存储在TrustZone中的时候,PSV只使用TrustZone作为缓冲区来连接F00D安全处理器。只有TrustZone可以直接与F00D处理器通信,但TrustZone本身没有秘密,事后看来这是一个好的安全措施。

Bigmac

如果我们想要了解内容(游戏、数据、固件、更新等)是如何解密的,我们必须查看F00D处理器,它是一个处理所有加密和关键安全任务的处理器。 F00D运行在一个基本上没有文档的架构上,但我们能够在适当的时候破解它。然而,即使是攻击F00D也不足以完全破解这个系统。 F00D代码中有许多加密密钥,其中最重要的密钥(包括引导加载程序的密钥)隐藏在芯片中,只能通过我们称之为Bigmac的硬件AES引擎才能访问它们,其中有250个这样的密钥槽(keyslot)。这些密钥中有30个被称为“元密钥”或“主密钥”,因为Bigmac只允许使用它们将数据加密到另一个密钥槽即导出密钥,无法直接使用主密钥加密数据并查看密钥。

在执行引导加载程序之前,大多数密钥槽(包括所有主键)都被锁定,这意味着只有启动ROM才能在Bigmac中使用它们。因此,总结一下,要对AES进行攻击,我们必须要逐一完成以下过程:

1.让WebKit(一个开源的浏览器引擎)获得初始执行权限;

2. 破解ARM内核;

3. 破解ARM TrustZone;

4. 破解F00D内核;

5.利用F00D引导ROM;

为此,我们从头开始研究,除了利用F00D引导ROM(这个过程得依赖软件漏洞)之外,用了六年的时间来完成整个过程。利用这些知识,黑客足以入侵ARM内核,运行自制程序和mods,以及盗版游戏。6年前,我为自己设定了一个任意目标:获取引导加载程序的解密密钥。当时我的想法是,如果我们能够解密第一个可加载的代码,那么索尼就无法在未来的更新中隐藏代码。后来,这个密钥还专门获得了一个名称:slot 0x208(一个元密钥)。

故障攻击和DFA

之前,我讨论了如何使用电压故障在F00D安全处理器上获得启动时代码执行。这和 DFA有什么关系呢?因为大多数密钥槽在引导ROM退出到引导加载程序之前被锁定,所以我们需要在接管引导ROM之后执行DFA攻击。为此,我们必须使用我们之前发现的相同故障参数重复F00D上的电压故障攻击。之前,我们执行的有效载荷只是转储引导ROM,但现在已经被RPC取代,所以我们可以通过ChipWhisperer的串行接口从PC控制Bigmac。一旦这个RPC有效载荷运行,我们就可以使用不同的触发信号和不同的参数执行第二个故障攻击,从而导致Bigmac AES出现故障。这里的主要任务是找到第二组参数,一旦我们拥有它们,就可以通过使用RPC发送Bigmac命令、触发故障、下载由故障泄露的密钥。有了足够的密钥,就可以执行DFA攻击来提取密钥。

5.jpg

psvemmc板会收集来自PSV PCB的所有必需信号,包括用于eMMC触发(电路板背面)、时钟(取代PSV自己的时钟合成器芯片),UART,电源,复位和GPIO触发(重新路由LED信号)。它还有一个开关,可以启用eMMC闪存模式,该模式使用USB2244和一个电平转换器来支持通过USB的1.8V eMMC闪存。

6.jpg

现在,提取密钥的一切准备工作都完成了。

分析由故障泄露的密钥

为了将故障注入AES操作,我们使用RPC来切换GPIO引脚并立即启动Bigmac。 GPIO切换设置参考点并用作glitcher的触发器。在执行第二个故障之前,我们需要在触发后等待几个周期。从上面的功耗跟踪中,我们可以了解到,在250到350个周期之间会发生AES加密。当我们尝试在偏移240-280处引入故障时,我们会得到由故障导出的密钥。但是,我们并能确切知道经过多少个周期,且有多少字节被破坏。回想一下,为了使用phoenixAES,我们需要两个由故障而导出的密钥,且每个密钥在第8个周期都有一个字节被破坏,但他们却是不一样的。

为了弄清周期偏移与AES故障之间的关系,我们可以将已知密钥注入给Bigmac并尝试加密一个已知的明文,然后我们再使用已知密钥解密由故障导出的密钥。在解密的每一步中,我们都可以将状态矩阵与解密正确密钥的相同步骤进行区分。我们可以假设,在翻转的状态下,位数最少的步骤就是我们设法进行故障攻击的步骤。为什么?因为AES在设计上确保了一种称为扩散的特性。这意味着,平均而言,输入中的一个位翻转将导致输出中的半个位翻转。 AES中的每个步骤都尝试将状态的微小变化传播到尽可能多的位置。例如,假设我们设法在第5个周期的MixColumns之后立即注入故障,以便在字节0中翻转一个位,将0xAA更改为0xAB。在第6周期SubBytes中,字节0传递到S-Box,其中0xAA的输入产生0xAC的输出,但0xAB的输入产生0x62的输出。请注意,我们现在已经进行了5个翻转,继续第6个MixColumns,我们看到每个列都被加扰,这意味着4个字节现在是不同的。然后在第7周期ShiftRows中,将这4个字节中的每一个重新定位到不同的列,另一个MixColumns将对每个列进行更多的加扰。现在, 16个字节都不同。依此类推,我们很容易看出,当我们经历更多周期时,一个周期状态的微小变化将导致整个状态的巨大变化。

利用这种方法,我们可以在每个偏移量上收集许多有漏洞的密文样本,并查看每个偏移量对哪一周期的影响最大。这里的视频展示了这一工作原理:我们改变故障偏移量并触发故障,然后立即分析故障,以查看哪些周期受到影响,以及状态中的哪些位被翻转。

此外,我们还发现无论偏移量如何,我们的大多数故障只能影响一位或两位,这比所要求的(损坏一个字节)要好。

8.png

提取密钥

使用正确的偏移量,我们可以在第8个周期发现故障。很有可能,我们得到1-2位翻转,这符合phoenixAES的要求。但是,如果我们运气不好而且我们碰巧收集了两个由故障引发的密钥,其中已损坏的字节大于一位,我们怎么办?最好的解决方案是更改故障模型,我们正在使用的是Piret在2003年首次提出并在phoenixAES中实现的模型。但是,后来的模型允许最多12个字节的损坏(尽管有一些限制)。由于我们很懒,并且不想编写大量代码,因此不想更换新的模型。

提取AES-256密钥

到目前为止,我们只提到了提取AES-128密钥的方法。但是,将这个方法扩展到AES-256并不太难。经过测试,我们经过12周期的攻击就可以获得密钥。

9.jpg

完整的设置:psvemmc由USB供电,通过20针连接器连接到ChipWhisperer。 CW故障端口连接到psvcw,胶合在电路板底部,其中装有并流电阻。红色和蓝色线将外部1.1V电源连接到psvcw。最后,电池和USB连接器都是可以为PSV供电。

提取主密钥

到目前为止,所描述的一切都适用于非主密钥。回想一下,我们在前面说过主密钥不能用于直接加密内容,因为该过程涉及使用Bigmac将一些明文加密到另一个密钥槽。当然,解决此问题的一种方法是执行两级DFA攻击,但是,我们没有使用这个方法,因为我们已经知道Bigmac中有一个公开从密钥的硬件漏洞。Davee写了一篇关于这个漏洞如何运作的帖子,你可以看一下。简而言之,因为Bigmac在加密成功后没有清除内部状态,如果执行第二个加密大小< 16字节(AES)的块大小,那么它就会“借用”来自该内部状态的剩余字节。

总结

我们已经使用本文的办法恢复了30个主密钥,包括插槽0x208(插槽)密钥。

本文翻译自:https://yifan.lu/2019/02/22/attacking-hardware-aes-with-dfa/如若转载,请注明原文地址: http://www.hackdig.com/03/hack-54568.htm
知识来源: https://www.4hou.com/web/16507.html

阅读:22934 | 评论:0 | 标签:Web安全 硬件密钥

想收藏或者和大家分享这篇好文章→复制链接地址

“使用DFA攻击硬件的AES算法,并从PlayStation Vita中提取硬件密钥”共有0条留言

发表评论

姓名:

邮箱:

网址:

验证码:

公告

关注公众号hackdig,学习最新黑客技术

推广

工具

标签云