《固件安全基线自查清单课程》
第3章 固件存储安全基线
3. 固件存储安全基线:加密存储、密钥管理、安全启动(Secure Boot)原理
固件存储安全是设备安全的第一道防线。本基线从加密存储、密钥管理和安全启动三个核心维度出发,确保固件在静态存储、动态加载及运行时的完整性与机密性。以下内容将结合原理讲解、检查清单与可视化图表,帮助您系统化地建立固件存储安全基线。
3.1 加密存储:保护固件静态数据
📌 核心要求
- 算法标准:必须使用经过认证的对称加密算法(如 AES-256-GCM)对固件镜像进行加密。
- 存储分区:固件存储区(如 SPI Flash)应启用硬件加密引擎或软件加密层,防止物理读取。
- 密钥分离:加密密钥不得与固件存储在同一个物理介质中,必须使用独立的安全元件或 eFuse。
- 完整性校验:加密后的固件需附带 HMAC 或 GCM 认证标签,防止篡改。
| 检查项 | 要求 | 验证方法 |
|---|---|---|
| 加密算法强度 | AES-256 或更高级别 | 查看固件构建配置 |
| 加密模式 | GCM / CCM(带认证) | 代码审计 |
| 密钥存储位置 | HSM / TPM / eFuse | 硬件安全模块检测 |
| 固件分区加密 | 100% 加密(除引导区外) | 固件镜像分析 |
3.2 密钥管理:安全生命周期
📌 核心要求
- 密钥生成:必须在硬件安全模块(HSM)或安全芯片内部生成,禁止软件生成。
- 密钥存储:私钥/对称密钥必须存储在防篡改硬件中(如 TPM、eFuse、OTP)。
- 密钥使用:密钥仅在安全边界内使用,固件运行时无法直接读取明文密钥。
- 密钥销毁:设备退役时,必须支持安全擦除或物理销毁密钥存储区。
| 检查项 | 要求 | 验证方法 |
|---|---|---|
| 密钥生成环境 | HSM 或安全芯片内部 | 生产流程审计 |
| 密钥存储介质 | TPM / eFuse / OTP | 硬件设计审查 |
| 密钥访问控制 | 仅授权安全组件可调用 | 权限配置检查 |
| 密钥备份与恢复 | 加密备份,严格管控 | 备份策略文档 |
3.3 安全启动(Secure Boot)原理
📌 核心要求
- 信任链:从 BootROM 开始,逐级验证每一阶段固件的数字签名,形成不可中断的信任链。
- 公钥固化:根公钥必须烧录在一次性可编程(OTP)存储器中,不可更改。
- 防回滚:必须实现版本号检查机制,防止攻击者加载旧版本固件(降级攻击)。
- 失败策略:签名验证失败时,必须进入安全恢复模式或停止启动,不得执行未经验证的代码。
| 检查项 | 要求 | 验证方法 |
|---|---|---|
| 信任链完整性 | BootROM → Bootloader → OS | 启动日志分析 |
| 根公钥存储 | OTP / eFuse | 硬件设计审查 |
| 签名算法 | RSA-4096 或 ECDSA P-384 | 固件签名工具配置 |
| 防回滚机制 | 版本号计数器 | 固件更新测试 |
| 验证失败处理 | 停止启动 / 进入恢复模式 | 故障注入测试 |
3.4 综合实践建议
📌 实施要点
- 加密存储 + 安全启动联动:加密存储保护静态数据,安全启动保护动态加载过程,两者缺一不可。
- 密钥分级:使用设备唯一密钥(Device Unique Key)加密固件,使用根密钥签名固件,实现职责分离。
- 硬件加速:优先使用芯片内置的硬件加密引擎和安全启动模块,避免软件实现带来的侧信道风险。
- 持续监控:在固件运行时定期校验关键分区的完整性,防止运行时篡改。
💻 安全启动验证伪代码示例
// 安全启动验证流程(伪代码)
function secure_boot():
root_public_key = read_otp(ROOT_KEY_ADDR) // 从 OTP 读取根公钥
// 阶段1:验证 Bootloader
bootloader_sig = read_flash(BOOTLOADER_SIG_ADDR)
bootloader_hash = hash(read_flash(BOOTLOADER_ADDR))
if !verify_signature(root_public_key, bootloader_hash, bootloader_sig):
halt("Bootloader 签名验证失败!")
// 阶段2:验证 OS Kernel
os_sig = read_flash(OS_SIG_ADDR)
os_hash = hash(read_flash(OS_ADDR))
bootloader_public_key = extract_public_key(bootloader)
if !verify_signature(bootloader_public_key, os_hash, os_sig):
halt("OS 内核签名验证失败!")
// 阶段3:检查版本号(防回滚)
current_version = read_flash(VERSION_ADDR)
if current_version < stored_version:
halt("固件版本回滚检测!")
start_os() // 启动操作系统