From: Ard Biesheuvel <ardb@kernel.org>
To: linux-efi@vger.kernel.org, Ingo Molnar <mingo@kernel.org>,
Thomas Gleixner <tglx@linutronix.de>
Cc: Ard Biesheuvel <ardb@kernel.org>,
linux-kernel@vger.kernel.org,
Arvind Sankar <nivedita@alum.mit.edu>,
Benjamin Thiel <b.thiel@posteo.de>,
Borislav Petkov <bp@alien8.de>, Dave Young <dyoung@redhat.com>,
Heinrich Schuchardt <xypron.glpk@gmx.de>,
Javier Martinez Canillas <javierm@redhat.com>,
Jerry Snitselaar <jsnitsel@redhat.com>,
Lenny Szubowicz <lszubowi@redhat.com>,
linux-acpi@vger.kernel.org, Loic Yhuel <loic.yhuel@gmail.com>,
Matthew Garrett <mjg59@google.com>,
Mike Lothian <mike@fireburn.co.uk>,
Punit Agrawal <punit1.agrawal@toshiba.co.jp>
Subject: [PATCH 7/7] tpm: check event log version before reading final events
Date: Sun, 17 May 2020 14:57:54 +0200 [thread overview]
Message-ID: <20200517125754.8934-8-ardb@kernel.org> (raw)
In-Reply-To: <20200517125754.8934-1-ardb@kernel.org>
From: Loic Yhuel <loic.yhuel@gmail.com>
This fixes the boot issues since 5.3 on several Dell models when the TPM
is enabled. Depending on the exact grub binary, booting the kernel would
freeze early, or just report an error parsing the final events log.
We get an event log in the SHA-1 format, which doesn't have a
tcg_efi_specid_event_head in the first event, and there is a final events
table which doesn't match the crypto agile format.
__calc_tpm2_event_size reads bad "count" and "efispecid->num_algs", and
either fails, or loops long enough for the machine to be appear frozen.
So we now only parse the final events table, which is per the spec always
supposed to be in the crypto agile format, when we got a event log in this
format.
Fixes: c46f3405692de ("tpm: Reserve the TPM final events table")
Fixes: 166a2809d65b2 ("tpm: Don't duplicate events from the final event log in the TCG2 log")
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1779611
Signed-off-by: Loïc Yhuel <loic.yhuel@gmail.com>
Link: https://lore.kernel.org/r/20200512040113.277768-1-loic.yhuel@gmail.com
Reviewed-by: Javier Martinez Canillas <javierm@redhat.com>
Reviewed-by: Jerry Snitselaar <jsnitsel@redhat.com>
Reviewed-by: Matthew Garrett <mjg59@google.com>
[ardb: warn when final events table is missing or in the wrong format]
Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
---
drivers/firmware/efi/libstub/tpm.c | 5 +++--
drivers/firmware/efi/tpm.c | 5 ++++-
2 files changed, 7 insertions(+), 3 deletions(-)
diff --git a/drivers/firmware/efi/libstub/tpm.c b/drivers/firmware/efi/libstub/tpm.c
index 1d59e103a2e3..e9a684637b70 100644
--- a/drivers/firmware/efi/libstub/tpm.c
+++ b/drivers/firmware/efi/libstub/tpm.c
@@ -54,7 +54,7 @@ void efi_retrieve_tpm2_eventlog(void)
efi_status_t status;
efi_physical_addr_t log_location = 0, log_last_entry = 0;
struct linux_efi_tpm_eventlog *log_tbl = NULL;
- struct efi_tcg2_final_events_table *final_events_table;
+ struct efi_tcg2_final_events_table *final_events_table = NULL;
unsigned long first_entry_addr, last_entry_addr;
size_t log_size, last_entry_size;
efi_bool_t truncated;
@@ -127,7 +127,8 @@ void efi_retrieve_tpm2_eventlog(void)
* Figure out whether any events have already been logged to the
* final events structure, and if so how much space they take up
*/
- final_events_table = get_efi_config_table(LINUX_EFI_TPM_FINAL_LOG_GUID);
+ if (version == EFI_TCG2_EVENT_LOG_FORMAT_TCG_2)
+ final_events_table = get_efi_config_table(LINUX_EFI_TPM_FINAL_LOG_GUID);
if (final_events_table && final_events_table->nr_events) {
struct tcg_pcr_event2_head *header;
int offset;
diff --git a/drivers/firmware/efi/tpm.c b/drivers/firmware/efi/tpm.c
index 31f9f0e369b9..0543fbf60222 100644
--- a/drivers/firmware/efi/tpm.c
+++ b/drivers/firmware/efi/tpm.c
@@ -62,8 +62,11 @@ int __init efi_tpm_eventlog_init(void)
tbl_size = sizeof(*log_tbl) + log_tbl->size;
memblock_reserve(efi.tpm_log, tbl_size);
- if (efi.tpm_final_log == EFI_INVALID_TABLE_ADDR)
+ if (efi.tpm_final_log == EFI_INVALID_TABLE_ADDR ||
+ log_tbl->version != EFI_TCG2_EVENT_LOG_FORMAT_TCG_2) {
+ pr_warn(FW_BUG "TPM Final Events table missing or invalid\n");
goto out;
+ }
final_tbl = early_memremap(efi.tpm_final_log, sizeof(*final_tbl));
--
2.17.1
next prev parent reply other threads:[~2020-05-17 12:59 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-05-17 12:57 [GIT PULL 0/7] EFI fixes for v5.7 Ard Biesheuvel
2020-05-17 12:57 ` [PATCH 1/7] efi/libstub: Avoid returning uninitialized data from setup_graphics() Ard Biesheuvel
2020-05-17 12:57 ` [PATCH 2/7] efi/earlycon: Fix early printk for wider fonts Ard Biesheuvel
2020-05-17 12:57 ` [PATCH 3/7] efi/libstub/x86: Avoid EFI map buffer alloc in allocate_e820() Ard Biesheuvel
2020-05-17 12:57 ` [PATCH 4/7] efi: cper: Add support for printing Firmware Error Record Reference Ard Biesheuvel
2020-05-17 12:57 ` [PATCH 5/7] x86/boot: Mark global variables as static Ard Biesheuvel
2020-05-17 12:57 ` [PATCH 6/7] efi: Pull up arch-specific prototype efi_systab_show_arch() Ard Biesheuvel
2020-05-17 12:57 ` Ard Biesheuvel [this message]
2020-05-18 9:07 ` [GIT PULL 0/7] EFI fixes for v5.7 Borislav Petkov
2020-05-18 9:15 ` Ard Biesheuvel
2020-05-22 13:06 ` Ard Biesheuvel
2020-05-22 13:40 ` Borislav Petkov
2020-05-22 13:44 ` Ard Biesheuvel
2020-05-22 14:04 ` Thomas Gleixner
2020-05-22 14:45 ` Ard Biesheuvel
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=20200517125754.8934-8-ardb@kernel.org \
--to=ardb@kernel.org \
--cc=b.thiel@posteo.de \
--cc=bp@alien8.de \
--cc=dyoung@redhat.com \
--cc=javierm@redhat.com \
--cc=jsnitsel@redhat.com \
--cc=linux-acpi@vger.kernel.org \
--cc=linux-efi@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=loic.yhuel@gmail.com \
--cc=lszubowi@redhat.com \
--cc=mike@fireburn.co.uk \
--cc=mingo@kernel.org \
--cc=mjg59@google.com \
--cc=nivedita@alum.mit.edu \
--cc=punit1.agrawal@toshiba.co.jp \
--cc=tglx@linutronix.de \
--cc=xypron.glpk@gmx.de \
/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;
as well as URLs for NNTP newsgroup(s).