在引导 GRUB2 的 EFI 系统上,我想创建一个只读 EFI 变量。这可能吗?
谢谢,垫
根据Uefi 规范 2.7,通过不提供 EFI_VARIABLE_NON_VOLATILE 属性,可以直接在 ExitBootServices() 后创建只读 UEFI 变量。
参见章节“8.2 变量服务”SetVariable() 描述:
执行 ExitBootServices() 后,只有设置了 EFI_VARIABLE_RUNTIME_ACCESS 和 EFI_VARIABLE_NON_VOLATILE 的变量才能使用 SetVariable() 进行设置。一旦执行 ExitBootServices(),具有运行时访问但非非易失性的变量是只读数据变量。
另见章节'8.2 变量服务' GetVariable() 相关定义:
//*******************************************************
// Variable Attributes
//*******************************************************
#define EFI_VARIABLE_NON_VOLATILE 0x00000001
根据UEFI 规范 2.5,没有直接创建只读 UEFI 变量的方法。
通过使用具有以下属性的变量可以实现预期的结果:EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS 和 EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS。
根据 UEFI Spec 2.5 的第 7.2 章(SetVariable 描述部分):
(...) 尝试删除使用 EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS 或 EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS 属性创建的变量,如果指定的 AuthInfo 验证失败或使用 DataSize 为零调用时,将失败并返回 EFI_SECURITY_VIOLATION 状态。
根据第 7.2.1 章(使用 EFI_VARIABLE_AUTHENTICATION_2 描述符),在描述变量更新过程的长过程之后:
只有当所有这些检查都通过时,驱动程序才会更新变量的值。如果任何检查失败,固件必须返回 EFI_SECURITY_VIOLATION。
总之,没有身份验证就不可能删除或修改使用 *_WRITE_ACCESS 属性创建的变量。GetVariable
将返回正确的值,在属性中指示返回的变量在更新或删除之前需要身份验证。有关详细信息,请阅读 UEFI Spec 2.5 第 7.2.1 和 7.2.2 章。