On Wed, 28 Jun 2023 at 15:29, Daniel Kiper <daniel.ki...@oracle.com> wrote:
>
> 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.ki...@oracle.com>
> ---
>  grub-core/kern/efi/sb.c      | 10 ++++++++++
>  grub-core/loader/efi/linux.c | 13 +++++++++++++
>  include/grub/efi/sb.h        |  5 ++++-
>  3 files changed, 27 insertions(+), 1 deletion(-)
>
> diff --git a/grub-core/kern/efi/sb.c b/grub-core/kern/efi/sb.c
> index 80cfa0888..60550a6da 100644
> --- a/grub-core/kern/efi/sb.c
> +++ b/grub-core/kern/efi/sb.c
> @@ -32,6 +32,8 @@
>
>  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.
>   *
> @@ -215,6 +217,14 @@ grub_shim_lock_verifier_setup (void)
>    /* Enforce shim_lock_verifier. */
>    grub_verifier_register (&shim_lock_verifier);
>
> +  shim_lock_enabled = true;
> +
>    grub_env_set ("shim_lock", "y");
>    grub_env_export ("shim_lock");
>  }
> +
> +bool
> +grub_is_shim_lock_enabled (void)
> +{
> +  return shim_lock_enabled;
> +}
> diff --git a/grub-core/loader/efi/linux.c b/grub-core/loader/efi/linux.c
> index c1eef7c98..5fb2ad01f 100644
> --- a/grub-core/loader/efi/linux.c
> +++ b/grub-core/loader/efi/linux.c
> @@ -29,6 +29,7 @@
>  #include <grub/efi/fdtload.h>
>  #include <grub/efi/memory.h>
>  #include <grub/efi/pe32.h>
> +#include <grub/efi/sb.h>
>  #include <grub/i18n.h>
>  #include <grub/lib/cmdline.h>
>  #include <grub/verify.h>
> @@ -458,6 +459,18 @@ grub_cmd_linux (grub_command_t cmd __attribute__ 
> ((unused)),
>
>    grub_dl_ref (my_mod);
>
> +#if defined(__i386__) || defined(__x86_64__)
> +  if (grub_is_shim_lock_enabled () == true)
> +    {
> +      err = grub_cmd_linux_x86_legacy (cmd, argc, argv);
> +

Even if we only have a fallback on x86, we may encounter this
condition on other architectures too, so I think the check should be
generic, and only the fallback specific.

Not sure what to do on other architecures, though - there is no
backward compatibility concern here (at least not wrt users of
mainline GRUB), so we could still *try* to use the firmware's
loadimage/startimage, but perhaps issue a diagnostic message at the
very least?


> +      if (err == GRUB_ERR_NONE)
> +       return GRUB_ERR_NONE;
> +      else
> +       goto fail;
> +    }
> +#endif
> +
>    if (argc == 0)
>      {
>        grub_error (GRUB_ERR_BAD_ARGUMENT, N_("filename expected"));
> diff --git a/include/grub/efi/sb.h b/include/grub/efi/sb.h
> index 30c4335bb..49a9ad01c 100644
> --- a/include/grub/efi/sb.h
> +++ b/include/grub/efi/sb.h
> @@ -22,7 +22,7 @@
>  #include <grub/types.h>
>  #include <grub/dl.h>
>
> -#define GRUB_EFI_SECUREBOOT_MODE_UNSET 0
> +#define GRUB_EFI_SECUREBOOT_MODE_UNSET         0
>  #define GRUB_EFI_SECUREBOOT_MODE_UNKNOWN       1
>  #define GRUB_EFI_SECUREBOOT_MODE_DISABLED      2
>  #define GRUB_EFI_SECUREBOOT_MODE_ENABLED       3
> @@ -31,6 +31,9 @@
>  extern grub_uint8_t
>  EXPORT_FUNC (grub_efi_get_secureboot) (void);
>
> +extern bool
> +EXPORT_FUNC (grub_is_shim_lock_enabled) (void);
> +
>  extern void
>  grub_shim_lock_verifier_setup (void);
>  #else
> --
> 2.11.0
>

_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel

Reply via email to