一、什么是UEFI安全启动?

图1 UEFI固件的位置

图2 UEFI启动过程

图3 UEFI潜在攻击点
安全启动中的重要概念是允许签名数据库 (db) 和禁止签名数据库 (dbx)。允许签名数据存储机器固件允许加载的受信任boot loader和 EFI 应用程序的哈希值和证书。禁止签名数据库 (dbx)存储已撤销、受损和不可信任的哈希值和证书。任何使用禁止dbx密钥加载签名代码的尝试,或在哈希值与禁止dbx条目匹配的情况下,都会导致启动失败。对db和dbx的签名,需要用到密钥注册密钥数据库 (KEK)和平台密钥数据库 (PK)。

图4 db与dbx

图5 安全启动涉及的密钥
二、开启了安全启动的系统就绝对安全吗?
内存相关漏洞:2022年1月,研究者发现了名为“baton drop”的安全启动漏洞(CVE-2022-21894)[3]。Windows 启动应用程序允许通过设置“truncatememory”移除包含序列化数据相关的内存块,从而绕过安全启动。Truncatememory BCD 元素将从内存映射中删除指定物理地址以上的所有内存内容。在从内存读取序列化的安全启动策略之前,攻击者会在初始化过程中对每个启动应用程序执行此操作。尽管微软很快修复了此漏洞,但由于受影响的UEFI二进制没有被撤销,“baton drop”攻击在很长的一段时间内仍然可被利用,产生了相关联的漏洞[4]。直到2023年5月,微软才给出处理建议[5]。

图6 微软修复过程

图7 微软修复涉及撤销相关漏洞的过程

图8 UEFI安全启动漏洞
三、如何控制安全启动的密钥来预防Bootkits?
完全定制化的安全启动将会移除所有安全启动的密钥,并且只使用用户自己的密钥,所有启动的组件都由客户的密钥签名。完全定制化的安全启动对用户而言,往往很难维护。
而部分定制化的安全启动则允许用户将自己的密钥追加进PK、KEK数据库中,当发现安全漏洞时,用户可以提前一步,将恶意程序的hash写入到dbx中,避免了微软/OEM厂商的漫长的响应。而对于只用Linux的用户而言,还可以将windows UEFI CA从db数据库中移除,进而降低攻击面。
从上述的自定义安全启动可以看出,其实质是重新控制安全启动的密钥。笔者总结了如下益处:
四、总结
参考文献
[1] https://mp.weixin.qq.com/s/wucSVNYYeg5d5fQ1I1cnAQ
[2] https://mp.weixin.qq.com/s/showAKatT3TsN11aWRD9GQ
[3] https://nvd.nist.gov/vuln/detail/CVE-2022-21894
[4] https://nvd.nist.gov/vuln/detail/CVE-2023-24932
[5] KB5025885: How to manage the Windows Boot Manager revocations for Secure Boot changes associated with CVE-2023-24932 – Microsoft Support
[6] https://nvd.nist.gov/vuln/detail/CVE-2020-7205
[7] https://nvd.nist.gov/vuln/detail/CVE-2020-26200
[8] https://nvd.nist.gov/vuln/detail/CVE-2022-343010
[9] https://nvd.nist.gov/vuln/detail/CVE-2022-34303
[10] https://nvd.nist.gov/vuln/detail/CVE-2022-34302
[11] https://nvd.nist.gov/vuln/detail/CVE-2022-3431