Grub Development Archive on lore.kernel.org
 help / color / mirror / Atom feed
From: Daniel Axtens <dja@axtens.net>
To: grub-devel@gnu.org
Cc: rashmica.g@gmail.com, alastair@d-silva.org,
	Daniel Axtens <dja@axtens.net>
Subject: [PATCH] ieee1275: link appended-signature enforcement to /ibm, secure-boot
Date: Thu,  8 Oct 2020 01:21:16 +1100	[thread overview]
Message-ID: <20201007142116.43454-2-dja@axtens.net> (raw)
In-Reply-To: <20201007142116.43454-1-dja@axtens.net>

If the 'ibm,secure-boot' property of the root node is 2 or greater,
require that the kernel pass appended-signature verification.

Do not consider the presence of a certificate to enforce verification.

Signed-off-by: Daniel Axtens <dja@axtens.net>
---
 grub-core/commands/appendedsig/appendedsig.c | 44 +++++++++++++++-----
 grub-core/kern/ieee1275/init.c               | 26 ++++++++++++
 2 files changed, 60 insertions(+), 10 deletions(-)

diff --git a/grub-core/commands/appendedsig/appendedsig.c b/grub-core/commands/appendedsig/appendedsig.c
index 1fbc942254a7..6efe58ce8b2c 100644
--- a/grub-core/commands/appendedsig/appendedsig.c
+++ b/grub-core/commands/appendedsig/appendedsig.c
@@ -95,10 +95,24 @@ static char *
 grub_env_write_sec (struct grub_env_var *var __attribute__((unused)),
 		    const char *val)
 {
+  if (check_sigs == 2)
+    return grub_strdup ("forced");
   check_sigs = (*val == '1') || (*val == 'e');
   return grub_strdup (check_sigs ? "enforce" : "no");
 }
 
+static const char *
+grub_env_read_sec (struct grub_env_var *var __attribute__ ((unused)),
+                         const char *val __attribute__ ((unused)))
+{
+  if (check_sigs == 2)
+    return "forced";
+  else if (check_sigs == 1)
+    return "enforce";
+  else
+    return "no";
+}
+
 static grub_err_t
 read_cert_from_file (grub_file_t f, struct x509_certificate *certificate)
 {
@@ -552,14 +566,20 @@ GRUB_MOD_INIT (appendedsig)
   val = grub_env_get ("check_appended_signatures");
   grub_dprintf ("appendedsig", "check_appended_signatures='%s'\n", val);
 
-  if (val && (val[0] == '1' || val[0] == 'e'))
-    check_sigs = 1;
-  else
-    check_sigs = 0;
+  if (val)
+  {
+    if (val[0] == '2' || val[0] == 'f')
+      check_sigs = 2;
+    else if (val[0] == '1' || val[0] == 'e')
+      check_sigs = 1;
+    else
+      check_sigs = 0;
+  }
 
   grub_trusted_key = NULL;
 
-  grub_register_variable_hook ("check_appended_signatures", 0,
+  grub_register_variable_hook ("check_appended_signatures",
+  			       grub_env_read_sec,
 			       grub_env_write_sec);
   grub_env_export ("check_appended_signatures");
 
@@ -603,11 +623,15 @@ GRUB_MOD_INIT (appendedsig)
     grub_trusted_key = pk;
   }
 
-  if (!val || val[0] == '\0')
-    {
-      grub_env_set ("check_appended_signatures",
-		    grub_trusted_key ? "enforce" : "no");
-    }
+  /*
+   * When controlled by ibm,secure-boot, we don't want the presence of
+   * a certificate to enforce secure boot.
+   * if (!val || val[0] == '\0')
+   * {
+   *    grub_env_set ("check_appended_signatures",
+   *		      grub_trusted_key ? "enforce" : "no");
+   * }
+   */
 
   cmd_trust =
     grub_register_command ("trust_certificate", grub_cmd_trust,
diff --git a/grub-core/kern/ieee1275/init.c b/grub-core/kern/ieee1275/init.c
index fd80eed1a4fa..9c2e2aa0f5a1 100644
--- a/grub-core/kern/ieee1275/init.c
+++ b/grub-core/kern/ieee1275/init.c
@@ -371,6 +371,30 @@ grub_parse_cmdline (void)
     }
 }
 
+static void
+grub_get_ieee1275_secure_boot (void)
+{
+  grub_ieee1275_phandle_t root;
+  int rc;
+  grub_uint32_t is_sb;
+
+  grub_ieee1275_finddevice ("/", &root);
+
+  rc = grub_ieee1275_get_integer_property (root, "ibm,secure-boot", &is_sb,
+                                           sizeof (is_sb), 0);
+
+  /* ibm,secure-boot:
+   * 0 - disabled
+   * 1 - audit
+   * 2 - enforce
+   * 3 - enforce + OS-specific behaviour
+   *
+   * We only support enforce.
+   */
+  if (rc >= 0 && is_sb >= 2)
+    grub_env_set("check_appended_signatures", "forced");
+}
+
 grub_addr_t grub_modbase;
 
 void
@@ -396,6 +420,8 @@ grub_machine_init (void)
 #else
   grub_install_get_time_ms (grub_rtc_get_time_ms);
 #endif
+
+  grub_get_ieee1275_secure_boot ();
 }
 
 void
-- 
2.25.1



      reply	other threads:[~2020-10-07 14:21 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-10-07 14:21 [PATCH 0/1] RFC: ieee1275: link appended-signature enforcement to secure boot Daniel Axtens
2020-10-07 14:21 ` Daniel Axtens [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20201007142116.43454-2-dja@axtens.net \
    --to=dja@axtens.net \
    --cc=alastair@d-silva.org \
    --cc=grub-devel@gnu.org \
    --cc=rashmica.g@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox