如何创建UEFI只读变量?

时间:2015-10-13 21:39:09

标签: grub uefi

在引导GRUB2的EFI系统上,我想创建一个只读的EFI变量。这可能吗?

谢谢, 垫

2 个答案:

答案 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