3、故障注入原理:故障模型(位翻转、指令跳过、数据损坏)、故障效果与攻击场景
故障注入并非随机破坏,而是攻击者通过物理手段(电压毛刺、时钟毛刺、激光等)在目标芯片运行过程中引入确定性或半确定性的逻辑错误,从而破坏安全边界。要理解攻击为何能奏效,必须先建立清晰的故障模型——即故障在数字电路和软件执行流中具体表现为哪几种形态。本章将深入剖析三种核心故障模型(位翻转、指令跳过、数据损坏),阐述其产生的物理机理、在处理器内核中的表现方式,并结合真实攻击场景说明如何从故障效果反推攻击路径。
上图展示了故障注入攻击的完整链路:攻击者通过物理手段在芯片内部特定位置、特定时间窗口引入扰动,该扰动在数字逻辑中表现为三种基本故障模型之一,进而被软件执行流放大为可观测的安全绕过效果。理解这一链路是后续章节中实施电压毛刺、时钟毛刺和激光攻击的基础。
3.1 核心原理:三种故障模型的本质
故障模型是对物理故障在数字抽象层面的数学化描述。不同注入手段、不同注入位置、不同时序窗口会产生不同的故障模型。实际攻击中,一次注入可能同时触发多种模型,但攻击者通常只关注其中一种主导效应。
| 故障模型 | 物理本质 | 典型触发条件 | 攻击价值 |
|---|---|---|---|
| 位翻转 | 存储单元(SRAM/寄存器/锁存器)在电压或激光扰动下,保持状态被破坏,逻辑值发生0↔1跳变 | 电压毛刺幅度超过噪声容限;激光照射敏感节点(如SRAM单元的反相器) | 直接修改密钥、权限位、比较结果等关键数据 |
| 指令跳过 | 处理器取指或译码阶段发生时序违规,导致当前指令被丢弃或错误译码,PC跳转到下一条指令 | 时钟毛刺使建立时间/保持时间不满足;电压毛刺导致锁相环失锁 | 绕过安全检查(如if判断、循环计数、签名校验) |
| 数据损坏 | 数据总线、ALU运算路径或内存读写路径上的组合逻辑在扰动下输出错误结果 | 电压毛刺导致逻辑门延迟增大,组合逻辑在采样窗口内未稳定 | 篡改运算结果、破坏消息认证码、污染内存数据 |
关键认知:三种故障模型并非完全独立。例如,对ARM Cortex-M系列处理器注入时钟毛刺时,如果毛刺发生在LDR指令的取指阶段,可能表现为指令跳过;如果发生在STR指令的访存阶段,则可能表现为数据损坏(写入错误值)。攻击者需要通过故障表征(Fault Characterization)实验来确定目标设备在特定注入参数下的主导故障模型。
3.2 判断方法:如何识别故障模型
在实际攻击或安全评估中,识别故障模型是选择后续利用策略的前提。以下是系统化的判断流程:
- 观察故障输出特征:记录注入后设备的输出行为。若程序计数器跳变导致函数返回地址错误,通常是指令跳过;若某个变量值变为0x00或0xFF,可能是位翻转;若加密结果与正确值仅有少数比特差异,则是数据损坏。
- 重复注入统计:在相同参数下重复注入100次以上,统计故障模式分布。若80%以上表现为同一种故障,说明该参数下故障模型稳定;若分布分散,则需调整注入参数(如毛刺宽度、偏移)。
- 使用调试接口辅助:若目标芯片有JTAG/SWD调试接口(在攻击场景中通常被禁用,但在开发板上可临时启用),可设置硬件断点观察故障发生时的PC值和寄存器状态。
- 对比已知故障签名:参考芯片厂商的安全文档或学术中公开的故障特征。例如,STM32F4系列在特定电压毛刺参数下,已知会产生
BKPT指令跳过。
// 故障模型识别伪代码(在攻击者控制的目标固件中植入)
volatile uint32_t fault_flag = 0;
void fault_isr(void) {
fault_flag = SCB->ICSR & 0x1FF; // 读取异常编号
}
// 注入后检查:
// 若 fault_flag == 0x03 (HardFault) → 可能为数据损坏
// 若 fault_flag == 0x00 且程序继续执行 → 可能为指令跳过
// 若 fault_flag == 0x02 (NMI) → 可能为位翻转导致控制寄存器异常
3.3 案例拆解:智能卡PIN校验绕过
下面通过一个经典案例完整展示故障模型如何被利用。该案例基于某款商用Java Card智能卡(如NXP J3A040),攻击目标是绕过PIN码校验。
背景与约束:智能卡安全芯片内置硬件DES/3DES加速器,PIN校验在卡片操作系统(COS)中通过软件实现。攻击者拥有合法的空白卡片,但不知道管理员PIN。卡片支持ISO 7816接口,攻击者可以控制APDU命令时序。
初始现象:发送VERIFY PIN命令后,卡片返回63 00(认证失败)。攻击者尝试在命令处理期间注入电压毛刺,但随机注入的成功率极低(约0.1%)。
关键分析:通过逆向卡片固件(利用侧信道泄露的二进制),发现PIN校验代码使用了一个循环计数器:
// 伪代码
for (i = 0; i < 3; i++) { // 最多尝试3次
if (verify_pin(input_pin) == TRUE) {
return SUCCESS;
}
}
return FAILURE;
攻击者意识到,如果能在i++指令处注入时钟毛刺导致指令跳过,循环计数器将不会递增,从而允许无限次尝试。但更高效的攻击是:在verify_pin()函数返回后的CMP比较指令处注入故障,使比较结果从FALSE翻转为TRUE。
实际操作步骤:
- 使用激光扫描确定芯片中CPU核心的位置(通过红外发射显微镜定位)。
- 在
VERIFY PIN命令的响应时间窗口内(约2.3ms处),使用宽度为5ns的激光脉冲照射CPU的ALU区域。 - 以0.1ns步进扫描激光触发延迟,从2.0ms到2.6ms,每个延迟点尝试100次。
- 在延迟2.35ms处,观察到约12%的概率返回
90 00(成功)。 - 进一步缩小延迟范围至2.34-2.36ms,以0.02ns步进,最终在2.348ms处达到31%的成功率。
结果对比:未注入时成功率0%;随机电压毛刺成功率0.1%;精确定时激光注入成功率31%。攻击时间从平均3小时缩短至4分钟。
风险与代价:激光注入需要昂贵的设备(约50万美元),且需要去除芯片封装(化学开盖)。此外,31%的成功率意味着每次失败后卡片会递增错误计数器,连续失败3次后卡片永久锁定。因此攻击者需要设计自动重试机制,并在每次失败后重新上电复位卡片。
复盘经验:该案例表明,精确的故障模型识别(此处为ALU比较结果位翻转)比盲目注入效率高两个数量级。攻击者通过逆向固件定位敏感指令,再通过激光的精确空间和时间控制实现定向位翻转。
3.4 常见误区与总结复盘
误区一:认为故障注入只能产生随机错误。实际上,通过精心选择注入参数(毛刺宽度、幅度、相位、位置),攻击者可以实现高度确定性的故障。例如,对特定SRAM列的激光照射可以稳定翻转特定比特位。
误区二:混淆指令跳过与数据损坏。指令跳过通常导致PC跳变,表现为函数调用栈异常或循环计数错误;数据损坏则表现为变量值错误但控制流正常。错误识别故障模型会导致利用代码无效。
误区三:忽略故障注入的时序窗口。每条指令的执行时间窗口极窄(纳秒级),攻击者必须通过故障表征确定精确的注入时刻。现代芯片的时钟频率越高,时序窗口越窄,攻击难度越大。
总结:故障模型是连接物理注入手段与软件攻击效果之间的桥梁。位翻转、指令跳过、数据损坏三种模型各有其物理根源和利用方式。安全评估人员应当通过系统化的故障表征实验,建立目标设备的故障模型库,记录不同注入参数对应的故障类型和成功率。这不仅是攻击的基础,也是设计防御措施(如故障检测计数器、冗余计算、时序检查)的依据。
实战建议:在评估自有产品时,建议使用激光或电磁注入建立故障模型矩阵,重点关注安全关键代码(如签名验证、权限检查、密钥加载)的故障敏感性。对于高安全等级产品,应引入故障注入测试作为安全验证的必选项,而非可选项。