[PATCH v3] efi_loader: check tcg2 protocol installation outside the TCG protocol
Ilias Apalodimas
ilias.apalodimas at linaro.org
Mon Nov 29 08:09:07 CET 2021
Hi Kojima-san
[...]
> > > +efi_status_t efi_tcg2_do_initial_measurement(void)
> > > +{
> > > + efi_status_t ret;
> > > + struct udevice *dev;
> > > +
> > > + ret = platform_get_tpm2_device(&dev);
> > > + if (ret != EFI_SUCCESS)
> > > + goto out;
> > > +
> > > + ret = tcg2_measure_secure_boot_variable(dev);
> > > + if (ret != EFI_SUCCESS)
> > > + goto out;
> > > +
> > > +out:
> > > + return ret;
> > > +}
> > > +
> >
> > Unfortunately always returning EFI_SUCCESS from efi_tcg2_register() creates
> > a dependency hell for us. If we want to keep this code don't we need to
> > check is_tcg2_protocol_installed() here as well? If we don't the call
> > chain here is:
> > tcg2_measure_secure_boot_variable() -> tcg2_measure_variable() ->
> > tcg2_measure_event() -> tcg2_agile_log_append().
> > Won't this still crash if for some reason efi_tcg2_register() failed?
>
> Yes, you are correct. efi_tcg2_setup_measurement() and
> efi_tcg2_do_initial_measurement() expects that efi_tcg2_register()
> returns
> the correct error code, instead of EFI_SUCCESS, so this patch will not
> work as expected.
>
> In addition, I think again that calling is_tcg2_protocol_installed() in the
> outside of EFI Protocol functions such as tcg2_measure_pe_image()
> is also wrong. tcg2_measure_pe_image() shall be handled even if
> TCG2 EFI Protocol is not installed.
>
> >
> > We could also avoid it by adding a similar check to
> > tcg2_agile_log_append(). Or we do something like:
> >
> > diff --git a/lib/efi_loader/efi_tcg2.c b/lib/efi_loader/efi_tcg2.c
> > index 117bf9add631..92ea8937cc60 100644
> > --- a/lib/efi_loader/efi_tcg2.c
> > +++ b/lib/efi_loader/efi_tcg2.c
> > @@ -325,6 +325,16 @@ static efi_status_t tcg2_agile_log_append(u32 pcr_index, u32 event_type,
> > u32 event_size = size + tcg_event_final_size(digest_list);
> > struct efi_tcg2_final_events_table *final_event;
> > efi_status_t ret = EFI_SUCCESS;
> > + /*
> > + * This should never happen. This function should only be invoked if
> > + * the TCG2 protocol has been installed. However since we always
> > + * return EFI_SUCCESS from efi_tcg2_register shield callers against
> > + * crashing and complain
> > + */
> > + if (!event_log.buffer) {
> > + log_err("EFI TCG2 protocol not installed correctly\n");
> > + return EFI_INVALID_PARAMETER;
> > + }
> >
> > /* if ExitBootServices hasn't been called update the normal log */
> > if (!event_log.ebs_called) {
> > @@ -341,6 +351,10 @@ static efi_status_t tcg2_agile_log_append(u32 pcr_index, u32 event_type,
> > if (!event_log.get_event_called)
> > return ret;
> >
> > + if (!event_log.final_buffer) {
> > + log_err("EFI TCG2 protocol not installed correctly\n");
> > + return EFI_INVALID_PARAMETER;
> > + }
> > /* if GetEventLog has been called update FinalEventLog as well */
> > if (event_log.final_pos + event_size > TPM2_EVENT_LOG_SIZE)
> > return EFI_VOLUME_FULL;
> >
> > But at this point I think this is an error waiting to happen. I'd much
> > prefer just refusing to boot if the TCG protocol installation failed.
>
> I agree.
> So I think what should we do for this issue is:
> - Add null check of eventlog buffer in tcg2_agile_log_append()
> ===> You have already sent this patch.
> - return appropriate error code in efi_tcg2_register()
> - remove efi_create_event() and tcg2_measure_secure_boot_variable()
> from efi_tcg2_register() and create separate function as this patch,
> to make efi_tcg2_register() implementation simple.
>
> What do you think?
Yes I think this is the best say forward. Feel free to pick up the
null checking patchset.
>
> Thanks,
> Masahisa Kojima
>
> >
Cheers
/Ilias
[...]
More information about the U-Boot
mailing list