[PATCH 1/1][SRU][OEM-5.6] efi/tpm: Verify event log header before parsing
Thadeu Lima de Souza Cascardo
cascardo at canonical.com
Tue Aug 25 16:28:57 UTC 2020
On Tue, Aug 25, 2020 at 04:36:21PM +0800, You-Sheng Yang wrote:
> From: Fabian Vogt <fvogt at suse.de>
>
> BugLink: https://bugs.launchpad.net/bugs/1892827
>
> [ Upstream commit 7dfc06a0f25b593a9f51992f540c0f80a57f3629 ]
Hi, Vicamo.
You should have cherry-picked 7dfc06a0f25b593a9f51992f540c0f80a57f3629 instead
of ea3cdcaa43b08c9a747639f545b0ed5cca47f87e.
Can you send a v2?
Cascardo.
>
> It is possible that the first event in the event log is not actually a
> log header at all, but rather a normal event. This leads to the cast in
> __calc_tpm2_event_size being an invalid conversion, which means that
> the values read are effectively garbage. Depending on the first event's
> contents, this leads either to apparently normal behaviour, a crash or
> a freeze.
>
> While this behaviour of the firmware is not in accordance with the
> TCG Client EFI Specification, this happens on a Dell Precision 5510
> with the TPM enabled but hidden from the OS ("TPM On" disabled, state
> otherwise untouched). The EFI firmware claims that the TPM is present
> and active and that it supports the TCG 2.0 event log format.
>
> Fortunately, this can be worked around by simply checking the header
> of the first event and the event log header signature itself.
>
> Commit b4f1874c6216 ("tpm: check event log version before reading final
> events") addressed a similar issue also found on Dell models.
>
> Fixes: 6b0326190205 ("efi: Attempt to get the TCG2 event log in the boot stub")
> Signed-off-by: Fabian Vogt <fvogt at suse.de>
> Link: https://lore.kernel.org/r/1927248.evlx2EsYKh@linux-e202.suse.de
> Bugzilla: https://bugzilla.suse.com/show_bug.cgi?id=1165773
> Signed-off-by: Ard Biesheuvel <ardb at kernel.org>
> Signed-off-by: Sasha Levin <sashal at kernel.org>
> (cherry picked from commit ea3cdcaa43b08c9a747639f545b0ed5cca47f87e)
> Signed-off-by: You-Sheng Yang <vicamo.yang at canonical.com>
> ---
> include/linux/tpm_eventlog.h | 14 +++++++++++++-
> 1 file changed, 13 insertions(+), 1 deletion(-)
>
> diff --git a/include/linux/tpm_eventlog.h b/include/linux/tpm_eventlog.h
> index 131ea1bad458..eccfd3a4e4c8 100644
> --- a/include/linux/tpm_eventlog.h
> +++ b/include/linux/tpm_eventlog.h
> @@ -81,6 +81,8 @@ struct tcg_efi_specid_event_algs {
> u16 digest_size;
> } __packed;
>
> +#define TCG_SPECID_SIG "Spec ID Event03"
> +
> struct tcg_efi_specid_event_head {
> u8 signature[16];
> u32 platform_class;
> @@ -171,6 +173,7 @@ static inline int __calc_tpm2_event_size(struct tcg_pcr_event2_head *event,
> int i;
> int j;
> u32 count, event_type;
> + const u8 zero_digest[sizeof(event_header->digest)] = {0};
>
> marker = event;
> marker_start = marker;
> @@ -198,10 +201,19 @@ static inline int __calc_tpm2_event_size(struct tcg_pcr_event2_head *event,
> count = READ_ONCE(event->count);
> event_type = READ_ONCE(event->event_type);
>
> + /* Verify that it's the log header */
> + if (event_header->pcr_idx != 0 ||
> + event_header->event_type != NO_ACTION ||
> + memcmp(event_header->digest, zero_digest, sizeof(zero_digest))) {
> + size = 0;
> + goto out;
> + }
> +
> efispecid = (struct tcg_efi_specid_event_head *)event_header->event;
>
> /* Check if event is malformed. */
> - if (count > efispecid->num_algs) {
> + if (memcmp(efispecid->signature, TCG_SPECID_SIG,
> + sizeof(TCG_SPECID_SIG)) || count > efispecid->num_algs) {
> size = 0;
> goto out;
> }
> --
> 2.27.0
>
>
> --
> kernel-team mailing list
> kernel-team at lists.ubuntu.com
> https://lists.ubuntu.com/mailman/listinfo/kernel-team
More information about the kernel-team
mailing list