From: Ana Bobillo <[email protected]>
efi_load_pe() loads an image whose Subsystem field is none of the UEFI
image types as an application: efi_set_code_and_data_type() only logs
"invalid image type". Such an image is then not measured by
tcg2_measure_pe_image(), and efi_start_image() does not measure its
invocation either, so with measured boot it runs without a trace in
PCR 4.
The UEFI specification defines subsystems 10, 11 and 12 for UEFI images,
and LoadImage() returns EFI_UNSUPPORTED for an image type that is not
supported. EDK2 does so in CoreLoadPeImage(). Do the same here, also
for IMAGE_SUBSYSTEM_EFI_ROM, which was given a runtime driver's memory
types but could not be measured either.
Fixes: 36b41a3cedd6 ("efi_loader: allocate correct memory type for EFI image")
Suggested-by: Ilias Apalodimas <[email protected]>
Signed-off-by: Ana Bobillo <[email protected]>
Reviewed-by: Ilias Apalodimas <[email protected]>
---
lib/efi_loader/efi_image_loader.c | 22 ++++++++++++++--------
1 file changed, 14 insertions(+), 8 deletions(-)
diff --git a/lib/efi_loader/efi_image_loader.c
b/lib/efi_loader/efi_image_loader.c
index 8f48d8fb5a5..67b83af0e8e 100644
--- a/lib/efi_loader/efi_image_loader.c
+++ b/lib/efi_loader/efi_image_loader.c
@@ -252,8 +252,10 @@ static efi_status_t efi_loader_relocate(const
IMAGE_BASE_RELOCATION *rel,
* @loaded_image_info: image descriptor
* @image_type: field Subsystem of the optional header for
* Windows specific field
+ * Return: status code, EFI_UNSUPPORTED if @image_type is not
+ * one of the UEFI image types
*/
-static void efi_set_code_and_data_type(
+static efi_status_t efi_set_code_and_data_type(
struct efi_loaded_image *loaded_image_info,
uint16_t image_type)
{
@@ -267,17 +269,15 @@ static void efi_set_code_and_data_type(
loaded_image_info->image_data_type = EFI_BOOT_SERVICES_DATA;
break;
case IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER:
- case IMAGE_SUBSYSTEM_EFI_ROM:
loaded_image_info->image_code_type = EFI_RUNTIME_SERVICES_CODE;
loaded_image_info->image_data_type = EFI_RUNTIME_SERVICES_DATA;
break;
default:
log_err("invalid image type: %u\n", image_type);
- /* Let's assume it is an application */
- loaded_image_info->image_code_type = EFI_LOADER_CODE;
- loaded_image_info->image_data_type = EFI_LOADER_DATA;
- break;
+ return EFI_UNSUPPORTED;
}
+
+ return EFI_SUCCESS;
}
/**
@@ -1104,7 +1104,10 @@ efi_status_t efi_load_pe(struct efi_loaded_image_obj
*handle,
IMAGE_NT_HEADERS64 *nt64 = (void *)nt;
IMAGE_OPTIONAL_HEADER64 *opt = &nt64->OptionalHeader;
image_base = opt->ImageBase;
- efi_set_code_and_data_type(loaded_image_info, opt->Subsystem);
+ ret = efi_set_code_and_data_type(loaded_image_info,
+ opt->Subsystem);
+ if (ret != EFI_SUCCESS)
+ goto err;
handle->image_type = opt->Subsystem;
efi_reloc = efi_alloc_aligned_pages(virt_size,
loaded_image_info->image_code_type,
@@ -1121,7 +1124,10 @@ efi_status_t efi_load_pe(struct efi_loaded_image_obj
*handle,
} else if (nt->OptionalHeader.Magic == IMAGE_NT_OPTIONAL_HDR32_MAGIC) {
IMAGE_OPTIONAL_HEADER32 *opt = &nt->OptionalHeader;
image_base = opt->ImageBase;
- efi_set_code_and_data_type(loaded_image_info, opt->Subsystem);
+ ret = efi_set_code_and_data_type(loaded_image_info,
+ opt->Subsystem);
+ if (ret != EFI_SUCCESS)
+ goto err;
handle->image_type = opt->Subsystem;
efi_reloc = efi_alloc_aligned_pages(virt_size,
loaded_image_info->image_code_type,