This is a note to let you know that I've just added the patch titled x86/efistub: Clear BSS in EFI handover protocol entrypoint to the 6.1-stable tree which can be found at: http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary The filename of the patch is: x86-efistub-clear-bss-in-efi-handover-protocol-entrypoint.patch and it can be found in the queue-6.1 subdirectory. If you, or anyone else, feels it should not be added to the stable tree, please let <stable@xxxxxxxxxxxxxxx> know about it. >From stable+bounces-25898-greg=kroah.com@xxxxxxxxxxxxxxx Mon Mar 4 12:20:52 2024 From: Ard Biesheuvel <ardb+git@xxxxxxxxxx> Date: Mon, 4 Mar 2024 12:19:43 +0100 Subject: x86/efistub: Clear BSS in EFI handover protocol entrypoint To: stable@xxxxxxxxxxxxxxx Cc: linux-efi@xxxxxxxxxxxxxxx, Ard Biesheuvel <ardb@xxxxxxxxxx>, Borislav Petkov <bp@xxxxxxxxx> Message-ID: <20240304111937.2556102-25-ardb+git@xxxxxxxxxx> From: Ard Biesheuvel <ardb+git@xxxxxxxxxx> From: Ard Biesheuvel <ardb@xxxxxxxxxx> [ Commit d7156b986d4cc0657fa6dc05c9fcf51c3d55a0fe upstream ] The so-called EFI handover protocol is value-add from the distros that permits a loader to simply copy a PE kernel image into memory and call an alternative entrypoint that is described by an embedded boot_params structure. Most implementations of this protocol do not bother to check the PE header for minimum alignment, section placement, etc, and therefore also don't clear the image's BSS, or even allocate enough memory for it. Allocating more memory on the fly is rather difficult, but at least clear the BSS region explicitly when entering in this manner, so that the EFI stub code does not get confused by global variables that were not zero-initialized correctly. When booting in mixed mode, this BSS clearing must occur before any global state is created, so clear it in the 32-bit asm entry point. Signed-off-by: Ard Biesheuvel <ardb@xxxxxxxxxx> Signed-off-by: Borislav Petkov (AMD) <bp@xxxxxxxxx> Link: https://lore.kernel.org/r/20230807162720.545787-7-ardb@xxxxxxxxxx Signed-off-by: Ard Biesheuvel <ardb@xxxxxxxxxx> Signed-off-by: Greg Kroah-Hartman <gregkh@xxxxxxxxxxxxxxxxxxx> --- arch/x86/boot/compressed/efi_mixed.S | 14 +++++++++++++- drivers/firmware/efi/libstub/x86-stub.c | 13 +++++++++++-- 2 files changed, 24 insertions(+), 3 deletions(-) --- a/arch/x86/boot/compressed/efi_mixed.S +++ b/arch/x86/boot/compressed/efi_mixed.S @@ -148,6 +148,18 @@ SYM_FUNC_END(__efi64_thunk) .code32 #ifdef CONFIG_EFI_HANDOVER_PROTOCOL SYM_FUNC_START(efi32_stub_entry) + call 1f +1: popl %ecx + + /* Clear BSS */ + xorl %eax, %eax + leal (_bss - 1b)(%ecx), %edi + leal (_ebss - 1b)(%ecx), %ecx + subl %edi, %ecx + shrl $2, %ecx + cld + rep stosl + add $0x4, %esp /* Discard return address */ popl %ecx popl %edx @@ -340,7 +352,7 @@ SYM_FUNC_END(efi32_pe_entry) .org efi32_stub_entry + 0x200 .code64 SYM_FUNC_START_NOALIGN(efi64_stub_entry) - jmp efi_stub_entry + jmp efi_handover_entry SYM_FUNC_END(efi64_stub_entry) #endif --- a/drivers/firmware/efi/libstub/x86-stub.c +++ b/drivers/firmware/efi/libstub/x86-stub.c @@ -925,12 +925,21 @@ fail: } #ifdef CONFIG_EFI_HANDOVER_PROTOCOL +void efi_handover_entry(efi_handle_t handle, efi_system_table_t *sys_table_arg, + struct boot_params *boot_params) +{ + extern char _bss[], _ebss[]; + + memset(_bss, 0, _ebss - _bss); + efi_stub_entry(handle, sys_table_arg, boot_params); +} + #ifndef CONFIG_EFI_MIXED -extern __alias(efi_stub_entry) +extern __alias(efi_handover_entry) void efi32_stub_entry(efi_handle_t handle, efi_system_table_t *sys_table_arg, struct boot_params *boot_params); -extern __alias(efi_stub_entry) +extern __alias(efi_handover_entry) void efi64_stub_entry(efi_handle_t handle, efi_system_table_t *sys_table_arg, struct boot_params *boot_params); #endif Patches currently in stable-queue which might be from kroah.com@xxxxxxxxxxxxxxx are queue-6.1/x86-decompressor-avoid-magic-offsets-for-efi-handover-entrypoint.patch queue-6.1/x86-efistub-avoid-placing-the-kernel-below-load_physical_addr.patch queue-6.1/x86-efistub-avoid-legacy-decompressor-when-doing-efi-boot.patch queue-6.1/x86-efistub-perform-4-5-level-paging-switch-from-the-stub.patch queue-6.1/x86-boot-rename-conflicting-boot_params-pointer-to-boot_params_ptr.patch queue-6.1/x86-efistub-perform-snp-feature-test-while-running-in-the-firmware.patch queue-6.1/x86-efistub-simplify-and-clean-up-handover-entry-code.patch queue-6.1/efi-libstub-add-memory-attribute-protocol-definitions.patch queue-6.1/efi-libstub-add-limit-argument-to-efi_random_alloc.patch queue-6.1/efi-x86-fix-the-missing-kaslr_flag-bit-in-boot_params-hdr.loadflags.patch queue-6.1/arm64-efi-limit-allocations-to-48-bit-addressable-physical-region.patch queue-6.1/x86-efistub-prefer-efi-memory-attributes-protocol-over-dxe-services.patch queue-6.1/efi-efivars-prevent-double-registration.patch queue-6.1/x86-boot-efistub-assign-global-boot_params-variable.patch queue-6.1/x86-efistub-clear-bss-in-efi-handover-protocol-entrypoint.patch queue-6.1/x86-decompressor-factor-out-kernel-decompression-and-relocation.patch queue-6.1/efi-x86-avoid-physical-kaslr-on-older-dell-systems.patch