3. 篡改检测基础原理:电阻/电容/电压/频率敏感型检测机制,阈值比较器设计
各位好,欢迎来到第三章。前两章我们聊了篡改检测的威胁模型和整体架构,算是把「为什么做」和「做什么」理清了。从这章开始,咱们要真正动手碰电路了。
篡改检测的核心,说白了就是一句话:让芯片能感知到物理环境的异常变化。攻击者要拆封装、探针、激光、电压毛刺……这些动作都会引起物理量的改变。我们只要把这些变化转成电信号,再跟一个预设的「安全门限」比一比,就能判断是否被攻击了。
我个人习惯把敏感型检测机制分成四大类:电阻、电容、电压、频率。这四种机制各有脾气,适用场景也不同。下面我一个一个讲。
3.1 电阻敏感型检测
电阻敏感型是最直观的。我在项目中遇到过一种场景:芯片封装后,在顶层金属上走一条细长的蛇形电阻丝。攻击者如果试图用机械方式打开封装,这条电阻丝大概率会被扯断或短路。电阻值一变,我们就知道出事了。
具体实现上,通常用惠斯通电桥来测微小电阻变化。电桥的四个臂,三个是已知精密电阻,一个是敏感电阻。当敏感电阻变化时,电桥输出差分电压。这个电压很微弱,需要经过仪表放大器放大,再送进比较器。
关键参数:
- 敏感电阻的初始值:通常选 1kΩ ~ 100kΩ,取决于工艺和功耗预算
- 检测灵敏度:能分辨的最小电阻变化率,一般要求 0.1% ~ 1%
- 响应时间:从电阻变化到输出报警,通常需要 < 1μs
避坑指南:我曾经在一个项目里直接用单端电阻分压测变化,结果温度漂移把检测阈值完全淹没了。后来换成惠斯通电桥,共模抑制比上去之后,温度影响才压下来。记住:差分结构是抵抗共模干扰的利器。
3.2 电容敏感型检测
电容敏感型主要用来检测探针接触或介质变化。攻击者用 FIB(聚焦离子束)修改电路时,会在芯片表面留下导电沉积物,或者改变局部介电常数。这些都会引起寄生电容的变化。
检测电路通常是一个 RC 振荡器,敏感电容作为振荡频率的决定元件之一。电容变了,频率就变。我们通过测频或测周期来反推电容变化。
嗯,这里要注意:芯片内部的寄生电容本来就很小(pF 甚至 fF 级别),所以检测电路本身必须对寄生不敏感。我建议用开关电容技术,把微小电容差转换成电压差,再用后面的比较器处理。
| 检测机制 | 敏感物理量 | 典型检测范围 | 主要干扰源 |
|---|---|---|---|
| 电阻敏感型 | 电阻值 | 0.1% ~ 10% 变化 | 温度漂移 |
| 电容敏感型 | 电容值 | 1fF ~ 10pF | 寄生电容、噪声 |
| 电压敏感型 | 电源电压 | ±1% ~ ±20% | 负载瞬态 |
| 频率敏感型 | 时钟频率 | ±0.1% ~ ±5% | 温度、工艺角 |
3.3 电压敏感型检测
电压敏感型检测,说白了就是盯着芯片的电源轨。攻击者做电压毛刺(Voltage Glitch)时,会在 VDD 上注入短暂的高压或低压脉冲,让逻辑电路误翻转。我们得在毫微秒级别捕捉到这种异常。
检测电路的核心是一个窗口比较器。窗口比较器有两个阈值:上限 VH 和下限 VL。正常供电电压 VDD 应该在 VL 和 VH 之间。一旦超出这个窗口,比较器立刻翻转,触发报警。
你想想看,窗口比较器的设计难点在哪?
- 阈值精度:VH 和 VL 必须精确,不能因为工艺偏差导致误报或漏报
- 响应速度:电压毛刺可能只有几纳秒,比较器必须足够快
- 迟滞设计:为了防止噪声引起频繁翻转,需要加一点正反馈迟滞
警告:窗口比较器的参考电压源必须独立于被检测的 VDD。如果参考电压也随 VDD 一起波动,那窗口就跟着漂了,检测等于白做。我见过有人直接用 VDD 分压做参考,结果毛刺来了,参考和被测一起跳,比较器根本没反应。这是低级错误,千万别犯。
3.4 频率敏感型检测
频率敏感型检测,主要防时钟毛刺(Clock Glitch)和频率注入攻击。攻击者会短暂改变时钟频率,让时序路径违例,导致寄存器捕获错误数据。
检测方法有两种:
- 周期测量法:用高频参考时钟测量待测时钟的每个周期宽度。如果周期超出正常范围,报警。
- 频率锁定环法:用 PLL 或 DLL 锁定待测时钟,监控锁定状态。一旦失锁,说明频率异常。
我个人更倾向于周期测量法,因为它不需要模拟锁相环,纯数字实现,可移植性好。下面是一个简单的周期测量 Verilog 代码片段:
module freq_detector (
input wire clk_ref, // 高频参考时钟,比如 1GHz
input wire clk_mon, // 待监测时钟
output reg alarm // 报警输出
);
reg [9:0] cycle_cnt;
reg mon_prev;
always @(posedge clk_ref) begin
mon_prev <= clk_mon;
if (mon_prev && !clk_mon) begin // 检测 clk_mon 下降沿
// 检查周期计数是否在正常范围
if (cycle_cnt < MIN_CYCLE || cycle_cnt > MAX_CYCLE)
alarm <= 1'b1;
else
alarm <= 1'b0;
cycle_cnt <= 10'd0;
end else begin
cycle_cnt <= cycle_cnt + 1'b1;
end
end
endmodule
提示:MIN_CYCLE 和 MAX_CYCLE 要根据工艺角和温度做仿真确定。我曾经在一个 28nm 项目里,因为没考虑温度变化,冬天芯片正常,夏天批量误报。后来加了温度补偿查找表才解决。
3.5 阈值比较器设计
不管前面用哪种敏感机制,最后都要过比较器这一关。比较器就是那个「裁判」,它决定到底算不算攻击。
阈值比较器的设计要点:
- 可编程阈值:最好用 DAC 或电阻阵列实现可调阈值,方便调试和适配不同工艺角
- 迟滞控制:正反馈量要适中,太小抗噪差,太大响应慢
- 输出锁存:一旦触发报警,建议锁存输出,直到系统复位,防止攻击者用短脉冲绕过检测
下面是一个带迟滞的窗口比较器结构图,我画了 SVG 方便大家理解:
从图上你能看到,迟滞控制同时影响两个比较器的阈值。当输出为高时,比较器的翻转阈值会略微偏移,这样输入信号必须回到更「安全」的区域才能复位。这个偏移量通常设计为 5% ~ 10% 的窗口宽度。
3.6 综合设计建议
最后,我结合自己的项目经验,给几条综合建议:
- 冗余检测:不要只依赖一种机制。我习惯同时用电阻+电压两种检测,交叉验证,降低漏报率。
- 阈值留余量:仿真和实测总有差距。阈值不要卡在极限值,留 10% ~ 20% 的余量。
- 调试接口:在芯片里留一个测试模式,可以旁路掉检测电路,直接注入模拟攻击信号,方便调试。
- 温度补偿:电阻和电容都对温度敏感。如果芯片工作温度范围宽,必须做温度补偿,否则阈值会漂。
本章核心要点:
- 四种敏感机制:电阻、电容、电压、频率,各有适用场景和设计难点
- 阈值比较器是检测链路的最后一道关,迟滞和锁存设计至关重要
- 差分结构(如惠斯通电桥)能有效抑制共模干扰
- 可编程阈值和调试接口能大幅降低调试难度