]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
Add option to automatically set securelevel when in Secure Boot mode
authorMatthew Garrett <matthew.garrett@nebula.com>
Mon, 9 Sep 2013 22:49:46 +0000 (15:49 -0700)
committerSantosh Shilimkar <santosh.shilimkar@oracle.com>
Mon, 10 Aug 2015 16:24:06 +0000 (09:24 -0700)
Orabug: 21539498

UEFI Secure Boot provides a mechanism for ensuring that the firmware will
only load signed bootloaders and kernels. Certain use cases may also
require that the kernel prevent userspace from inserting untrusted kernel
code at runtime. Add a configuration option that enforces this automatically
when enabled.

Signed-off-by: Matthew Garrett <matthew.garrett@nebula.com>
Signed-off-by: Santosh Shilimkar <santosh.shilimkar@oracle.com>
Documentation/x86/zero-page.txt
arch/x86/Kconfig
arch/x86/boot/compressed/eboot.c
arch/x86/include/uapi/asm/bootparam.h
arch/x86/kernel/setup.c
security/Kconfig

index 82fbdbc1e0b0626611462132d38fc29c5ee27078..a811210ad486a8241fb1c891c95b89425d4aebbd 100644 (file)
@@ -30,6 +30,8 @@ Offset        Proto   Name            Meaning
 1E9/001        ALL     eddbuf_entries  Number of entries in eddbuf (below)
 1EA/001        ALL     edd_mbr_sig_buf_entries Number of entries in edd_mbr_sig_buffer
                                (below)
+1EB/001        ALL     kbd_status      Numlock is enabled
+1EC/001        ALL     secure_boot     Secure boot is enabled in the firmware
 1EF/001        ALL     sentinel        Used to detect broken bootloaders
 290/040        ALL     edd_mbr_sig_buffer EDD MBR signatures
 2D0/A00        ALL     e820_map        E820 memory map table
index 226d5696e1d1dd5fe715124710b0f2cd04f8c495..b1f4cf38ad433cceb3f8ddeb9c8fdaedd37d4783 100644 (file)
@@ -1697,6 +1697,19 @@ config EFI_MIXED
 
           If unsure, say N.
 
+config EFI_SECURE_BOOT_SECURELEVEL
+       def_bool n
+       depends on SECURITY_SECURELEVEL
+       depends on EFI
+       prompt "Automatically set securelevel when UEFI Secure Boot is enabled"
+       ---help---
+         UEFI Secure Boot provides a mechanism for ensuring that the
+         firmware will only load signed bootloaders and kernels. Certain
+         use cases may also require that the kernel restrict any userspace
+         mechanism that could insert untrusted code into the kernel.
+         Say Y here to automatically enable securelevel enforcement
+         when a system boots with UEFI Secure Boot enabled.
+
 config SECCOMP
        def_bool y
        prompt "Enable seccomp to safely compute untrusted bytecode"
index 48304b89b601fa92bbd8ee1f5e548b4c2ffcc2dc..81c6a5c298a19ca7a0f64cdc9f82f3d5e8ccea2a 100644 (file)
@@ -12,6 +12,7 @@
 #include <asm/efi.h>
 #include <asm/setup.h>
 #include <asm/desc.h>
+#include <asm/bootparam_utils.h>
 
 #include "../string.h"
 #include "eboot.h"
@@ -1375,6 +1376,37 @@ free_mem_map:
        return status;
 }
 
+static int get_secure_boot(void)
+{
+       u8 sb, setup;
+       unsigned long datasize = sizeof(sb);
+       efi_guid_t var_guid = EFI_GLOBAL_VARIABLE_GUID;
+       efi_status_t status;
+
+       status = efi_call_phys(sys_table->runtime->get_variable,
+                              L"SecureBoot", &var_guid, NULL, &datasize, &sb);
+
+       if (status != EFI_SUCCESS)
+               return 0;
+
+       if (sb == 0)
+               return 0;
+
+
+       status = efi_call_phys(sys_table->runtime->get_variable,
+                              L"SetupMode", &var_guid, NULL, &datasize,
+                              &setup);
+
+       if (status != EFI_SUCCESS)
+               return 0;
+
+       if (setup == 1)
+               return 0;
+
+       return 1;
+}
+
+
 /*
  * On success we return a pointer to a boot_params structure, and NULL
  * on failure.
@@ -1408,6 +1440,10 @@ struct boot_params *efi_main(struct efi_config *c,
        else
                setup_boot_services32(efi_early);
 
+       sanitize_boot_params(boot_params);
+
+       boot_params->secure_boot = get_secure_boot();
+
        setup_graphics(boot_params);
 
        setup_efi_pci(boot_params);
index ab456dc233b51482c53c0232a97ed71cbc50a990..74ba4083e7ce72dc3a8bae2072bbf70c0255d897 100644 (file)
@@ -134,7 +134,8 @@ struct boot_params {
        __u8  eddbuf_entries;                           /* 0x1e9 */
        __u8  edd_mbr_sig_buf_entries;                  /* 0x1ea */
        __u8  kbd_status;                               /* 0x1eb */
-       __u8  _pad5[3];                                 /* 0x1ec */
+       __u8  secure_boot;                              /* 0x1ec */
+       __u8  _pad5[2];                                 /* 0x1ed */
        /*
         * The sentinel is set to a nonzero value (0xff) in header.S.
         *
index d74ac33290ae3eeef46b923c4556d644b72f0d5a..673ba9c92bdbd1ca12ab862f14721c613ea9ab45 100644 (file)
@@ -50,6 +50,7 @@
 #include <linux/init_ohci1394_dma.h>
 #include <linux/kvm_para.h>
 #include <linux/dma-contiguous.h>
+#include <linux/security.h>
 
 #include <linux/errno.h>
 #include <linux/kernel.h>
@@ -1156,6 +1157,12 @@ void __init setup_arch(char **cmdline_p)
 
        io_delay_init();
 
+#ifdef CONFIG_EFI_SECURE_BOOT_SECURELEVEL
+       if (boot_params.secure_boot) {
+               set_securelevel(1);
+       }
+#endif
+
        /*
         * Parse the ACPI tables for possible boot-time SMP configuration.
         */
index 9542281b6e16631f56a295bcdcca15f7816e8b1a..ccc0213d29cc7a08b88f9657dc9086f7fdb46fcf 100644 (file)
@@ -72,7 +72,7 @@ config SECURITY_PATH
          If you are unsure how to answer this question, answer N.
 
 config SECURITY_SECURELEVEL
-        bool "Securelevel kernel restriction interface"
+       bool "Securelevel kernel restriction interface"
        depends on SECURITY
        help
          This enables support for adding a set of additional kernel security