ACK: [azure][PATCH] x86/KASLR: Fix kexec kernel boot crash when KASLR randomization fails
Colin Ian King
colin.king at canonical.com
Mon Sep 11 13:00:32 UTC 2017
On 09/09/17 02:44, Marcelo Henrique Cerri wrote:
> On Fri, Sep 08, 2017 at 04:52:17PM -0300, Marcelo Henrique Cerri wrote:
>> From: Baoquan He <bhe at redhat.com>
>>
>> BugLink: http://bugs.launchpad.net/bugs/1702515
>
> BugLink: http://bugs.launchpad.net/bugs/1712867
>
>>
>> Dave found that a kdump kernel with KASLR enabled will reset to the BIOS
>> immediately if physical randomization failed to find a new position for
>> the kernel. A kernel with the 'nokaslr' option works in this case.
>>
>> The reason is that KASLR will install a new page table for the identity
>> mapping, while it missed building it for the original kernel location
>> if KASLR physical randomization fails.
>>
>> This only happens in the kexec/kdump kernel, because the identity mapping
>> has been built for kexec/kdump in the 1st kernel for the whole memory by
>> calling init_pgtable(). Here if physical randomizaiton fails, it won't build
>> the identity mapping for the original area of the kernel but change to a
>> new page table '_pgtable'. Then the kernel will triple fault immediately
>> caused by no identity mappings.
>>
>> The normal kernel won't see this bug, because it comes here via startup_32()
>> and CR3 will be set to _pgtable already. In startup_32() the identity
>> mapping is built for the 0~4G area. In KASLR we just append to the existing
>> area instead of entirely overwriting it for on-demand identity mapping
>> building. So the identity mapping for the original area of kernel is still
>> there.
>>
>> To fix it we just switch to the new identity mapping page table when physical
>> KASLR succeeds. Otherwise we keep the old page table unchanged just like
>> "nokaslr" does.
>>
>> Signed-off-by: Baoquan He <bhe at redhat.com>
>> Signed-off-by: Dave Young <dyoung at redhat.com>
>> Acked-by: Kees Cook <keescook at chromium.org>
>> Cc: Borislav Petkov <bp at suse.de>
>> Cc: Dave Jiang <dave.jiang at intel.com>
>> Cc: Linus Torvalds <torvalds at linux-foundation.org>
>> Cc: Peter Zijlstra <peterz at infradead.org>
>> Cc: Thomas Garnier <thgarnie at google.com>
>> Cc: Thomas Gleixner <tglx at linutronix.de>
>> Cc: Yinghai Lu <yinghai at kernel.org>
>> Link: http://lkml.kernel.org/r/1493278940-5885-1-git-send-email-bhe@redhat.com
>> Signed-off-by: Ingo Molnar <mingo at kernel.org>
>> (cherry picked from commit da63b6b20077469bd6bd96e07991ce145fc4fbc4)
>> Signed-off-by: Marcelo Henrique Cerri <marcelo.cerri at canonical.com>
>> ---
>> arch/x86/boot/compressed/kaslr.c | 11 +++++++++--
>> 1 file changed, 9 insertions(+), 2 deletions(-)
>>
>> diff --git a/arch/x86/boot/compressed/kaslr.c b/arch/x86/boot/compressed/kaslr.c
>> index 8fad8a64d670..1199a74f867c 100644
>> --- a/arch/x86/boot/compressed/kaslr.c
>> +++ b/arch/x86/boot/compressed/kaslr.c
>> @@ -594,10 +594,17 @@ void choose_random_location(unsigned long input,
>> add_identity_map(random_addr, output_size);
>> *output = random_addr;
>> }
>> +
>> + /*
>> + * This loads the identity mapping page table.
>> + * This should only be done if a new physical address
>> + * is found for the kernel, otherwise we should keep
>> + * the old page table to make it be like the "nokaslr"
>> + * case.
>> + */
>> + finalize_identity_maps();
>> }
>>
>> - /* This actually loads the identity pagetable on x86_64. */
>> - finalize_identity_maps();
>>
>> /* Pick random virtual address starting from LOAD_PHYSICAL_ADDR. */
>> if (IS_ENABLED(CONFIG_X86_64))
>> --
>> 2.7.4
>>
>>
>>
Has positive test results. Just needs the buglink to be corrected before
applying.
Acked-by: Colin Ian King <colin.king at canonical.com>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 837 bytes
Desc: OpenPGP digital signature
URL: <https://lists.ubuntu.com/archives/kernel-team/attachments/20170911/de1893ee/attachment.sig>
More information about the kernel-team
mailing list