解释故障注入(fault injection)在安全验证中的作用
解读
国内数字芯片项目进入车规、商密、国密、金融、AI 安全三类(国密二级/银联芯片/车规 ASIL-D)认证时,验证团队必须出具“安全机制有效性”证据。故障注入是唯一能系统、定量、可复现地评估芯片在“恶意或异常应力”下是否仍保持机密性、完整性、可用性的手段。它把“攻击者视角”搬进验证平台,用可控、可观测、可度量的方式把单粒子翻转、电压毛刺、时钟抖动、激光、电磁、Rowhammer 等物理故障抽象成 RTL/门级事件,从而在安全 sign-off 前把设计-实现-架构三层防护短板一次性暴露。面试官想确认:你不仅知道“插错”概念,更清楚如何把它嵌入 UVM 流程、如何跟覆盖率、如何跟国密/车规双重要求对齐,以及如何量化 residual risk。
知识点
- 故障模型:单比特翻转(SBU)、多比特翻转(MBU)、固定型 0/1、路径延迟、组合环、配置寄存器粘滞、ECC 静默错误。
- 注入层面:
- 行为级(SystemVerilog 断言 force)
- RTL 级(VCS fi 命令、Xcelium fi 接口、Questa fi 库)
- 门级网表(TetraMAX 的 SAF/TDF、StarRC 提取的延迟故障)
- 后仿真(SDF 反标)
- FPGA 原型(通过 ILA 触发器局部重配置、Partial Reconfig 帧注入)
- 硬件加速(Palladium 的 Fi 插件、Zebu 的 Fault App)
- 安全属性分类:
- 机密性(Confidentiality)——密钥是否泄漏
- 完整性(Integrity)——签名/明文是否被篡改
- 可用性(Availability)——看门狗/安全岛是否被 DoS
- 国内合规映射:
- 国密 SM4/AES 算法模块:GM/T 0008-2012 要求 100% 单比特故障注入 + 99% 双比特故障注入,残留风险 ≤10-6
- 车规 ISO 26262:DFA(Dependent Failure Analysis)需证明安全机制诊断覆盖率 ≥90%,故障注入是首选证据
- 银联芯片:Q/CUP 037-2014 要求“敏感数据在 100 ms 内清零”,需用故障注入验证清零路径在异常电压下仍有效
- UVM 实现套路:
- 在 scoreboard 里开 fault_phase,与 main_phase 并行;
- 用 uvm_hdl_force/uvm_hdl_deposit 精准定位寄存器位;
- 用 covergroup “fault_cg” 采样 fault_type、inject_cycle、recover_cycle,确保所有 fault 模型被遍历;
- 用 SVA 检查安全响应:fault_injected |-> ##[1:100] (alarm_triggered || data_scrubbed)
- 量化指标:
- FIT(Failure In Time)= 注入故障数 × 10^9 / 总仿真周期
- DC(Diagnostic Coverage)= 被安全机制捕获的故障数 / 总注入故障数
- Residual Risk = (1 – DC) × Severity × Probability
答案
“在国内安全芯片项目中,故障注入是验证安全机制是否达标的‘硬证据’。我们首先在验证计划里把国密 SM4 算法模块的 128 位密钥寄存器、16 轮迭代网络、以及冗余 CRC 校验单元列为‘高优先级故障点’。随后用 VCS 自带的 fi 命令在 RTL 级建立 3 类故障模型:单比特翻转、相邻双比特翻转、固定 0/1。整个平台基于 UVM,新增一个 fault_injector agent,内部用 uvm_hdl_force 在指定时钟沿精准注入,注入窗口由 randc 变量控制,确保均匀分布。为了对齐 GM/T 0008-2012,我们设置目标覆盖率:单比特 100%、双比特 99%,用 covergroup fault_cg 交叉采样 fault_type 与 injection_cycle。Scoreboard 里用 SVA 断言检查:若故障导致密钥寄存器值改变,必须在下一个时钟检测到 alarm_o 拉高,同时 zeroize 信号在 100 ms(折算 20 个时钟周期)内完成清零;否则记为逃逸。最终跑完 10^7 个随机测试,累计注入 48 万次故障,诊断覆盖率 DC=99.37%,残留风险 6.3×10-7,低于规范要求的 10-6,获得国密二级的安全 sign-off 认可。整个流程脚本化,可一键重跑,满足车规 ASIL-D 的回归要求。”
拓展思考
- 如何证明“故障注入量级”足够?——可结合 SM4 的 128 位 + 32 轮结构,用组合数学估算最小故障空间,再用 Monte-Carlo 方法验证采样密度已收敛。
- 当设计采用双核锁步(Dual-Core Lockstep)时,故障注入需考虑同步/异步差异,如何在不破坏锁步对齐的前提下注入仅影响一个核的故障?——可在综合后网表插入 “fi_mux”,利用
isolate属性让综合工具保留该单元,实现精准差分注入。 - 若芯片已流片,实验室只有示波器和电磁探头,如何把现场捕捉到的电压毛刺反向抽象成 RTL 级故障,用于下次迭代?——可用 Python 把示波器 CSV 转成 VCD,再写脚本在仿真里
force相同翻转序列,实现“硅后-仿真”闭环。 - 面对量子计算带来的新攻击模型,故障注入平台如何扩展?——可在 UVM 序列里加入“叠加态”抽象,把密钥寄存器建模为概率向量,用 SystemVerilog 实数数组模拟测量坍缩,提前评估后量子密码(如 CRYSTALS-Dilithium)在故障下的泄漏边界。