Received: by 2002:a25:ef43:0:0:0:0:0 with SMTP id w3csp123393ybm; Tue, 26 May 2020 12:21:22 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyqgf3QcpPVrn3EGaRZdVW+DPl9dLW8NGbU20F+0sBp843MplsWxfRcZXNMZYHNlEdvjIZ/ X-Received: by 2002:a50:8b44:: with SMTP id l62mr9082086edl.79.1590520882664; Tue, 26 May 2020 12:21:22 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1590520882; cv=none; d=google.com; s=arc-20160816; b=H+71JguH5vP5MtOoMbymCZLIlSOMz21xjGT+RrH0RJFG5XILAeyVCGBr0pKkkakHhD t/Y9y7mRlZQ/UWkntXNE8uYJGy1QpWJm0lytrgMwUAHOH2nZzRjDlajEmI5CR61TMR2D BdEEk77E2tJYBGH2M8VoC9gxkXRBDZwzt8p8iiz6UoBbYYCyOmTO6Ps9mD977IqL/Ma0 kAtbaFnOSj7zKNs3zxZnpeIgeFj6r8erEg31kQQZprLzgj8XBR1hZcGia4KuPdSBrBLJ l7nQS2sI1OeQCRaAYfpgaXD5zt9/+plcfCvnsf0fFF/7MvF7Rms0TOk7pE2Mq8u34B6i 2FuQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=6Ta4JMLsbEePVy+qvfy8vNB3UgEFdjIErIEPmaodPMQ=; b=ECjNSklUH5qFltsD1ef+NxkWfMoxJbCVk4+3lhy0zjyQfqAHjbfYoFz8Tf4ZnsPFXT mvl6yUjMqJo8wqDL+Q4MKV10iNPBV/WY38Njw7stwNXD7/Y0ihUcIjUXceiehp7C32wB kR7kiZlwXsMAxNCu+lu5DUnJYlR5w+n7gadpLsT8OkbOhb3rNyOT7Qj2D9LMgp4FlpnY VGABSjt+6GUcUGTDPS7n1L9gU5zEMow6wDvicXTPEj2SKEwDALz/NiOSRJHzaQOHCXJV aw6l1SchQ3lXWhb0C/Y1/JaZ5nTWDVlxxJWCpx9pe+nqsHQs/fbFow11grRSTdhmVafP 4Nuw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=fUOMpeml; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id p20si406291ejf.49.2020.05.26.12.20.59; Tue, 26 May 2020 12:21:22 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=fUOMpeml; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2392272AbgEZTQM (ORCPT + 99 others); Tue, 26 May 2020 15:16:12 -0400 Received: from mail.kernel.org ([198.145.29.99]:48394 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2392259AbgEZTQJ (ORCPT ); Tue, 26 May 2020 15:16:09 -0400 Received: from localhost (83-86-89-107.cable.dynamic.v4.ziggo.nl [83.86.89.107]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 62761208B3; Tue, 26 May 2020 19:16:08 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1590520568; bh=xYLMfo3x4uc56u3Wk4lKOOqV55aywVzsQJbqVj9oIg0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=fUOMpemlq8t7vNO1tfD06FoFach4zAIPqXIpQlmioTT5+CiPLjh4cwcL+RwTmNiCZ rbgH0kEyXfV9lL8yeqGJD9hlk4ytRAD3W/prxBjXulnx+OdMfxp5d0UwAiiIstrdMf G9V5n3RJbhlvUFXGKFHv+8WZWIAwHDWkS+gllIGY= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, =?UTF-8?q?Lo=C3=AFc=20Yhuel?= , Javier Martinez Canillas , Jerry Snitselaar , Matthew Garrett , Ard Biesheuvel Subject: [PATCH 5.6 117/126] tpm: check event log version before reading final events Date: Tue, 26 May 2020 20:54:14 +0200 Message-Id: <20200526183947.274351163@linuxfoundation.org> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20200526183937.471379031@linuxfoundation.org> References: <20200526183937.471379031@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Loïc Yhuel commit b4f1874c62168159fdb419ced4afc77c1b51c475 upstream. 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 Link: https://lore.kernel.org/r/20200512040113.277768-1-loic.yhuel@gmail.com Reviewed-by: Javier Martinez Canillas Reviewed-by: Jerry Snitselaar Reviewed-by: Matthew Garrett [ardb: warn when final events table is missing or in the wrong format] Signed-off-by: Ard Biesheuvel Signed-off-by: Greg Kroah-Hartman --- drivers/firmware/efi/libstub/tpm.c | 5 +++-- drivers/firmware/efi/tpm.c | 5 ++++- 2 files changed, 7 insertions(+), 3 deletions(-) --- 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; --- 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));