efi: Fallback to legacy mode if shim is loaded on x86 archs

The LoadImage() provided by the shim does not consult MOK when loading
an image. So, simply signature verification fails when it should not.
This means we cannot use Linux EFI stub to start the kernel when the
shim is loaded. We have to fallback to legacy mode on x86 architectures.
This is not possible on other architectures due to lack of legacy mode.

This is workaround which should disappear when the shim provides
LoadImage() which looks up MOK during signature verification.

On the occasion align constants in include/grub/efi/sb.h.

Signed-off-by: Daniel Kiper <daniel.kiper@oracle.com>
Reviewed-by: Ard Biesheuvel <ardb@kernel.org>
This commit is contained in:
Daniel Kiper committed 2023-07-03 14:29:22 +02:00
1 parent 7082a5ca8a
commit 6425c12cd7
3 files changed
+30

No files matched your search

+10
View File
@@ -32,6 +32,8 @@
static grub_guid_t shim_lock_guid = GRUB_EFI_SHIM_LOCK_GUID; static grub_guid_t shim_lock_guid = GRUB_EFI_SHIM_LOCK_GUID;
static bool shim_lock_enabled = false;
/* /*
* Determine whether we're in secure boot mode. * Determine whether we're in secure boot mode.
* *
@@ -215,6 +217,14 @@ grub_shim_lock_verifier_setup (void)
/* Enforce shim_lock_verifier. */ /* Enforce shim_lock_verifier. */
grub_verifier_register (&shim_lock_verifier); grub_verifier_register (&shim_lock_verifier);
shim_lock_enabled = true;
grub_env_set ("shim_lock", "y"); grub_env_set ("shim_lock", "y");
grub_env_export ("shim_lock"); grub_env_export ("shim_lock");
} }
bool
grub_is_shim_lock_enabled (void)
{
return shim_lock_enabled;
}
+17
View File
@@ -29,6 +29,7 @@
#include <grub/efi/fdtload.h> #include <grub/efi/fdtload.h>
#include <grub/efi/memory.h> #include <grub/efi/memory.h>
#include <grub/efi/pe32.h> #include <grub/efi/pe32.h>
#include <grub/efi/sb.h>
#include <grub/i18n.h> #include <grub/i18n.h>
#include <grub/lib/cmdline.h> #include <grub/lib/cmdline.h>
#include <grub/verify.h> #include <grub/verify.h>
@@ -458,6 +459,22 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)),
grub_dl_ref (my_mod); grub_dl_ref (my_mod);
if (grub_is_shim_lock_enabled () == true)
{
#if defined(__i386__) || defined(__x86_64__)
grub_dprintf ("linux", "shim_lock enabled, falling back to legacy Linux kernel loader\n");
err = grub_cmd_linux_x86_legacy (cmd, argc, argv);
if (err == GRUB_ERR_NONE)
return GRUB_ERR_NONE;
else
goto fail;
#else
grub_dprintf ("linux", "shim_lock enabled, trying Linux kernel EFI stub loader\n");
#endif
}
if (argc == 0) if (argc == 0)
{ {
grub_error (GRUB_ERR_BAD_ARGUMENT, N_("filename expected")); grub_error (GRUB_ERR_BAD_ARGUMENT, N_("filename expected"));
+3
View File
@@ -31,6 +31,9 @@
extern grub_uint8_t extern grub_uint8_t
EXPORT_FUNC (grub_efi_get_secureboot) (void); EXPORT_FUNC (grub_efi_get_secureboot) (void);
extern bool
EXPORT_FUNC (grub_is_shim_lock_enabled) (void);
extern void extern void
grub_shim_lock_verifier_setup (void); grub_shim_lock_verifier_setup (void);
#else #else