验证链从哪里开始

计算机启动时,会依次运行固件、引导程序和操作系统内核等组件。安全启动让已经处于信任基础内的组件,在把控制权交给下一组件之前,按既定策略检查它。验证可以利用数字签名确认映像与获信任签名者的关系,也可以按策略核对获准的映像摘要。

这种链条必须有起点:最初执行的验证逻辑、信任数据及其保护机制不能再由同一条链无限向前证明。UEFI Secure Boot主要规范UEFI映像的授权检查,并不单凭一个开关就证明全部早期硬件、固件及操作系统均可信。

以Windows为例,UEFI阶段验证引导组件,随后Windows Trusted Boot继续检查内核及后续启动组件。这些阶段相互衔接,但固件的安全启动与操作系统自己的验证职责仍应区分,不能把某一平台的全部启动安全功能都叫作UEFI Secure Boot。

参考:[2] [3] [4]

密钥与签名数据库的职责

UEFI用平台密钥PK体现平台对安全策略管理的控制,并用密钥交换密钥数据库KEK管理可授权更新签名数据库的密钥。它们主要控制谁可以修改信任策略,不应被理解为所有启动映像都必须直接用PK签名。

允许数据库db保存可接受的签名者或映像摘要;禁止数据库dbx保存不再允许的签名者或摘要。若映像同时落入允许与禁止条件,禁止项优先。因而判断不仅是“签名在数学上是否正确”,还包括签名者或映像是否仍被当前策略接受。

在正常受保护的运行模式中,这些变量的更新需要符合认证要求;初始设置等模式另有规则。数据库及验证逻辑本身也必须受到保护,否则攻击者若能任意更换信任数据,后续的签名检查就失去原有意义。

参考:[1] [2]

为什么需要撤销和更新

获授权的软件仍可能在后来被发现存在漏洞,签名密钥也可能失去可信性。撤销更新让平台能够拒绝此前被接受的特定映像或签名者,而不必假定所有旧签名永久有效。这说明安全启动是一项需要维护的策略,而不是设备出厂时完成一次配置就永远不变。

例如一个旧引导程序曾合法签名,但存在已知缺陷,攻击者可能借它进入后续启动流程。仅重新验证旧签名不能识别这种风险;更新后的禁止数据库才可能让它不再被加载。更新同时需要考虑仍依赖旧组件的启动介质和恢复路径,避免把“拒绝旧代码”误当成没有兼容性代价的动作。

参考:[1] [2]

与加密和度量启动的区别

磁盘加密保护存储数据的机密性,安全启动限制启动时执行什么代码,目标并不相同。系统可以把解密密钥的释放与平台状态联系起来,但这种组合不意味着安全启动本身已经加密磁盘,也不意味着磁盘加密已经检查每个启动组件。

度量启动则记录组件或配置的度量值,常把摘要扩展进可信平台模块的PCR,并形成可供后续判断的证据。记录“启动了什么”与在加载前决定“允许启动什么”是不同职责;度量结果还需要与可信基准及策略比较。

最终,签名验证说明映像符合所选信任策略和完整性检查,不是对程序行为的全面证明。合法签名代码可能有缺陷,启动之后也可能遭受攻击,因此安全启动不能替代补丁、访问控制和运行时防护,更不能作为整个系统绝无恶意行为的保证。

参考:[2] [3] [4]