Received: from list by lists.gnu.org with archive (Exim 4.71) id 1gCq9l-0005XF-0Q for mharc-grub-devel@gnu.org; Wed, 17 Oct 2018 14:02:54 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:40635) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gCq9i-0005Sd-BJ for grub-devel@gnu.org; Wed, 17 Oct 2018 14:02:51 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gCq9e-0002JS-7f for grub-devel@gnu.org; Wed, 17 Oct 2018 14:02:50 -0400 Received: from mail-wr1-x442.google.com ([2a00:1450:4864:20::442]:39493) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1gCq9d-0002EU-UK for grub-devel@gnu.org; Wed, 17 Oct 2018 14:02:46 -0400 Received: by mail-wr1-x442.google.com with SMTP id 61-v6so30723601wrb.6 for ; Wed, 17 Oct 2018 11:02:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cloudflare.com; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=lgHI69pxucDHY+NhScWjN0ZsTifrN2uUw/mHKchfTOE=; b=iXCJibYqTVLxTX190LoPauHd/uJ7Lql9eFiFLh/PsEESVGDgRDWHZdcAJHAS6dx29Z z2pOowCY4n8tg+h+fqhwFWWJuaZzyvfcJgSd2Ll6ZQ2WUDL85jOM9ffNqK72J5oxIcWU 8hRxw3dcb33eeee+ab38kYEUTzVQ2RQasDNcA= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=lgHI69pxucDHY+NhScWjN0ZsTifrN2uUw/mHKchfTOE=; b=VhxpNukFWShZY9t5UgUlYvtHOaCQpVzAmIayyw8ncJ2v5hh8YwaGkPShqH10bZGig5 3y896gJiOVYeG54DU0Cc30sTTNmN0VTowppvXq/UZeGPGEAjM5MN9FZvVIVKwZssg+8G ABBqPbKRthJjv/WCPkxfZPluuhhYYgJAVi0Ov5fMscXkm9AE1dwgKOYsqmZvjQyPIc1S 4P8cAHm1w0Y0Uo+GCMlGjnoCLTT7YB+WCbxwamDoxm2lMpYi4qTWr2Tkoe4eo7vK9+zI vZ4wlWPuxaO3QCfznm51TFaoBdgGIwrAPK+whNVOjbXi2wN15BYVdyqPeEdamRjE20ST qc1g== X-Gm-Message-State: ABuFfoj6AC6U6CQoYUgAt8vTt/4Qz4jibITGreYyMKJ/4hNdl1yrq1H0 JK8swNCpQEGXsDFNf+8PBhCQ33W0DLASEw== X-Google-Smtp-Source: ACcGV61XUvd8U+En5zOxdigWu+dYPT1wiSDyX0e9ITqr4GfeLMjWdCL8XZOVM/AzkMTyS11sKAX65A== X-Received: by 2002:adf:a481:: with SMTP id g1-v6mr26719398wrb.167.1539799364587; Wed, 17 Oct 2018 11:02:44 -0700 (PDT) Received: from localhost.localdomain ([185.122.0.240]) by smtp.gmail.com with ESMTPSA id c21-v6sm3229864wmh.26.2018.10.17.11.02.43 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 17 Oct 2018 11:02:43 -0700 (PDT) From: Ignat Korchagin To: grub-devel@gnu.org Cc: Ignat Korchagin Subject: [PATCH v2 2/2] loader/i386/linux: report UEFI secure boot status to the Linux kernel Date: Wed, 17 Oct 2018 18:01:46 +0000 Message-Id: <20181017180146.18299-3-ignat@cloudflare.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20181017180146.18299-1-ignat@cloudflare.com> References: <20181017145905.GE25306@router-fw-old.i.net-space.pl> <20181017180146.18299-1-ignat@cloudflare.com> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:4864:20::442 X-BeenThere: grub-devel@gnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: The development of GNU GRUB List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 17 Oct 2018 18:02:51 -0000 Linux kernel from 4.11 has secure_boot member as part of linux_kernel_params. Currently, GRUB does not populate it, so the kernel reports "Secure boot could not be determined" on boot. We can populate it in EFI mode, so the kernel "knows" the status. Signed-off-by: Ignat Korchagin --- grub-core/loader/i386/linux.c | 54 ++++++++++++++++++++++++++++++++++++++++++- include/grub/i386/linux.h | 14 +++++++++-- 2 files changed, 65 insertions(+), 3 deletions(-) diff --git a/grub-core/loader/i386/linux.c b/grub-core/loader/i386/linux.c index 4eab55a2d..7016974a6 100644 --- a/grub-core/loader/i386/linux.c +++ b/grub-core/loader/i386/linux.c @@ -396,6 +396,57 @@ grub_linux_boot_mmap_fill (grub_uint64_t addr, grub_uint64_t size, return 0; } +#ifdef GRUB_MACHINE_EFI + +/* from https://github.com/rhboot/shim/blob/b953468e91eac48d2e3817f18cd604e20f39c56b/lib/guid.c#L39 */ +#define GRUB_EFI_SHIM_LOCK_GUID \ + { 0x605dab50, 0xe046, 0xe046, { 0xab, 0xb6, 0x3d, 0xd8, 0x10, 0xdd, 0x8b, 0x23 }} + +/* mostly taken from https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/tree/drivers/firmware/efi/libstub/secureboot.c?h=linux-4.18.y&id=a7012bdbdf406bbaa4e3de0cc3d8eb0faaacbf93#n37 + except for the case, when "SecureBoot" variable is not found, because + grub_efi_get_variable does not report EFI_STATUS to the caller */ +static grub_uint8_t +grub_efi_secureboot_mode (void) +{ + grub_efi_guid_t efi_var_guid = GRUB_EFI_GLOBAL_VARIABLE_GUID; + grub_size_t efi_var_size = 0; + grub_efi_uint32_t attr = 0; + grub_uint8_t *secure_boot; + grub_uint8_t *setup_mode; + grub_uint8_t *moksb_state; + grub_uint8_t secureboot_mode = LINUX_EFI_SECUREBOOT_MODE_UNKNOWN; + + secure_boot = grub_efi_get_variable ("SecureBoot", &efi_var_guid, &efi_var_size); + setup_mode = grub_efi_get_variable ("SetupMode", &efi_var_guid, &efi_var_size); + efi_var_guid = GRUB_EFI_SHIM_LOCK_GUID; + moksb_state = grub_efi_get_variable_with_attributes ("MokSBState", &efi_var_guid, &efi_var_size, &attr); + + if (!secure_boot || !setup_mode) + goto fail; + + if ((*secure_boot == 0) || (*setup_mode == 1)) + secureboot_mode = LINUX_EFI_SECUREBOOT_MODE_DISABLED; + else + secureboot_mode = LINUX_EFI_SECUREBOOT_MODE_ENABLED; + + if (moksb_state) + { + if (!(attr & GRUB_EFI_VARIABLE_RUNTIME_ACCESS) && *moksb_state == 1) + secureboot_mode = LINUX_EFI_SECUREBOOT_MODE_DISABLED; + } + +fail: + if (moksb_state) + grub_free (moksb_state); + if (setup_mode) + grub_free (setup_mode); + if (secure_boot) + grub_free (secure_boot); + + return secureboot_mode; +} +#endif + static grub_err_t grub_linux_boot (void) { @@ -574,6 +625,7 @@ grub_linux_boot (void) grub_efi_uintn_t efi_desc_size; grub_size_t efi_mmap_target; grub_efi_uint32_t efi_desc_version; + ctx.params->secure_boot = grub_efi_secureboot_mode (); err = grub_efi_finish_boot_services (&efi_mmap_size, efi_mmap_buf, NULL, &efi_desc_size, &efi_desc_version); if (err) @@ -760,7 +812,7 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)), linux_params.code32_start = prot_mode_target + lh.code32_start - GRUB_LINUX_BZIMAGE_ADDR; linux_params.kernel_alignment = (1 << align); - linux_params.ps_mouse = linux_params.padding10 = 0; + linux_params.ps_mouse = linux_params.padding11 = 0; len = sizeof (linux_params) - sizeof (lh); if (grub_file_read (file, (char *) &linux_params + sizeof (lh), len) != len) diff --git a/include/grub/i386/linux.h b/include/grub/i386/linux.h index 60c7c3b5e..4d20abb2e 100644 --- a/include/grub/i386/linux.h +++ b/include/grub/i386/linux.h @@ -87,6 +87,12 @@ enum GRUB_VIDEO_LINUX_TYPE_SIMPLE = 0x70 /* Linear framebuffer without any additional functions. */ }; +/* Possible values for Linux secure_boot kernel parameter */ +#define LINUX_EFI_SECUREBOOT_MODE_UNSET 0 +#define LINUX_EFI_SECUREBOOT_MODE_UNKNOWN 1 +#define LINUX_EFI_SECUREBOOT_MODE_DISABLED 2 +#define LINUX_EFI_SECUREBOOT_MODE_ENABLED 3 + /* For the Linux/i386 boot protocol version 2.10. */ struct linux_i386_kernel_header { @@ -270,7 +276,11 @@ struct linux_kernel_params grub_uint8_t mmap_size; /* 1e8 */ - grub_uint8_t padding9[0x1f1 - 0x1e9]; + grub_uint8_t padding9[0x1ec - 0x1e9]; + + grub_uint8_t secure_boot; /* 1ec */ + + grub_uint8_t padding10[0x1f1 - 0x1ed]; grub_uint8_t setup_sects; /* The size of the setup in sectors */ grub_uint16_t root_flags; /* If the root is mounted readonly */ @@ -280,7 +290,7 @@ struct linux_kernel_params grub_uint16_t vid_mode; /* Video mode control */ grub_uint16_t root_dev; /* Default root device number */ - grub_uint8_t padding10; /* 1fe */ + grub_uint8_t padding11; /* 1fe */ grub_uint8_t ps_mouse; /* 1ff */ grub_uint16_t jump; /* Jump instruction */ -- 2.11.0