All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Lee, Chun-Yi" <joeyli.kernel@gmail.com>
To: Ard Biesheuvel <ard.biesheuvel@linaro.org>,
	James Morris <jmorris@namei.org>,
	"Serge E . Hallyn" <serge@hallyn.com>,
	David Howells <dhowells@redhat.com>,
	Josh Boyer <jwboyer@fedoraproject.org>,
	Nayna Jain <nayna@linux.ibm.com>,
	Mimi Zohar <zohar@linux.ibm.com>
Cc: linux-efi@vger.kernel.org, linux-security-module@vger.kernel.org,
	linux-kernel@vger.kernel.org, "Lee, Chun-Yi" <jlee@suse.com>
Subject: [PATCH 2/2 v3] efi: print appropriate status message when loading certificates
Date: Thu,  2 May 2019 12:04:40 +0800	[thread overview]
Message-ID: <20190502040441.30372-2-jlee@suse.com> (raw)
In-Reply-To: <20190502040441.30372-1-jlee@suse.com>

When loading certificates list from UEFI variable, the original error
message direct shows the efi status code from UEFI firmware. It looks
ugly:

[    2.335031] Couldn't get size: 0x800000000000000e
[    2.335032] Couldn't get UEFI MokListRT
[    2.339985] Couldn't get size: 0x800000000000000e
[    2.339987] Couldn't get UEFI dbx list

So, this patch shows the status string instead of status code.

On the other hand, the "Couldn't get UEFI" message doesn't need
to be exposed when db/dbx/mok variable do not exist. So, this
patch set the message level to debug.

v3.
- Print messages similar to db/mok when loading dbx hash to blacklist:
[    1.500952] EFI: Blacklisting hash of an executable: UEFI:dbx
[    1.501773] blacklist: Loaded blacklisting hash
'bin:80b4d96931bf0d02fd91a61e19d14f1da452e66db2408ca8604d411f92659f0a'

- Setting messages for the existence of db/mok/dbx lists to debug level.

v2.
Setting the MODSIGN messages level to debug.

Link:
https://forums.opensuse.org/showthread.php/535324-MODSIGN-Couldn-t-get-UEFI-db-list?p=2897516#post2897516
Cc: James Morris <jmorris@namei.org>
Cc: Serge E. Hallyn" <serge@hallyn.com>
Cc: David Howells <dhowells@redhat.com>
Cc: Nayna Jain <nayna@linux.ibm.com>
Cc: Josh Boyer <jwboyer@fedoraproject.org>
Cc: Mimi Zohar <zohar@linux.ibm.com>
Signed-off-by: "Lee, Chun-Yi" <jlee@suse.com>
---
 certs/blacklist.c                             |  3 +-
 security/integrity/platform_certs/load_uefi.c | 40 +++++++++++++++++++--------
 2 files changed, 31 insertions(+), 12 deletions(-)

diff --git a/certs/blacklist.c b/certs/blacklist.c
index 3a507b9e2568..f91437e39e44 100644
--- a/certs/blacklist.c
+++ b/certs/blacklist.c
@@ -100,7 +100,8 @@ int mark_hash_blacklisted(const char *hash)
 	if (IS_ERR(key)) {
 		pr_err("Problem blacklisting hash (%ld)\n", PTR_ERR(key));
 		return PTR_ERR(key);
-	}
+	} else
+		pr_notice("Loaded blacklisting hash '%s'\n", hash);
 	return 0;
 }
 
diff --git a/security/integrity/platform_certs/load_uefi.c b/security/integrity/platform_certs/load_uefi.c
index 81b19c52832b..6b6996e5bc27 100644
--- a/security/integrity/platform_certs/load_uefi.c
+++ b/security/integrity/platform_certs/load_uefi.c
@@ -1,5 +1,7 @@
 // SPDX-License-Identifier: GPL-2.0
 
+#define pr_fmt(fmt) "EFI: "fmt
+
 #include <linux/kernel.h>
 #include <linux/sched.h>
 #include <linux/cred.h>
@@ -35,6 +37,18 @@ static __init bool uefi_check_ignore_db(void)
 	return status == EFI_SUCCESS;
 }
 
+static void str16_to_str(efi_char16_t *str16, char *str, int str_size)
+{
+	int i = 0;
+
+	while (str16[i] != '\0' && i < (str_size - 1)) {
+		str[i] = str16[i];
+		i++;
+	}
+
+	str[i] = '\0';
+}
+
 /*
  * Get a certificate list blob from the named EFI variable.
  */
@@ -44,13 +58,20 @@ static __init void *get_cert_list(efi_char16_t *name, efi_guid_t *guid,
 	efi_status_t status;
 	unsigned long lsize = 4;
 	unsigned long tmpdb[4];
+	char namestr[16];
 	void *db;
 
+	str16_to_str(name, namestr, ARRAY_SIZE(namestr));
 	status = efi.get_variable(name, guid, NULL, &lsize, &tmpdb);
 	if (status != EFI_BUFFER_TOO_SMALL) {
-		pr_err("Couldn't get size: 0x%lx\n", status);
+		if (status == EFI_NOT_FOUND)
+			pr_debug("UEFI %s list doesn't exist\n", namestr);
+		else
+			pr_err("Couldn't get size for UEFI %s list: %s\n",
+				namestr, efi_status_to_str(status));
 		return NULL;
 	}
+	pr_debug("UEFI %s list exists\n", namestr);
 
 	db = kmalloc(lsize, GFP_KERNEL);
 	if (!db)
@@ -59,7 +80,8 @@ static __init void *get_cert_list(efi_char16_t *name, efi_guid_t *guid,
 	status = efi.get_variable(name, guid, NULL, &lsize, db);
 	if (status != EFI_SUCCESS) {
 		kfree(db);
-		pr_err("Error reading db var: 0x%lx\n", status);
+		pr_err("Error reading UEFI %s list: %s\n",
+			namestr, efi_status_to_str(status));
 		return NULL;
 	}
 
@@ -95,6 +117,7 @@ static __init void uefi_blacklist_hash(const char *source, const void *data,
 static __init void uefi_blacklist_x509_tbs(const char *source,
 					   const void *data, size_t len)
 {
+	pr_info("Blacklisting X.509 TBS hash: %s\n", source);
 	uefi_blacklist_hash(source, data, len, "tbs:", 4);
 }
 
@@ -104,6 +127,7 @@ static __init void uefi_blacklist_x509_tbs(const char *source,
 static __init void uefi_blacklist_binary(const char *source,
 					 const void *data, size_t len)
 {
+	pr_info("Blacklisting hash of an executable: %s\n", source);
 	uefi_blacklist_hash(source, data, len, "bin:", 4);
 }
 
@@ -154,9 +178,7 @@ static int __init load_uefi_certs(void)
 	 */
 	if (!uefi_check_ignore_db()) {
 		db = get_cert_list(L"db", &secure_var, &dbsize);
-		if (!db) {
-			pr_err("MODSIGN: Couldn't get UEFI db list\n");
-		} else {
+		if (db) {
 			rc = parse_efi_signature_list("UEFI:db",
 					db, dbsize, get_handler_for_db);
 			if (rc)
@@ -167,9 +189,7 @@ static int __init load_uefi_certs(void)
 	}
 
 	mok = get_cert_list(L"MokListRT", &mok_var, &moksize);
-	if (!mok) {
-		pr_info("Couldn't get UEFI MokListRT\n");
-	} else {
+	if (mok) {
 		rc = parse_efi_signature_list("UEFI:MokListRT",
 					      mok, moksize, get_handler_for_db);
 		if (rc)
@@ -178,9 +198,7 @@ static int __init load_uefi_certs(void)
 	}
 
 	dbx = get_cert_list(L"dbx", &secure_var, &dbxsize);
-	if (!dbx) {
-		pr_info("Couldn't get UEFI dbx list\n");
-	} else {
+	if (dbx) {
 		rc = parse_efi_signature_list("UEFI:dbx",
 					      dbx, dbxsize,
 					      get_handler_for_dbx);
-- 
2.16.4


  reply	other threads:[~2019-05-02  4:04 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-05-02  4:04 [PATCH 1/2 v2] efi: add a function to convert the status value to string Lee, Chun-Yi
2019-05-02  4:04 ` Lee, Chun-Yi [this message]
2019-05-02  9:04   ` [PATCH 2/2 v3] efi: print appropriate status message when loading certificates Ard Biesheuvel
2019-05-03  7:18     ` joeyli
2019-05-03  8:07       ` Ard Biesheuvel
2019-05-03  8:58         ` joeyli
2019-05-03 14:23           ` Ard Biesheuvel
2019-05-07  8:43             ` joeyli
2019-05-02  8:53 ` [PATCH 1/2 v2] efi: add a function to convert the status value to string Ard Biesheuvel
2019-05-03  6:15   ` joeyli
2019-05-03  6:16     ` Ard Biesheuvel
2019-05-03  8:01       ` joeyli

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=20190502040441.30372-2-jlee@suse.com \
    --to=joeyli.kernel@gmail.com \
    --cc=ard.biesheuvel@linaro.org \
    --cc=dhowells@redhat.com \
    --cc=jlee@suse.com \
    --cc=jmorris@namei.org \
    --cc=jwboyer@fedoraproject.org \
    --cc=linux-efi@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-security-module@vger.kernel.org \
    --cc=nayna@linux.ibm.com \
    --cc=serge@hallyn.com \
    --cc=zohar@linux.ibm.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.