侧信道攻击——从喊666到入门之波形采集

作者:backahasten 0xFA

​在N久之前的上篇文章中,我们讨论了如何对已经采集好的能量轨迹进行侧信道攻击,但是,有个问题我挖了一个坑,就是如何对芯片的能量轨迹进行采集。今天我会讨论这个问题。

​本文会先介绍采集设备和相应的示波器使用和通信上的一些知识,之后介绍三种进行能量轨迹采集的方法和注意事项,并对比他们的优缺点,最后说一下我在采集中的噪音控制问题。

 

设备信息

采集设备

​ 目前,我可以使用的有三台示波器,一台USRP和一个Chipwhisperer,三台示波器的性能分别是:

品牌型号 模拟带宽 最大采样率 价格
梦源实验室 dscope20 50Mhz 200M 499
RIGOL DS1074 70Mhz 1G 2800
汉泰 DSO3254 250Mhz 1G 2400

​ 其中,dscope和汉泰dso3254是虚拟示波器,没有屏幕,需要使用usb或者网线连接电脑,使用电脑屏幕显示,而RIGOL DS1074是传统的示波器。USRP 型号是B210,由于超外差接收机结构,USRP有很大的频率覆盖范围。

​ 解释一下模拟带宽和采样率的问题。电路板和接口,由于物理原因,不可能容纳所有频率的信号,频率越高,在电路板上的衰减和失真程度越大。这样的话,示波器的模拟前端就等效为一个低通滤波器,当正弦波输入信号幅度衰减到 -3dB 时的频率就是标注的模拟带宽。模拟带宽直接决定了一个示波器可以测量的最大保真频率,当然是越大越好。

​ 最大采样率是指信号经过模拟带宽之后,进入了模数转换的阶段,这时候,模数转换系统会以采样率为频率对波形进行采样,由连续的波形编程离散的点,只有这样,才能进行后续的数字信号处理。对于正弦波,采样频率要不小于2倍正选波频率才能不失真的恢复出波形。

​ 举一个极端的例子,我要测量一个波形,这个波形中,有意义的频率分量最大是10Mhz,那么我的示波器模拟带宽不能低于10Mhz,采样率不能低于20M,只有满足这两点,才有可能完整保留有意义的信息。

滤波器

​ 上文中我们说“有可能完整保留”,是因为我们缺少了一个重要的部件,滤波器。我们的示波器的采样率是1G,也就是说最大只能恢复出500Mhz的正弦波。那么大于500Mhz的部分就会由于不完整的采样变成一些低频成分对信号产生干扰。虽然有模拟带宽等效滤波器进行了限制,但是如果采样时间超过了储存深度,示波器会进行采样率的主动下降。对于本文中的设备,50Mhz的低通滤波器就足可以了。

​ 一般来说,示波器也有带宽限制的功能,RIGOL DS1074 和 汉泰 DSO3254都有20Mhz的带宽限制,打开之后的效果可以等效为增加了低通滤波器。

探头与匹配阻抗

​ 另外一个部件就是探头了,探头的作用就是把数据引入示波器。探头也是有模拟带宽的,物理原因和示波器的模拟带宽一样。选择的时候带宽不要低于示波器。探头上有一个开关,两个挡位,X1和X10,X10挡位的带宽一般大于X1挡位,但是由于衰减,信号强度也会少很多,可以通过加放大器进行改良。

​ 匹配阻抗是传输线理论中很重要的概念,一般情况下,通信设备的匹配阻抗都是50欧姆(广电传媒通信中是75欧姆),而示波器的阻抗都是1M,部分高端示波器也有50欧姆的输出。如果使用了放大器,那么就要进行阻抗的匹配,可以使用阻抗转换器进行阻抗的匹配。接收时候,如果阻抗不匹配,会影响信号采集的质量。

 

实验设备

硬件配置

​ 本实验中,我使用了一个STC15的C51单片机运行AES128,芯片的封装图如下:

​ 由于其内置了起振电路和复位电路,所以电路板上只有芯片排针和采样电阻,如图:

 

采集方法

GND漏电流

​ 这种方法需要在芯片的GND引脚和真实0电位点中间串联一个小电阻(本实验中为10欧姆),之后测量这个电阻上的电压波动。本实验中如图所示:

获取的信号如图所示:

​ 这种方法获取到的信号是特别干净的,我们可以清晰的看见AES执行的九轮半结构(AES最后一轮没有MixColumns)。

​ 这种方法的缺点也是很大的,在实际的产品中,去除GND引脚的焊接,接入小电阻是十分困难的事情。这种方法一般用在可以直接供电的设备中,例如演示板或者各种接触式卡片。

芯片电压

​ 这种方法直接测量芯片的电压波动,探头连接在芯片的VCC和GND引脚:

​ 这种方法可以直接焊接上去,不需要进行拆焊这种高难度动作。相应的采集到的信号信噪比也会低一些,但是还是可以清晰的看出来AES128的轮结构:

​ 这种方法在信噪比和连接难度上都还可以,是比较好的一种方法。但是,对于多核SOC或者使用AES协处理器进行运算的情况,信噪比就会大大降低。

电磁波

​ 一个SOC中,每个核心或者协处理器是不可能做在一个位置上的,一定有物理上的距离,这样就可以使用性能优良的电磁探头进行采集。可以完成这种精度电磁采集的探头价格都在几万到几十万,同时需要微动台进行细微距离的移动(人手的精度就不用想了),由于穷,这种采集方法对我来说也就是,想一想。

 

其他注意事项

​ 最重要的体会就是,搞硬件安全真**费钱。

噪音控制

​ 在上一步的采集中,我们使用了在芯片VCC和GND引脚上的电压波动。如果仔细观察一下,就可以发现实际上测量的除了芯片上的电压,还有电源的噪音,这种情况下,电源的波纹会完整的混入采集信号中,所以要采用更好的供电设备,经过我的测试,断开充电器的笔记本电脑USB供电和稳压电源供电效果是比较好的,手机充电器USB供电和充电宝效果很差,要说电源波纹最好的,应该是iPower的电源适配器,标称可以达到1uA的波纹,但是价格也比较贵。这里有一个小窍门,如果想节约成本,可以使用干电池,它的的波纹特别小。

​ 对于其他方式的采集,对电源噪音的控制也要有考虑,特别是微弱信号的采集。同时,也要考虑50Hz工频噪音和日光灯镇流器的噪音。

​ 下图是我所在的实验室中,一个10CM左右导线上存在的干扰:

VISA与SCIP指令

​ VISA(Virtual Instrument Software Architecture,简称为”Visa”),即虚拟仪器软件结构,是VXI plug&play联盟制定的I/O接口软件标准及其规范的总称。VISA提供用于仪器编程的标准I/O函数库,称为VISA库。VISA函数库驻留在计算机系统内,是计算机与仪器的标准软件通信接口,计算机通过它来控制仪器。

​ 可编程仪器标准命令(英语:Standard Commands for Programmable Instruments,缩写:SCPI)定义了一套用于控制可编程测试测量仪器的标准语法和命令。

(以上两段抄的百度百科)

​ 总的来说,这两种功能提供了计算机程控示波器的接口,对于支持SCPI示波器,都有各自的SCPI指令。

​ 程控的好处就是,可以自动化的获取波形,便于后续的攻击操作,对于某些上位机写的实在太丑的虚拟示波器(就是说你呢,DSO3254),可以自己魔改。

​ 由于每个示波器的指令或者协议不同,有些是自己的协议,所以在此不展开。我倾向于使用通用协议的示波器,这样对于以后的移植很方便。

触发的设置

​ 采集中,由于示波器以极快的速度进行采集,分析所有的数据找到我们感兴趣的区间,无论在空间复杂度还是运算复杂度上都是不可能的。这个时候,就需要告诉示波器,在什么时候开始采集。本例中,我编写的程序的时候,人工设置了一个触发信号,在执行AES计算的时候,把P0.0引脚拉高,执行之后,把P0.0引脚拉低。

​ 在真实的物联网设备中,是不可能存在这种触发信号的,所以,需要采用波形触发或者指令触发。指令触发有两种,主动触发和被动触发。主动触发就是主动发出指令,让芯片运行关键代码,发出指令的同时给示波器触发信号;被动触发是指通过前期的观察,得到芯片运行关键代码之前的指令流,并记录,使用一个独立硬件,在状态机捕获了相同或相似逻辑的时候直接给示波器触发信号,一般这种硬件都是独立于PC的以保证速度,例如Riscure的spider。

GND短路

​ 一般来说,示波器的所有GND引脚都是相通的,如果使用多个探头的时候,不同探头的GND之间存在电压差,就会产生电流。连接的时候,要综合考虑被测电路的结构,避免出现短路影响测量甚至烧坏仪器。

 

尾声

​ 最后给大家AES执行第一轮附近和最后一轮附近的两张图,大家可以对比AES128的算法,猜一下字节替代(SubBytes)、行移位(ShiftRows)、列混淆(MixColumns)和轮密钥加(AddRoundKey)的位置,静静聆听芯片的低声耳语。

(AES第一轮)

(AES最后一轮和倒数第二轮)

(完)