1、可信根与信任链:什么是可信根,信任链传递模型,从硬件到OS的完整闭环
各位同学,咱们今天聊点硬核的——可信开机。说白了,就是你的电脑从按下电源键到进入操作系统,这中间到底有没有被篡改过。你可能会想:“我装个杀毒软件不就行了?”嗯,没那么简单。
我做了十几年安全固件,见过太多“看起来正常,其实早就被攻破”的机器。有一次客户说他们的服务器怎么查都查不出问题,但数据就是会泄露。最后我让他们把BIOS芯片拆下来读了一遍——好家伙,启动代码里被人塞了个后门。从那以后,我就特别重视一件事:信任,必须从最底层开始建立。
1.1 什么是可信根(Root of Trust)
可信根,英文叫 Root of Trust,简称 ROT。它是整个安全体系的起点。你想想看,如果起点都不安全,后面再怎么加固也没用。
可信根必须满足三个条件:
- 不可篡改——它本身不能被修改
- 不可伪造——别人造不出一个假的来冒充
- 行为可预测——它只会做你设计好的那几件事
在PC和服务器领域,可信根通常固化在硬件里。最常见的形式是:
| 可信根类型 | 载体 | 典型实现 |
|---|---|---|
| 硬件可信根 | TPM芯片 | TPM 2.0,内部有不可导出的私钥 |
| 固件可信根 | Boot ROM | CPU内部固化的一段只读代码 |
| 测量可信根 | PCR寄存器 | TPM内部的平台配置寄存器 |
| 存储可信根 | 非易失性存储 | TPM内部的NVRAM,用于存密钥 |
| 报告可信根 | 身份认证密钥 | EK(Endorsement Key)证书 |
核心要点:可信根不是软件概念,它是物理存在的。你没法通过打补丁来“安装”一个可信根。它必须在芯片设计阶段就做进去。
1.2 信任链传递模型
有了可信根,下一步就是怎么把信任“传递”出去。这就引出了信任链的概念。
信任链的传递逻辑其实很简单:前一个环节验证后一个环节的完整性,验证通过后才把控制权交出去。一环扣一环,像链条一样。
我习惯把它分成四个层级:
- 硬件层——CPU的Boot ROM是第一个执行代码,它验证BIOS/UEFI固件的签名
- 固件层——UEFI固件验证Option ROM、引导加载程序(Bootloader)
- 引导层——Bootloader验证操作系统内核
- 系统层——操作系统内核验证驱动、模块、安全策略
这里有个关键点:每一层只信任上一层的验证结果。如果Boot ROM说BIOS是好的,那BIOS就是好的。如果BIOS说Bootloader是好的,那Bootloader就是好的。一旦中间某个环节被跳过或伪造,整个信任链就断了。
我曾经踩过的坑:有一次做项目,Boot ROM验证BIOS签名时只检查了前256KB,后面的代码没管。攻击者正好利用这个漏洞,把恶意代码塞在256KB之后。启动时签名验证通过了,但实际执行的是被篡改过的代码。从那以后,我要求所有签名验证必须覆盖整个固件镜像,不能留死角。
1.3 从硬件到OS的完整闭环
好,咱们把上面说的串起来,看看一条完整的可信启动链长什么样。
下面这张图是我自己画的,把整个流程拆成了七个关键步骤:
这张图里有个细节我想强调一下:闭环。很多人以为可信启动到OS加载完就结束了,其实不是。OS启动后,它需要向远程服务器报告自己的PCR值,证明自己是从一个可信的状态启动的。这就是远程证明(Remote Attestation)。
换句话说,信任链不是一条直线,它是一个环。硬件信任根 -> 固件 -> 引导程序 -> 内核 -> 安全策略 -> 远程证明 -> 回到信任根。只有形成闭环,才能说这个系统是真正可信的。
1.4 实际项目中的落地方式
讲了这么多理论,咱们看看实际项目中怎么落地。我参与过几个国产化可信启动项目,总结下来,核心就三件事:
- 选对可信根——用TPM 2.0还是用国产TCM?我个人建议优先选TPM 2.0,生态成熟,工具链完善。如果政策要求必须用国产,那就选TCM,但要做好适配工作。
- 配置Secure Boot——UEFI Secure Boot是必须开的。我见过太多机器出厂时Secure Boot是关闭的,理由是“方便测试”。结果呢?机器到客户手里就再也没开过。
- 建立度量日志——每次启动都要记录PCR的扩展过程。出了问题,靠日志回溯,看是哪个环节被篡改了。
一个小技巧:在UEFI固件里加一个自定义的EFI变量,用来记录最后一次成功启动的PCR值。下次启动时先比对,如果PCR值变了但没触发告警,那说明你的度量链可能被人绕过了。这个技巧我在好几个项目里都用过,效果不错。
1.5 常见误区与避坑指南
最后,我列几个常见的误区,都是我在项目里亲眼见过的:
| 误区 | 实际情况 | 我的建议 |
|---|---|---|
| 可信根可以用软件实现 | 软件可信根可以被篡改,等于没有 | 必须用硬件可信根,TPM或TCM |
| Secure Boot开了就安全了 | Secure Boot只验证签名,不验证内容 | 配合Measured Boot,记录所有度量值 |
| 信任链只到内核加载 | 内核加载后的模块也需要验证 | 启用内核模块签名验证(如dm-verity) |
| PCR值不变就说明没被攻击 | 攻击者可以重放旧的PCR值 | 结合Nonce和远程证明,防止重放攻击 |
嗯,这一章的内容就到这儿。可信根和信任链是整个可信计算体系的基石,后面的所有章节都会基于这个模型展开。你先把这张图刻在脑子里,后面学起来会轻松很多。