时钟毛刺攻击基础

各位同学,欢迎来到实战手册的第一章。今天咱们聊一个非常核心的话题——时钟毛刺攻击。

说实话,我第一次接触这个技术时,心里是有点发怵的。毕竟要往芯片的时钟线上“捣乱”,听起来就像在手术台上给心脏做电击。但搞了这么多年安全评估,我越来越觉得,时钟毛刺其实是故障注入里最优雅、最可控的一种方式。

时钟毛刺原理

先说说原理。芯片内部的所有操作,都靠时钟信号来同步。每个时钟上升沿,CPU就执行一条指令。这个节奏非常稳定,就像军队的鼓点。

时钟毛刺,说白了就是在正常的时钟信号里,突然插入一个非常窄的脉冲。这个脉冲比正常时钟周期短得多,可能只有几纳秒。芯片的时钟树会把这个异常脉冲传递到各个模块。

为什么会造成故障?因为CPU内部的组合逻辑需要一定时间才能稳定。正常时钟周期足够长,信号能稳定下来。但毛刺的脉冲太短,组合逻辑还没稳定,就被下一个沿采样了。结果就是——寄存器里存了错误的数据。

核心要点:时钟毛刺的本质是破坏时序约束,让芯片在非稳态下采样数据。

我在项目中遇到过一种情况:芯片明明有毛刺检测电路,但毛刺宽度控制在某个阈值以下时,检测电路根本不会触发。这说明什么?说明芯片的防御措施总有盲区。

毛刺参数

搞时钟毛刺,你得掌握三个关键参数。我习惯把它们称为“毛刺三要素”。

参数 定义 典型范围 我的经验
宽度 毛刺脉冲的持续时间 1ns ~ 10ns 太宽会被检测,太窄没效果
偏移 毛刺相对于正常时钟沿的位置 0 ~ 周期长度 通常选在时钟上升沿附近
能量 毛刺的电压幅度 1.2V ~ 3.6V 过高可能烧芯片

宽度

宽度是最敏感的参数。你想想看,正常时钟周期可能是100ns,你插入一个3ns的毛刺。这个毛刺必须足够短,让组合逻辑来不及响应。但又不能太短,否则连寄存器都触发不了。

我个人习惯从5ns开始扫,每次减0.5ns,直到找到有效窗口。嗯,这里要注意:不同工艺的芯片,有效宽度窗口差别很大。65nm的芯片和28nm的芯片,敏感度能差一个数量级。

偏移

偏移决定了毛刺打在时钟周期的哪个位置。最敏感的区域通常是时钟上升沿前几纳秒。为什么?因为这时候组合逻辑正在变化,最不稳定。

我曾经在评估一款JCOP芯片时,发现偏移在-2ns到+1ns之间效果最好。超出这个范围,毛刺要么没效果,要么直接导致芯片复位。

能量

能量说白了就是毛刺的电压。正常时钟信号是0到1.8V(以JCOP为例),毛刺可以拉到更高。但别贪心,我见过有人把电压拉到3.3V,结果芯片直接冒烟了。

警告:毛刺能量过高会永久损坏芯片。建议从1.2倍VDD开始尝试,逐步增加。

毛刺注入方法

注入方法主要有三种。我按推荐程度排序。

  1. 直接耦合:用探针直接接触时钟走线。效果最好,但需要物理接触。
  2. 电磁注入:用电磁脉冲感应到时钟线上。非接触式,但精度差一些。
  3. 电源毛刺:通过电源线间接影响时钟。最隐蔽,但控制难度大。

我个人最常用的是直接耦合。虽然需要开盖、找时钟线,但胜在可控。你想想看,电磁注入你都不知道毛刺到底打在哪条线上,调试起来太痛苦了。

具体操作时,我会用一台任意波形发生器,输出一个正常时钟信号,然后在指定位置叠加一个窄脉冲。示波器实时监测时钟线上的波形。嗯,这里有个小技巧:毛刺的上升沿要陡,最好在1ns以内。否则毛刺就不够“刺”了。

毛刺对CPU执行流的影响

这是最有趣的部分。时钟毛刺到底怎么影响CPU?我画了一张图来说明。

时钟毛刺对CPU执行流的影响 正常时钟: 正常指令流: MOV R0, #1 ADD R1, R0 CMP R1, #5 BEQ label STR R1, [R2] 毛刺时钟: 毛刺 毛刺后指令流: MOV R0, #1 ADD R1, R0 CMP R1, #3 BEQ label STR R1, [R2] 正常执行:CMP R1, #5 → BEQ label(比较结果正确) 毛刺后:CMP R1, #3 → BEQ label(比较结果被篡改)

从图上你能看到,正常时钟下,CPU按部就班执行指令。但毛刺打进来后,CMP指令的操作数从#5变成了#3。这就是典型的指令篡改。

具体来说,时钟毛刺会导致以下几种情况:

  • 指令跳过:毛刺让CPU误以为当前指令已完成,直接跳到下一条。安全校验指令就这么被跳过了。
  • 操作数错误:就像上图那样,比较的值变了。这在密码校验中非常致命。
  • 分支预测错误:条件跳转的结果被翻转。该跳的不跳,不该跳的跳了。
  • 寄存器写错:数据写到错误的寄存器里。后续计算全乱套。

实战技巧:攻击JCOP芯片时,我建议先定位安全校验函数。通常就是那个检查PIN码或签名的函数。在这个函数执行期间注入毛刺,成功率最高。

我曾经在评估一款JCOP 2.4.1芯片时,用时钟毛刺成功跳过了RSA签名校验。具体做法是:在签名校验函数的CMP指令前2ns注入一个4ns宽的毛刺。重复了大概200次,成功了一次。虽然成功率不高,但一次成功就足以证明芯片存在漏洞。

你可能会问:为什么不是100%成功?因为毛刺攻击本质上是概率性的。芯片内部有各种保护机制,比如冗余计算、时序检测。但只要你找到那个脆弱的时间窗口,剩下的就是耐心和运气了。

嗯,最后提醒一句:做毛刺攻击时,一定要用示波器实时监测时钟信号。我见过有人调了半天参数都没效果,结果发现探针根本没接触好。这种低级错误,咱们就别犯了。


公众号:蓝海资料掘金营,微信deep3321