BIOS 的安全更新

以下资料节选自谈谈 secure flash – 知乎 (zhihu.com)

BIOS 更新认证

FW 更新一般有本地在线更新和基于下次重启更新两种方法。有带外管理的一般还提供带外更新的方式。本地在线更新是通过发起 sw smi 进入 smm 模式,运行 smm code 完成更新,BIOS image 认证过程在 smm code 里完成。基于下次重启的更新,假如 BIOS 在某种情况下,进入 recovery 模式,则需要在下次重启过程中更新 BJOS image,这种情况 BIOS image 的认证过程是在 boot block 里的 recovery 代码中完成的。不管哪种更新方式(强刷除外),都需要验证 BIOS image 的真实性和完整性。

验证 BIOS image 的真实性和完整性需要给 BIOS image 签名,以 RSA2048 算法为例,使用 openssl 生成私钥 pri.pem,

openssl genrsa -out pri.pem 2048

openssl 生成的私钥是含有公钥部分的,可通过命令从私钥里提取出公钥,

openssl rsa -in pri.pem -pubout -out pub.pem

这就有了私钥 pri.pem,公钥 pub.pem。

验证通常是使用私钥签名,公钥验证签名,总体过程是:

  1. 计算 BIOS image 的 hash
  2. 用私钥 pri.pem 加密 hash,得到摘要(digest)
  3. 验证方使用公钥 pub.pem 解密摘要(digest),得到 BIOS image 的 hash
  4. 对比两个 hash 是否一致,一致则通过验证

为什么要先计算 BIOS image 的 hash?是因为 RSA 算法都是针对数字的,任何形式的文件都需要转换成数字才能运用 RSA 算法。得到 hash 值的算法很多,MD5,SHA256 等,这里不提。

对于 BIOS 安全更新来说,验证方应该是机器本身存在的 BIOS,被验证方是即将用于更新的 BIOS image。被验证的 BIOS image 应该在 build 完成时,使用私钥 pri.pem 签名。更新过程中,更新工具/程序获取机器当前运行 BIOS 的公钥 pub.pem,去验证经私钥 pri.pem 签名后的 BIOS image,验证通过则允许更新,验证失败则拒绝更新。不难看出,BIOS image 文件应该包含这组用于签名和验签的密钥对。

那这组密钥对是怎么在 BIOS image 中存放的呢?有两种方式:

  1. 附加在 BIOS image 的头部
  2. 将签名信息形成 .ffs 文件,然后放入 BIOS image 中的 FV(firmware volume)中

方式 1 直接将签名信息附加在 BIOS image 的头部,会增加 BIOS image 的大小。方式 2 不会增加 image 的大小,存放公钥的 .ffs 文件应置于 boot block 中。这样做的好处是如果 BIOS 损坏了,走 recovery 通道,还是可以验证要更新的 BIOS image 的。存放 capsule header、rom layout、signature 的 .ffs 文件一般置于 main block。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注