第二章:硬件攻击基础——侧信道与故障注入原理

各位同学,大家好。我是你们这堂课的主讲人。今天咱们聊点硬核的——硬件攻击的基础。说白了,就是攻击者是怎么“欺负”咱们的加密狗的。

我个人习惯把硬件攻击分成两大类:一类是“偷看”,一类是“使坏”。偷看就是侧信道攻击,使坏就是故障注入攻击。这两招,是破解加密狗最常用的手段。你想想看,你的加密狗芯片,它再坚固,也架不住人家一边偷看你运算时的功耗,一边往你电源线上捅刀子。

2.1 侧信道攻击:从“功耗”和“电磁”里读你的秘密

侧信道攻击,说白了,就是攻击者不直接破解你的算法,而是通过观察芯片运行时的“物理特征”来推断你的密钥。这就像你打麻将,别人不看你的牌,但看你摸牌时的表情就知道你胡没胡。

2.1.1 功耗分析攻击

芯片在运算时,消耗的电流不是恒定的。执行不同的指令、处理不同的数据,功耗波形都不一样。攻击者用高精度示波器采集这些波形,就能分析出你的密钥。

简单功耗分析:直接看波形。比如,执行乘法指令时功耗高,加法指令时功耗低。攻击者一看波形,就知道你哪一步在算乘法,哪一步在算加法。我在项目中遇到过,有个客户把密钥比较循环写得很规整,结果波形上每个循环的功耗都一样,攻击者直接数出循环次数,就知道密钥长度了。

差分功耗分析:这招更狠。攻击者采集几千甚至几万条功耗曲线,然后根据一个假设的密钥位,把曲线分成两组,再求平均差。如果假设对了,两组曲线之间就会出现明显的尖峰。说白了,就是用统计学方法,把隐藏在噪声里的信号给揪出来。

核心要点:功耗分析攻击的成功率,取决于信噪比。你芯片上的去耦电容越大,噪声越大,攻击者就越难分析。但电容太大,成本又上去了。这是个平衡的艺术。

我的经验:我曾经帮一个客户做加固,他们用的MCU功耗波形特别“干净”。我建议他们在电源线上串一个小电阻,再并一个电容,人为制造一些随机噪声。攻击者采集到的波形信噪比变差,分析难度直接翻倍。

2.1.2 电磁辐射分析

芯片在工作时,电流变化会产生电磁辐射。用一个小线圈贴近芯片表面,就能感应到这些辐射信号。电磁辐射攻击和功耗分析原理类似,但有个好处——可以局部测量。比如,你可以把线圈对准芯片的某个模块,专门偷看那个模块的运算。

我记得有一次,一个客户的产品被破解了。攻击者就是用电磁探头,对准了芯片的AES加速器模块,直接读出了轮密钥。为什么?因为那个模块的电磁辐射特别强,而且没有做任何屏蔽。

攻击类型 测量对象 优点 缺点
功耗分析 芯片总电流 容易接入,设备便宜 噪声大,需要大量采样
电磁辐射 局部电磁场 空间分辨率高,可定位模块 探头定位要求高,易受干扰

避坑指南:我曾经见过一个团队,他们给加密狗加了金属屏蔽罩,以为就万事大吉了。结果攻击者把屏蔽罩撬开一个小缝,用更细的探头伸进去,照样采集到了信号。记住,屏蔽罩不是万能的,缝隙就是天线。

2.2 故障注入攻击:用“电压毛刺”和“时钟毛刺”让芯片犯错

故障注入攻击,就是故意让芯片在某个时刻“算错”。比如,跳过一条指令、让循环少跑一次、或者让密钥比较结果变成“通过”。这招特别适合破解那些有“安全锁”的加密狗。

2.2.1 电压毛刺攻击

在芯片正常供电的电压上,叠加一个短暂的、幅度很高的尖峰脉冲,或者一个短暂的、幅度很低的凹陷。这个毛刺会让芯片内部的逻辑门出现“亚稳态”——也就是既不是0也不是1,导致运算结果出错。

攻击者通常会这么做:先让加密狗执行一个“验证密码”的操作,然后在密码比较指令执行的那一刻,注入一个电压毛刺。如果时机抓得准,芯片就会把“密码错误”的结果,错误地判断成“密码正确”。

我建议你在设计时,一定要加电压检测电路。一旦检测到电压异常,立即复位或者进入安全状态。但要注意,检测电路的响应时间必须足够快,否则毛刺已经打进去了,你才反应过来,那就晚了。

// 伪代码:电压毛刺攻击的典型目标
if (user_password == stored_password) {
    grant_access();  // 攻击者希望跳过这个判断,直接执行这里
} else {
    deny_access();
}

关键点:电压毛刺的“宽度”和“幅度”需要精确控制。太宽了,芯片直接死机;太窄了,毛刺不起作用。攻击者通常会用一个“毛刺发生器”反复尝试,找到那个“恰到好处”的参数。

2.2.2 时钟毛刺攻击

芯片的时钟信号,决定了它每一步运算的节奏。如果攻击者在时钟信号上插入一个“额外”的脉冲,或者“跳过”一个脉冲,芯片的时序就会乱掉。

举个例子,芯片内部有一个状态机,它需要4个时钟周期完成一次状态转换。如果攻击者在第3个时钟周期插入一个毛刺,状态机可能直接跳到第5个状态,跳过关键的安全检查步骤。

我记得有个案例,攻击者用时钟毛刺攻击一个智能卡。他们发现,只要在卡片执行“读内存”指令时,插入一个时钟毛刺,就能让卡片读出原本被保护的内存区域。为什么?因为毛刺让内存地址译码器“算错了”,读到了不该读的地址。

故障类型 注入方式 典型效果 防护手段
电压毛刺 电源线上叠加尖峰/凹陷 跳过指令、错误比较结果 电压检测、冗余计算
时钟毛刺 时钟线上插入/删除脉冲 状态机跳转、内存访问错误 时钟检测、双沿触发

我的经验:我曾经设计过一个防护方案,在芯片内部同时使用时钟的上升沿和下降沿来触发关键操作。这样,即使攻击者插入一个时钟毛刺,也只能影响其中一个沿,另一个沿仍然能保证操作的正确性。当然,这会让设计复杂一些,但安全性提升很明显。

2.3 小结:知己知彼,百战不殆

好了,这一章的内容就这些。我们讲了侧信道攻击里的功耗分析和电磁辐射,也讲了故障注入攻击里的电压毛刺和时钟毛刺。说白了,攻击者就是在利用芯片的“物理漏洞”。

你作为加密狗的设计者,必须了解这些攻击手段。只有这样,你才能在设计阶段就考虑好防护措施。下一章,我会具体讲讲怎么在硬件层面做防护,比如加屏蔽、加检测电路、做冗余设计等等。

嗯,今天就到这里。记住,安全设计不是一蹴而就的,而是一个不断对抗、不断进化的过程。