2022年06月28日
芯片在运行的过程中存在光子的泄露现象,这一现象可能造成安全芯片的密码泄露。为探索光子侧信道设备对密码算法的攻击方法与效果,以AES算法为目标,实施此实验。
光子侧信道攻击主要分为两个步骤:第一步是芯片运算过程中的微光成像,利用微光成像图确定敏感信息的空间位置;第二步是光子信息泄露采集,利用单光子探测器采集敏感位置的光子泄露信息,根据光子泄露信息分析算法密钥。
此次测试使用的芯片为已开封的ATmega 328P(本文中,均简称为328p)。关键参数如下:AVR 8 bit微控制器、2KB SRAM(由4个bank组成,每个bank 512字节)、32KB flash。参考论文《Simple Photonic Emission Analysis of AES》中的实验,攻击目标选择软件实现的AES 128算法,AES的S盒以全局变量数组的方式实现。算法的S盒存储在SRAM的一段地址空间内,我们编写测试代码读取S盒中的数据,通过微光成像技术可以确定S盒在芯片SRAM中的位置。一般而言,SRAM的行driver具有较大的电流,对应的光子泄露也更明显,所以在S盒占用的空间中选定一个SRAM行driver位置,测试AES运行过程中的光子泄露。
选择全景拍摄功能,开启拍摄灯光,在亮场条件下用5倍镜拍摄芯片版图如图 1所示,芯片的亮场全景图的中央占据较大面积的方形模块是flash,在flash的右上部是一个窄长条形模块,该模块为SRAM。
图 1 5倍镜亮场全景图
在黑盒测试的条件下,由于对SRAM地址分布完全未知,需要以二分法确认SRAM的地址分布情况。以328p芯片为例,通过328p芯片手册可知SRAM的地址空间分布为0x100到0x8FF。黑盒条件下的推荐进行如下测试:
读取0x100,拍摄暗场图,确认起始地址位置
读取0x8FF,拍摄暗场图,确认终止地址位置
读取0x500,拍摄暗场图,确认中间地址位置
读取0x300,拍摄暗场图,确认从起始地址开始的512字节位置
读取0x200,拍摄暗场图,确认从起始地址开始的256字节位置
读取0x180,拍摄暗场图,确认从起始地址开始的128字节位置
从以上暗场图中可以获知SRAM地址分布的概况,如果需要了解SRAM地址更细节的分布情况,可以设置一个步进值,比如设置128字节。分别测试0x100、0x180、0x200、0x280、0x300、0x380、0x400、0x480、0x500、0x580、0x600、0x680、0x700、0x780、0x800、0x880的暗场图就可以获知较为详细的SRAM地址分布情况。
论文《Functional Integrated Circuit Analysis》中给出了328p的SRAM地址分布如图 2所示。因此,此次实验没有重复上述步骤,读取SRAM地址的数据时拍摄到的暗场图可以通过1.3节的实验观察到。类似地,可以测试出一行SRAM占用的字节数:328p每行占8个字节。故328p芯片2kB的SRAM由4个bank组成。每个bank大小是512字节,每个bank由64行每行8字节组成。
图 2 328p的SRAM地址分布
图 3 AES测试代码打印出的结果
编写代码打印S盒的首地址,发现在此次测试中的首地址为0x0101。结合图 2可知,地址0x0101所在的行地址范围是0x100~0x107。下表列出了从0x100开始的连续12行的地址范围。
表 1 从0x100开始的连续12行的地址范围
行数 | 首地址 | 尾地址 |
1 | 0x100 | 0x107 |
2 | 0x108 | 0x10F |
3 | 0x110 | 0x117 |
4 | 0x118 | 0x11F |
5 | 0x120 | 0x127 |
6 | 0x128 | 0x12F |
7 | 0x130 | 0x137 |
8 | 0x138 | 0x13F |
9 | 0x140 | 0x147 |
10 | 0x148 | 0x14F |
11 | 0x150 | 0x157 |
12 | 0x158 | 0x15F |
为了精确定位S盒在芯片版图中的位置,编写程序循环读取SRAM中0x100和0x10A两个地址的数据并写入到0x500地址中。移动三轴平台,使5倍物镜对准SRAM区域,设置暗场曝光时间为1.5h,拍摄亮场图和暗场图。SRAM亮场和暗场图分别如图 4(a)和图 4(b)所示。图 5是SRAM亮场图和暗场图的叠加,这种叠加图用于确定SRAM地址在版图中的位置。从SRAM暗场图中可以看出在SRAM区域有两个亮行(实际上是三个亮行,由于5倍物镜分辨率低,不能很好的区分相邻的两行),与读取的0x100和0x10A地址区域、写入的0x500地址区域有关。
需要注意的是,无论读取还是写入一个字节的数据都会拍摄到一整行的SRAM发亮,这是因为SRAM的电路结构决定了无论SRAM行内的哪个字节被选中,都会使该行driver驱动的字线信号有效,引起一整行都发出光子。
对比图 2和图 4(b)可以看出,将图 2旋转180度后与图 4(b)的暗场图形状基本一致,因而判断图 4(b)红色方框标出的亮行对应的地址为0x100和0x10A,从0x100开始地址增加的方向是向下。
(a) 亮场图
(b) 暗场图
图 4 5倍镜SRAM亮场和暗场图
图 5 5倍镜SRAM亮场图和暗场图的叠加
为了确认亮行与地址的对应关系,将5倍物镜更换为40倍物镜,并使该镜头对准图 5中的红框位置。设置暗场曝光时间为1.5h,拍摄亮场和暗场图如图 6所示。从图 6(b)可以较为清晰的看出两个亮行。我们读取的是0x100和0x10A两个地址,写入的是0x500一个地址。由此判断,图 6(b)的两个亮行分别包含了0x100和0x10A两个地址。
(a) 亮场图
(b) 暗场图
图 6 读0x100和0x10A两个地址时的亮场图和暗场图
图 7 读0x100和0x10A两个地址时亮场图和暗场图的叠加
为了进一步确认地址增加的方向,修改程序为:循环读取SRAM中0x100、0x10A和0x114三个地址的数据并写入到0x500地址中,使用40倍物镜对准与图 7相同的区域,设置暗场曝光时间为1.5h,拍摄亮场图和暗场图如图 8所示,图 9是亮场图和暗场图的叠加图。观察图 6(b),读取0x100、0x10A和0x114三个地址引起三行SRAM发亮。对比图 9和图 7,发现图 9中的第三个亮行是新出现的。因此,第三个亮行包含了地址为0x114的SRAM。所以地址增加的方向是向下,这与我们前面的对图 4(b)的分析结果一致。
(a) 亮场图
(b) 暗场图
图 8 读0x100、0x10A和0x114三个地址时的亮场图和暗场图
图 9 读0x100、0x10A和0x114三个地址时亮场图和暗场图的叠加
增大曝光时间为8h,拍摄暗场和亮场图,此时我们使用的程序是循环读取0x100开始的连续128个字节并写入临时变量。二者的亮场图和暗场图如图 10(a)和(b)所示,叠加如图 11所示。观察图 10(b)中红框标出的亮点,这里应该是行driver的位置。但是,仔细观察发现两个亮行对应红框中的一个亮点。这与期望的每个亮行对应一个亮点不同,可能有两方面的原因:一是我们的暗场图是从芯片正面拍摄的(即芯片金属层),金属层的布线可能会阻挡行driver产生的光子辐射,因此每两行暴露出一个行driver;二是可能是两个行driver从同一个金属层的缝隙中反射出光子信号。
(a) 亮场图
(b) 暗场图
图 10 8小时曝光后的亮场和暗场图
图 11 8小时曝光后亮场和暗场的叠加图
S盒共有256个字节,在测试代码中从地址0x101开始,因此,S盒结束的地址为0x200。根据328p芯片的SRAM地址分布可知,图 11对应的SRAM bank中,从S盒起始行方向向下的半个bank空间均是S盒的数据。
从S盒对应的行driver中选择一个点作为攻击点,此次实验我们选择了从S盒开始行计算的第6个亮点,如图11中所示。该位置对应表 1中的第11行,由于不确定该亮点是第11行的驱动,还是第11行和第12行的驱动,慎重起见,我们将第12行也考虑进来,则与该亮点对应的SRAM地址范围是0x150—0x15F。S盒首地址是0x101,所以该亮点对应的S盒输入是0x4F—0x5E。
打开控制软件中的瞄准功能,移动三轴平台使十字中心对准图 11标出的单光子攻击位置。移动后拍摄的亮场图如图 12所示。
图 12 瞄准攻击位置
在时间维度上,我们选择的攻击目标是AES第一轮S盒的输入;在空间维度上,我们选择的攻击目标是S盒输入0x4F—0x5E所在行。对于第一个字节的密钥,假设输入是时,采集到对S盒输入0x4F—0x5E所在行的访问,则有
由此可以计算出的候选集合。
输入是时,采集到对S盒输入0x4F—0x5E所在行的访问,则有
由此可以计算出的候选集合。
输入字节遍历0—256,收集到所有对S盒输入0x4F—0x5E所在行进行访问的明文计算出对应的候选密钥。注意,这里的每个对应的都是一个候选密钥集合,求出这些候选密钥集合的交集,即为最终攻击出的密钥值/密钥候选值。
为减少测试时间,AES只运行第一次轮密钥加和第一轮的字节代替。输入16个字节的0x2E,循环执行轮密钥加和字节代替代码,在图 12中瞄准的攻击位置采集光子信号,采集时间为3h。得到的光子信号如图 13所示。图中横坐标为时间,纵坐标为光子数。图 13的红框中出现了尖峰,说明该时刻攻击位置对应的晶体管辐射出了较多的光子,光子数目明显高于噪声引起的光子数。所以,该时刻发生了对SRAM地址范围0x150—0x15F的访问,同时,也意味着发生了对S盒输入0x4F—0x5E的查表操作。故有
由此计算出该时刻的密钥字节候选值为
图 13 输入16个字节的0x2E时的光子信号
修改输入为0x30,重复上述实验采集到的光子信号如图 14。可以看到,与图 13相同的时刻处,仍然有尖峰出现。故有
由此计算出该时刻的密钥字节候选值为
图 14 输入16个字节的0x30时的光子信号
修改输入为0x31,继续重复上述实验采集到的光子信号如图 15。可以看到,与图 13相同的时刻处,仍然有尖峰出现。故有
由此计算出该时刻的密钥字节候选值为
求和的交集,可得
图 15 输入16个字节的0x31时的光子信号
此次实验使用的AES密钥为‘0123456789abcdef’,对应的ASCII分别为 0x30, 0x31, 0x32, 0x33, 0x34, 0x35,0x36,0x37,0x38,0x39,0x61,0x62,0x63,0x64,0x65,0x66。第11个字节是0x61,与实验分析出的密钥值相同,表明以上攻击实验可以成功恢复AES一个字节的密钥。需要说明的是,在黑盒测试的条件下需要将输入字节从0到255遍历。
以上测试均使用OSR自主研发的光子侧信道分析平台(PSCA)系统,本平台采用优化后的专利光路设计,具有优秀的采集效率、精准的采集范围。核心器件全部为业内顶尖进口型号,性能超群。全系统配备独立黑箱、自动控制功能,使用门槛大大降低,适合常规实验室使用。
Copyright 2018. Open Security Research, Inc. All rights reserved. 粤ICP备18045701号