3、设备安全基线:硬件安全设计原则、安全启动链、固件签名与验证、物理安全防护
大家好,我是老周。做IoT安全这些年,我见过太多设备“裸奔”上线的案例了。很多团队把精力全放在云端和App上,觉得硬件是物理世界的东西,黑客够不着。嗯,这个想法很危险。
设备安全基线,说白了就是给硬件定个“出厂规矩”。你想想看,如果设备本身就不安全,那上层做再多加密、再强的云防护,都是白搭。今天我们就聊聊硬件安全设计的四个核心维度。
核心观点:设备安全基线不是可选项,而是入场券。硬件层面的安全防护,是抵御物理攻击和底层攻击的最后一道防线。
3.1 硬件安全设计原则
硬件设计不像软件,出了问题还能OTA打补丁。芯片一量产,改一次就是几百万的成本。所以,硬件安全必须“设计进去”,而不是“贴上去”。
我个人习惯把硬件安全设计原则归纳为以下五点:
- 最小攻击面原则:能去掉的调试接口(JTAG、SWD)就去掉,不能去掉的就在量产时熔断保险丝。我在项目中遇到过,某款摄像头量产时忘了熔断JTAG,结果被安全研究员直接读出了Flash里的私钥。
- 纵深防御原则:别指望单点防护。即使破解了BootROM,还有安全启动链;即使绕过了安全启动,还有加密存储。一层一层叠起来。
- 安全隔离原则:敏感操作(密钥管理、真随机数生成)必须放在独立的安全元件(SE)或TEE里。主CPU可以被攻破,但SE里的密钥不能被读走。
- 失效安全原则:当检测到物理攻击或异常时,设备应该自动进入安全状态——比如擦除密钥、停止运行。而不是“既然被攻击了,那就放开所有权限”。
- 防篡改可检测原则:外壳被打开、引脚被探针接触,设备应该能感知到,并触发报警或自毁机制。
| 原则 | 核心目标 | 常见实现手段 |
|---|---|---|
| 最小攻击面 | 减少可被利用的接口 | 熔断JTAG、禁用UART、移除未用引脚 |
| 纵深防御 | 多层防护,单点失效不崩溃 | 安全启动 + 加密存储 + 运行时完整性校验 |
| 安全隔离 | 敏感操作与主系统分离 | 独立SE芯片、ARM TrustZone、RISC-V物理内存保护 |
| 失效安全 | 攻击发生时进入安全态 | 电压/温度/时钟异常检测、密钥自毁 |
| 防篡改可检测 | 物理入侵可感知 | 外壳开关、光敏传感器、防拆网格 |
我的经验:很多团队在硬件设计阶段根本不考虑安全,等产品要过认证了才来补。结果发现芯片不支持安全启动,或者没有独立的SE接口,只能换方案重做板子。所以,选型阶段就要把安全基线写进需求文档里。
3.2 安全启动链
安全启动链,是设备固件安全的“第一道门”。它的核心逻辑很简单:从只读的BootROM开始,逐级校验,信任传递。
为什么会这样设计?因为BootROM是芯片出厂时写死的,物理上不可修改。只要BootROM是安全的,它就能校验下一级Bootloader的签名;Bootloader再校验OS内核;OS内核再校验应用固件。这样,整个链条就建立起来了。
我画了一张图,帮你理解这个链条:
安全启动链的常见实现方式有两种:
- 标准安全启动:逐级校验,任何一级失败就停止。适合大多数消费级IoT设备。
- 认证启动:允许加载未签名的固件,但会标记为“未认证”状态,限制某些敏感操作。适合开发调试阶段。
注意:安全启动链的强度取决于最弱的一环。如果BootROM有漏洞(比如缓冲区溢出),那整个链条就崩塌了。所以,选择有良好安全记录的芯片厂商很重要。
3.3 固件签名与验证
安全启动链的核心技术,就是固件签名与验证。说白了,就是给固件打个“数字指纹”,让设备能确认这个固件是官方发布的,没被篡改过。
流程大概是这样的:
- 签名阶段(在开发/构建服务器上完成):
- 计算固件镜像的哈希值(比如SHA-256)。
- 用私钥对哈希值进行签名,生成签名值。
- 将固件镜像 + 签名值 + 公钥证书打包成发布包。
- 验证阶段(在设备上完成):
- 设备从OTP或熔丝中读取预置的公钥。
- 计算接收到的固件镜像的哈希值。
- 用公钥解密签名值,得到原始哈希值。
- 对比两个哈希值:一致则通过,不一致则拒绝。
下面是一个简化的固件签名验证流程示例(伪代码):
// 签名阶段(服务器端)
hash = SHA256(firmware_image)
signature = RSA_SIGN(private_key, hash)
package = firmware_image + signature + certificate
// 验证阶段(设备端)
public_key = read_from_otp()
received_hash = SHA256(received_firmware)
decrypted_hash = RSA_VERIFY(public_key, received_signature)
if received_hash == decrypted_hash:
boot_firmware()
else:
reject_and_halt()
我的建议:私钥一定要放在硬件安全模块(HSM)里,或者至少放在离线的、有物理防护的服务器上。我曾经见过一个团队,把私钥放在一个共享的Git仓库里……嗯,后果可想而知。
关于签名算法,目前主流的选择是:
| 算法 | 密钥长度 | 安全性 | 适用场景 |
|---|---|---|---|
| RSA | 2048/4096位 | 高 | 资源较丰富的设备(网关、摄像头) |
| ECDSA | 256/384位 | 高(同等安全强度下密钥更短) | 资源受限设备(传感器、智能灯泡) |
| Ed25519 | 256位 | 非常高 | 新一代IoT设备,性能和安全性兼顾 |
3.4 物理安全防护
很多人觉得物理攻击离自己很远。你想想看,谁会拿着探针去拆你的智能灯泡?但事实上,对于高价值设备(比如智能门锁、工业控制器、医疗设备),物理攻击是真实存在的威胁。
物理安全防护,主要针对以下几类攻击:
- 侧信道攻击:通过分析功耗、电磁辐射、运行时间来推断密钥。防护手段包括:加噪、恒定时间算法、屏蔽罩。
- 故障注入攻击:通过电压毛刺、时钟毛刺、激光照射来干扰芯片运行,跳过安全检查。防护手段包括:电压/时钟/温度监控器、冗余计算。
- 探针攻击:直接接触芯片引脚或内部走线,读取数据。防护手段包括:顶层金属网格、防拆涂层、封装灌胶。
- 逆向工程:逐层打磨芯片,用显微镜拍照分析。防护手段包括:逻辑加密、布局混淆、主动金属层。
避坑指南:我曾经评估过一款智能门锁,它的安全芯片号称有“防拆保护”。结果我们发现,只要用热风枪吹一下芯片旁边的光敏传感器,设备就以为“外壳没被打开”,直接放行了所有操作。所以,物理防护一定要做完整,不能留死角。
物理安全防护的等级,通常按照FIPS 140-2/140-3或Common Criteria的标准来划分。对于大多数消费级IoT设备,做到Level 2(防篡改检测 + 密钥自毁)就足够了。但对于金融支付或政府类设备,可能需要Level 3甚至Level 4。
最后说一句:硬件安全没有银弹。安全启动链、固件签名、物理防护,每一层都有它的价值,但也都有它的局限。真正的安全,是把这些技术组合起来,形成一个完整的防御体系。嗯,这就是设备安全基线的核心思想。