
UEFI shim loader
shim 是一个简单的 EFI 应用程序,运行时它会尝试打开并执行另一个应用程序。它最初会尝试通过标准的 EFI LoadImage() 和 StartImage() 调用来完成此操作。如果这些调用失败(例如,因为启用了安全启动且二进制文件未使用相应的密钥签名),它将根据内置证书验证该二进制文件。如果验证成功并且该二进制文件或签名密钥未被禁止,shim 将重定位并执行该二进制文件。
shim 还会安装一个协议,允许第二阶段的引导加载程序执行类似的二进制验证。该协议具有 shim.h 头文件中描述的 GUID,并提供一个单一的入口点。在 64 位系统上,此入口点期望使用 SysV ABI 而非 MSABI 进行调用,因此不应包装对它的调用。
自版本 16.1 起,shim 会覆盖系统表并安装其自身版本的 LoadImage()/StartImage()/UnloadImage()/Exit() 函数,以便第二阶段可以直接从系统表调用它们,并且无论 shim 是否为第一阶段都能正常工作,而无需在第二阶段中包含 shim 专用代码。
安装此协议后,即使嵌套内核未签名,也可以加载已签名的 UKI Unified Kernel Images。因为在 UKI 被加载并验证后,shim 会构建一个包含 UKI 中所有节的内部允许列表。当从这样的节加载映像时,将根据拒绝列表(在撰写本文时为 DBX/MOKX/SBAT)进行验证,但不会根据允许列表(DB/MOK 哈希/签名)进行检查,因为外部映像已经过验证,因此内部映像已受那些签名或哈希覆盖。此外,内部映像不会被 TPM 度量,以避免重复度量。
在启用了 TPM 芯片且系统固件支持该芯片的系统上,shim 将使用其正在加载的目标的摘要扩展各种 PCR。完整列表见文件 README.tpm。
要使用 shim,只需将 DER 编码的公钥证书放入诸如 pub.cer 之类的文件中,并使用 make VENDOR_CERT_FILE=pub.cer 进行构建。
有几个构建选项,以及几种自定义构建的方式,详见 BUILDING。
请参阅测试计划,如有任何失败,请提交工单!
如果因安全事件或漏洞需要联系开发人员,请发送邮件至 [email protected]。