Re: [PATCH v1 RESEND 1/2] x86/mm/KASLR: EFI region is mistakenly included into KASLR VA space for randomization
From: Baoquan He
Date: Thu Mar 23 2017 - 20:52:34 EST
Hi,
Ping!
Since our kaslr mm back port has been held to wait for this upstream
fix, and post deadline is very close, can this patch be merged or picked
up into tip-bot treeu?
This is an obvious code bug, it has risk to cause kexec/kdump boot
failure, and the current code change won't bring other risk.
Thanks
Baoquan
On 03/23/17 at 11:27am, Baoquan He wrote:
> Currently KASLR is enabled on three regions: the direct mapping of physical
> memory, vamlloc and vmemmap. However EFI region is also mistakenly included
> for VA space randomization because of misusing EFI_VA_START macro and
> assuming EFI_VA_START < EFI_VA_END.
>
> The EFI region is reserved for EFI runtime services virtual mapping which
> should not be included in kaslr ranges. It will be re-used by kexec/kdump
> kernel, the mistake may cause failure when jump to kexec/kdump kernel if
> vmemmap allocation stomps on the allocated efi mapping region.
>
> In Documentation/x86/x86_64/mm.txt, we can see:
> ffffffef00000000 - fffffffeffffffff (=64 GB) EFI region mapping space
> EFI use the space from -4G to -64G thus EFI_VA_START > EFI_VA_END
> Here EFI_VA_START = -4G, and EFI_VA_END = -64G
>
> Changing EFI_VA_START to EFI_VA_END in mm/kaslr.c fixes this problem.
>
> Cc: <stable@xxxxxxxxxxxxxxx> #4.8+
> Signed-off-by: Baoquan He <bhe@xxxxxxxxxx>
> Acked-by: Dave Young <dyoung@xxxxxxxxxx>
> Reviewed-by: Bhupesh Sharma <bhsharma@xxxxxxxxxx>
> Acked-by: Thomas Garnier <thgarnie@xxxxxxxxxx>
> Cc: Thomas Gleixner <tglx@xxxxxxxxxxxxx>
> Cc: Ingo Molnar <mingo@xxxxxxxxxx>
> Cc: "H. Peter Anvin" <hpa@xxxxxxxxx>
> Cc: x86@xxxxxxxxxx
> Cc: Thomas Garnier <thgarnie@xxxxxxxxxx>
> Cc: Kees Cook <keescook@xxxxxxxxxxxx>
> Cc: Borislav Petkov <bp@xxxxxxxxx>
> Cc: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx>
> Cc: Masahiro Yamada <yamada.masahiro@xxxxxxxxxxxxx>
> ---
> arch/x86/mm/kaslr.c | 4 ++--
> 1 file changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/arch/x86/mm/kaslr.c b/arch/x86/mm/kaslr.c
> index 887e571..aed2064 100644
> --- a/arch/x86/mm/kaslr.c
> +++ b/arch/x86/mm/kaslr.c
> @@ -48,7 +48,7 @@ static const unsigned long vaddr_start = __PAGE_OFFSET_BASE;
> #if defined(CONFIG_X86_ESPFIX64)
> static const unsigned long vaddr_end = ESPFIX_BASE_ADDR;
> #elif defined(CONFIG_EFI)
> -static const unsigned long vaddr_end = EFI_VA_START;
> +static const unsigned long vaddr_end = EFI_VA_END;
> #else
> static const unsigned long vaddr_end = __START_KERNEL_map;
> #endif
> @@ -105,7 +105,7 @@ void __init kernel_randomize_memory(void)
> */
> BUILD_BUG_ON(vaddr_start >= vaddr_end);
> BUILD_BUG_ON(IS_ENABLED(CONFIG_X86_ESPFIX64) &&
> - vaddr_end >= EFI_VA_START);
> + vaddr_end >= EFI_VA_END);
> BUILD_BUG_ON((IS_ENABLED(CONFIG_X86_ESPFIX64) ||
> IS_ENABLED(CONFIG_EFI)) &&
> vaddr_end >= __START_KERNEL_map);
> --
> 2.5.5
>