1. 硬件安全概述:威胁、木马、侧信道与PUF

各位好,我是老周。在芯片行业摸爬滚打了十几年,今天咱们聊聊硬件安全。说实话,十年前我跟很多工程师一样,觉得安全是软件的事。直到有一次,我在一个IoT项目的流片回来后,发现芯片在特定温度下会泄露密钥——嗯,从那以后我再也不敢轻视硬件安全了。

硬件安全不是锦上添花,而是底线。你想想看,软件漏洞还能打补丁,芯片一旦流片出来,硬件缺陷就是永久性的。所以,这一章我们先搭个框架,把几个核心概念理清楚。

1.1 硬件安全威胁模型

威胁模型,说白了就是回答三个问题:谁在攻击你?他想干什么?他能怎么干?

我习惯把硬件攻击者分成四类,见下表:

攻击者类型 能力等级 典型手段 我见过的案例
远程软件攻击者 低 利用固件漏洞、缓冲区溢出 某路由器通过JTAG接口被提权
物理邻近攻击者 中 侧信道分析、故障注入 智能卡在电磁辐射中泄露密钥
实验室级攻击者 高 FIB探针、微探针、反向工程 某安全芯片被聚焦离子束切开金属层
代工厂级攻击者 极高 植入硬件木马、修改光罩 军工项目中发现额外逻辑单元

这里有个关键点:威胁模型决定了你的防护成本。如果你做的是车规级芯片,物理邻近攻击是主要威胁;如果是金融安全芯片,实验室级攻击才是真正的对手。我曾经在一个项目中,客户要求防住所有攻击者——结果防护成本比芯片本身还贵,最后我们不得不重新定义威胁边界。

避坑指南: 不要一开始就追求"绝对安全"。我曾经见过一个团队,花了半年时间做抗FIB的金属层防护,结果产品上市后发现,90%的攻击来自软件漏洞。先做威胁建模,再定防护策略。

1.2 硬件木马

硬件木马,就是芯片里被偷偷塞进去的"后门"。它跟软件木马不一样——软件木马可以杀毒,硬件木马一旦流片,你只能报废整批芯片。

硬件木马通常由两部分组成:

  • 触发机制:什么时候激活?可以是特定输入组合、计数器溢出、温度阈值等
  • 载荷:激活后干什么?泄露密钥、修改功能、拒绝服务

我参与过一个国防项目的安全审查。当时我们在RTL代码里发现了一个"幽灵状态机"——它只在第65536次复位时跳转到异常状态,然后通过未使用的I/O引脚输出内部寄存器值。这就是典型的硬件木马,触发条件是计数器,载荷是信息泄露。

硬件木马的分类,我习惯按插入阶段来分:

插入阶段 攻击者 检测难度 典型特征
RTL设计 内部员工或第三方IP 中 冗余状态、未使用逻辑
综合/布局布线 EDA工具后门 高 额外标准单元、异常连线
光罩制造 代工厂 极高 金属层修改、晶体管尺寸变化
封装测试 封测厂 高 额外bonding线、测试模式残留
我的经验: 检测硬件木马最有效的方法不是功能测试,而是"侧信道指纹比对"。因为木马即使不触发,也会改变芯片的功耗和时序特征。我们曾经用这个方法,在1000颗芯片中找出了3颗被植入木马的样品。

1.3 侧信道攻击

侧信道攻击,说白了就是"不走正门,走窗户"。密码算法本身可能是安全的,但芯片在执行算法时,会泄露功耗、电磁辐射、时间信息——这些就是"侧信道"。

最常见的侧信道攻击类型:

  • 功耗分析:简单功耗分析(SPA)看单条指令,差分功耗分析(DPA)做统计
  • 电磁辐射分析:用近场探头采集芯片表面的电磁场
  • 时间分析:根据执行时间推断操作数或分支
  • 故障注入:用激光或电压毛刺让芯片出错,从错误结果反推密钥

我记得有一次帮客户做AES-128的侧信道评估。我们用DPA攻击,采集了10000条功耗曲线,只用了不到两个小时就恢复了全部128位密钥。客户当时脸都绿了——他们之前一直以为软件上做加密就够了。

为什么会这么容易?因为CMOS电路的功耗跟数据相关。当寄存器翻转时,功耗会有一个明显的尖峰。攻击者只要对齐这些尖峰,做统计相关分析,就能把密钥位一个个抠出来。

核心原理: 侧信道攻击利用的是"物理实现"的泄露,而不是"算法"的漏洞。即使算法是数学上完美的,只要芯片在运行,就会有物理痕迹。

防护手段主要有三类:

  1. 隐藏技术:让功耗不依赖数据,比如双轨逻辑、恒定功耗设计
  2. 掩码技术:把敏感数据随机化,每次执行都不同
  3. 噪声注入:在电路中加入随机噪声,降低信噪比

但说实话,没有一种防护是完美的。我见过最狠的方案是"三管齐下"——掩码+隐藏+噪声,攻击者需要采集上亿条曲线才能破解,这时候攻击成本已经超过了密钥本身的价值。

1.4 物理不可克隆函数(PUF)基础

PUF,全称Physical Unclonable Function。名字很唬人,其实原理很简单:利用芯片制造过程中的随机差异,生成唯一的"指纹"。

你想想看,即使同一片晶圆上的两颗芯片,由于掺杂浓度、氧化层厚度、线宽等参数的微小波动,它们的物理特性也是不同的。PUF就是把这些差异"读"出来,变成一串二进制数。

常见的PUF结构:

PUF类型 原理 优点 缺点
仲裁器PUF 两条路径的延迟竞赛 结构简单,面积小 易受建模攻击
环形振荡器PUF 振荡频率的差异 鲁棒性好 功耗高,面积大
SRAM PUF 上电时SRAM单元的初始值 零额外电路 受温度影响大
蝴蝶型PUF 交叉耦合反相器的亚稳态 可在FPGA实现 需要校准

我在一个安全密钥存储项目中用过SRAM PUF。当时的需求是:密钥不能以明文形式存储在非易失存储器中。我们的方案是:每次上电时,用PUF生成一个"根密钥",然后用这个根密钥去解密存储在Flash中的密文密钥。这样,即使芯片被物理拆解,攻击者也拿不到根密钥——因为PUF的响应只在芯片上电时存在,断电就消失了。

注意: PUF不是完美的。温度变化、电压波动、老化效应都会导致PUF响应出现"比特翻转"。所以,PUF输出必须经过纠错码(ECC)处理。我曾经见过一个团队,PUF的原始误码率是15%,没做纠错就直接用,结果芯片在高温下密钥恢复失败——整批产品报废。

PUF的核心指标有三个:

  • 唯一性:不同芯片之间的PUF响应差异要大,通常用"片间汉明距离"衡量
  • 可靠性:同一芯片在不同条件下,PUF响应要稳定,用"片内汉明距离"衡量
  • 不可克隆性:即使知道PUF的设计,也无法制造出两颗PUF响应相同的芯片

下面这张图展示了PUF在安全芯片中的典型应用架构:

PUF在安全芯片中的应用架构 PUF在安全芯片中的应用架构 安全芯片边界 PUF核心 SRAM / 环形振荡器 纠错码(ECC) BCH / 重复码 密钥派生函数 SHA-256 / HMAC 非易失存储 Flash / eFuse 加密引擎 AES-256 / RSA 安全输出 加密数据 / 签名 辅助数据 密钥请求 密钥只在 运行时存在

从这张图可以看出,PUF的典型工作流程是:上电后PUF生成原始响应,经过ECC纠错后,通过密钥派生函数生成根密钥。这个根密钥用来解密存储在Flash中的密文密钥,然后交给加密引擎使用。整个过程,真正的密钥只在芯片运行时存在于易失性电路中,断电即消失。

一句话总结: 硬件安全不是选一个"万能防护",而是根据威胁模型,把木马检测、侧信道防护、PUF等技术组合起来,形成纵深防御。我做了这么多年,最大的体会是——没有绝对安全的芯片,只有足够难攻的芯片。