在引导GRUB2的EFI系统上,我想创建一个只读的EFI变量。这可能吗?
谢谢, 垫
答案 0 :(得分:2)
根据UEFI Specification 2.5,没有直接创建只读UEFI变量的方法。
使用 Attributes 的变量可以实现预期结果: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规范2.5章7.2.1和7.2.2。
答案 1 :(得分:1)
根据Uefi Specification 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