bootctl: calculate secureboot state taking MokSBStateRT into account (#39298)
shim is often used as part of the EFI boot chain with Linux kernels. shim has an option to disable all verification of binaries it loads. This can be performed by end-user using mokutil / mokmanager EFI app, which set BootServices only variable MokSBState. shim honors that, and mirrors it as readonly MokSBStateRT for the post-ExitBootService access. Thus presense of MokSBStateRT is an indicator that shim was used during boot chain. Some OEM vendors are known to set MokSBState variable, without user having done so. When verification is disabled, one should assume secureboot is insecure, because any EFI binary was allowed to run, including but not limited to unsigned or revoked: - grub - systemd-boot - UKI - linux kernel Linux kernel also has code to check this variable, and correctly report that Secure Boot is disabled, see: - https://github.com/torvalds/linux/blob/3a8660878839faadb4f1a6dd72c3179c1df56787/drivers/firmware/efi/libstub/secureboot.c#L57 With this change bootctl output changes like this: ```diff System: Firmware: n/a (n/a) Firmware Arch: x64 - Secure Boot: enabled (user) + Secure Boot: disabled (insecure) TPM2 Support: yes Measured UKI: no Boot into FW: supported ``` This implementation is trying to mimic mokutil behaviour like this one: ``` $ mokutil --sb-state SecureBoot enabled SecureBoot validation is disabled in shim ``` As well as the linux kernel behavior of: ``` $ journalctl -b | grep 'Secure boot disabled' kernel: Secure boot disabled ``` Note that MokSBState is extended into PCR7 as well as also into PCR14. For more details see https://github.com/rhboot/shim/blob/main/README.tpm
This commit is contained in:
+4
-3
@@ -377,10 +377,11 @@ SecureBootMode efi_get_secure_boot_mode(void) {
|
||||
int audit = read_flag(EFI_GLOBAL_VARIABLE_STR("AuditMode"));
|
||||
int deployed = read_flag(EFI_GLOBAL_VARIABLE_STR("DeployedMode"));
|
||||
int setup = read_flag(EFI_GLOBAL_VARIABLE_STR("SetupMode"));
|
||||
log_debug("Secure boot variables: SecureBoot=%d AuditMode=%d DeployedMode=%d SetupMode=%d",
|
||||
secure, audit, deployed, setup);
|
||||
int moksb = read_flag(EFI_SHIMLOCK_VARIABLE_STR("MokSBStateRT"));
|
||||
log_debug("Secure boot variables: SecureBoot=%d AuditMode=%d DeployedMode=%d SetupMode=%d MokSBStateRT=%d",
|
||||
secure, audit, deployed, setup, moksb);
|
||||
|
||||
return (cache = decode_secure_boot_mode(secure, audit > 0, deployed > 0, setup > 0));
|
||||
return (cache = decode_secure_boot_mode(secure, audit > 0, deployed > 0, setup > 0, moksb > 0));
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
@@ -15,6 +15,8 @@
|
||||
#define EFI_VENDOR_DATABASE_STR SD_ID128_MAKE_UUID_STR(d7,19,b2,cb,3d,3a,45,96,a3,bc,da,d0,0e,67,65,6f)
|
||||
#define EFI_VENDOR_SYSTEMD SD_ID128_MAKE(8c,f2,64,4b,4b,0b,42,8f,93,87,6d,87,60,50,dc,67)
|
||||
#define EFI_VENDOR_SYSTEMD_STR SD_ID128_MAKE_UUID_STR(8c,f2,64,4b,4b,0b,42,8f,93,87,6d,87,60,50,dc,67)
|
||||
#define EFI_VENDOR_SHIMLOCK SD_ID128_MAKE(60,5d,ab,50,e0,46,43,00,ab,b6,3d,d8,10,dd,8b,23)
|
||||
#define EFI_VENDOR_SHIMLOCK_STR SD_ID128_MAKE_UUID_STR(60,5d,ab,50,e0,46,43,00,ab,b6,3d,d8,10,dd,8b,23)
|
||||
|
||||
#define EFI_VARIABLE_NON_VOLATILE UINT32_C(0x00000001)
|
||||
#define EFI_VARIABLE_BOOTSERVICE_ACCESS UINT32_C(0x00000002)
|
||||
@@ -30,6 +32,7 @@
|
||||
#define EFI_GLOBAL_VARIABLE_STR(name) EFI_VENDOR_VARIABLE_STR(EFI_VENDOR_GLOBAL_STR, name)
|
||||
#define EFI_LOADER_VARIABLE_STR(name) EFI_VENDOR_VARIABLE_STR(EFI_VENDOR_LOADER_STR, name)
|
||||
#define EFI_SYSTEMD_VARIABLE_STR(name) EFI_VENDOR_VARIABLE_STR(EFI_VENDOR_SYSTEMD_STR, name)
|
||||
#define EFI_SHIMLOCK_VARIABLE_STR(name) EFI_VENDOR_VARIABLE_STR(EFI_VENDOR_SHIMLOCK_STR, name)
|
||||
|
||||
#define EFIVAR_PATH(variable) "/sys/firmware/efi/efivars/" variable
|
||||
#define EFIVAR_CACHE_PATH(variable) "/run/systemd/efivars/" variable
|
||||
|
||||
Reference in New Issue
Block a user