From: Thomas Garnier <thgarnie@google.com> To: Thomas Gleixner <tglx@linutronix.de>, Ingo Molnar <mingo@redhat.com>, "H . Peter Anvin" <hpa@zytor.com>, Thomas Garnier <thgarnie@google.com>, Kees Cook <keescook@chromium.org> Cc: x86@kernel.org, LKML <linux-kernel@vger.kernel.org>, kernel-hardening@lists.openwall.com Subject: Re: [PATCH] x86/mm: Enable KASLR for vmemmap memory region (x86_64) Date: Mon, 1 Aug 2016 10:09:59 -0700 [thread overview] Message-ID: <CAJcbSZHZa0tk29i08xKwRuSA0hSQJ7ec3+-1W3zQ5pibC19v_Q@mail.gmail.com> (raw) In-Reply-To: <1469635196-122447-1-git-send-email-thgarnie@google.com> On Wed, Jul 27, 2016 at 8:59 AM, Thomas Garnier <thgarnie@google.com> wrote: > Add vmemmap in the list of randomized memory regions. > > The vmemmap region holds a representation of the physical memory (through > a struct page array). An attacker could use this region to disclose the > kernel memory layout (walking the page linked list). > > Signed-off-by: Thomas Garnier <thgarnie@google.com> > Signed-off-by: Kees Cook <keescook@chromium.org> > --- > Missing patch didn't pick-up by the tip bot on KASLR memory randomization. > Resending after rebase on tip and tests as discussed with Ingo. > Based on tip 4bcc8cf6ab5932cbb2511c8e18065e61b069f21c Ingo: Any comment? Can you integrate it on tip? > --- > arch/x86/include/asm/kaslr.h | 1 + > arch/x86/include/asm/pgtable_64_types.h | 4 +++- > arch/x86/mm/kaslr.c | 24 +++++++++++++++++++++++- > 3 files changed, 27 insertions(+), 2 deletions(-) > > diff --git a/arch/x86/include/asm/kaslr.h b/arch/x86/include/asm/kaslr.h > index 2674ee3..1052a79 100644 > --- a/arch/x86/include/asm/kaslr.h > +++ b/arch/x86/include/asm/kaslr.h > @@ -6,6 +6,7 @@ unsigned long kaslr_get_random_long(const char *purpose); > #ifdef CONFIG_RANDOMIZE_MEMORY > extern unsigned long page_offset_base; > extern unsigned long vmalloc_base; > +extern unsigned long vmemmap_base; > > void kernel_randomize_memory(void); > #else > diff --git a/arch/x86/include/asm/pgtable_64_types.h b/arch/x86/include/asm/pgtable_64_types.h > index 6fdef9e..3a26420 100644 > --- a/arch/x86/include/asm/pgtable_64_types.h > +++ b/arch/x86/include/asm/pgtable_64_types.h > @@ -57,11 +57,13 @@ typedef struct { pteval_t pte; } pte_t; > #define MAXMEM _AC(__AC(1, UL) << MAX_PHYSMEM_BITS, UL) > #define VMALLOC_SIZE_TB _AC(32, UL) > #define __VMALLOC_BASE _AC(0xffffc90000000000, UL) > -#define VMEMMAP_START _AC(0xffffea0000000000, UL) > +#define __VMEMMAP_BASE _AC(0xffffea0000000000, UL) > #ifdef CONFIG_RANDOMIZE_MEMORY > #define VMALLOC_START vmalloc_base > +#define VMEMMAP_START vmemmap_base > #else > #define VMALLOC_START __VMALLOC_BASE > +#define VMEMMAP_START __VMEMMAP_BASE > #endif /* CONFIG_RANDOMIZE_MEMORY */ > #define VMALLOC_END (VMALLOC_START + _AC((VMALLOC_SIZE_TB << 40) - 1, UL)) > #define MODULES_VADDR (__START_KERNEL_map + KERNEL_IMAGE_SIZE) > diff --git a/arch/x86/mm/kaslr.c b/arch/x86/mm/kaslr.c > index 26dccd6..3e9875f 100644 > --- a/arch/x86/mm/kaslr.c > +++ b/arch/x86/mm/kaslr.c > @@ -44,13 +44,22 @@ > * ensure that this order is correct and won't be changed. > */ > static const unsigned long vaddr_start = __PAGE_OFFSET_BASE; > -static const unsigned long vaddr_end = VMEMMAP_START; > + > +#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; > +#else > +static const unsigned long vaddr_end = __START_KERNEL_map; > +#endif > > /* Default values */ > unsigned long page_offset_base = __PAGE_OFFSET_BASE; > EXPORT_SYMBOL(page_offset_base); > unsigned long vmalloc_base = __VMALLOC_BASE; > EXPORT_SYMBOL(vmalloc_base); > +unsigned long vmemmap_base = __VMEMMAP_BASE; > +EXPORT_SYMBOL(vmemmap_base); > > /* > * Memory regions randomized by KASLR (except modules that use a separate logic > @@ -63,6 +72,7 @@ static __initdata struct kaslr_memory_region { > } kaslr_regions[] = { > { &page_offset_base, 64/* Maximum */ }, > { &vmalloc_base, VMALLOC_SIZE_TB }, > + { &vmemmap_base, 1 }, > }; > > /* Get size in bytes used by the memory region */ > @@ -89,6 +99,18 @@ void __init kernel_randomize_memory(void) > struct rnd_state rand_state; > unsigned long remain_entropy; > > + /* > + * All these BUILD_BUG_ON checks ensures the memory layout is > + * consistent with the vaddr_start/vaddr_end variables. > + */ > + BUILD_BUG_ON(vaddr_start >= vaddr_end); > + BUILD_BUG_ON(config_enabled(CONFIG_X86_ESPFIX64) && > + vaddr_end >= EFI_VA_START); > + BUILD_BUG_ON((config_enabled(CONFIG_X86_ESPFIX64) || > + config_enabled(CONFIG_EFI)) && > + vaddr_end >= __START_KERNEL_map); > + BUILD_BUG_ON(vaddr_end > __START_KERNEL_map); > + > if (!kaslr_memory_enabled()) > return; > > -- > 2.8.0.rc3.226.g39d4020 >
WARNING: multiple messages have this Message-ID (diff)
From: Thomas Garnier <thgarnie@google.com> To: Thomas Gleixner <tglx@linutronix.de>, Ingo Molnar <mingo@redhat.com>, "H . Peter Anvin" <hpa@zytor.com>, Thomas Garnier <thgarnie@google.com>, Kees Cook <keescook@chromium.org> Cc: x86@kernel.org, LKML <linux-kernel@vger.kernel.org>, kernel-hardening@lists.openwall.com Subject: [kernel-hardening] Re: [PATCH] x86/mm: Enable KASLR for vmemmap memory region (x86_64) Date: Mon, 1 Aug 2016 10:09:59 -0700 [thread overview] Message-ID: <CAJcbSZHZa0tk29i08xKwRuSA0hSQJ7ec3+-1W3zQ5pibC19v_Q@mail.gmail.com> (raw) In-Reply-To: <1469635196-122447-1-git-send-email-thgarnie@google.com> On Wed, Jul 27, 2016 at 8:59 AM, Thomas Garnier <thgarnie@google.com> wrote: > Add vmemmap in the list of randomized memory regions. > > The vmemmap region holds a representation of the physical memory (through > a struct page array). An attacker could use this region to disclose the > kernel memory layout (walking the page linked list). > > Signed-off-by: Thomas Garnier <thgarnie@google.com> > Signed-off-by: Kees Cook <keescook@chromium.org> > --- > Missing patch didn't pick-up by the tip bot on KASLR memory randomization. > Resending after rebase on tip and tests as discussed with Ingo. > Based on tip 4bcc8cf6ab5932cbb2511c8e18065e61b069f21c Ingo: Any comment? Can you integrate it on tip? > --- > arch/x86/include/asm/kaslr.h | 1 + > arch/x86/include/asm/pgtable_64_types.h | 4 +++- > arch/x86/mm/kaslr.c | 24 +++++++++++++++++++++++- > 3 files changed, 27 insertions(+), 2 deletions(-) > > diff --git a/arch/x86/include/asm/kaslr.h b/arch/x86/include/asm/kaslr.h > index 2674ee3..1052a79 100644 > --- a/arch/x86/include/asm/kaslr.h > +++ b/arch/x86/include/asm/kaslr.h > @@ -6,6 +6,7 @@ unsigned long kaslr_get_random_long(const char *purpose); > #ifdef CONFIG_RANDOMIZE_MEMORY > extern unsigned long page_offset_base; > extern unsigned long vmalloc_base; > +extern unsigned long vmemmap_base; > > void kernel_randomize_memory(void); > #else > diff --git a/arch/x86/include/asm/pgtable_64_types.h b/arch/x86/include/asm/pgtable_64_types.h > index 6fdef9e..3a26420 100644 > --- a/arch/x86/include/asm/pgtable_64_types.h > +++ b/arch/x86/include/asm/pgtable_64_types.h > @@ -57,11 +57,13 @@ typedef struct { pteval_t pte; } pte_t; > #define MAXMEM _AC(__AC(1, UL) << MAX_PHYSMEM_BITS, UL) > #define VMALLOC_SIZE_TB _AC(32, UL) > #define __VMALLOC_BASE _AC(0xffffc90000000000, UL) > -#define VMEMMAP_START _AC(0xffffea0000000000, UL) > +#define __VMEMMAP_BASE _AC(0xffffea0000000000, UL) > #ifdef CONFIG_RANDOMIZE_MEMORY > #define VMALLOC_START vmalloc_base > +#define VMEMMAP_START vmemmap_base > #else > #define VMALLOC_START __VMALLOC_BASE > +#define VMEMMAP_START __VMEMMAP_BASE > #endif /* CONFIG_RANDOMIZE_MEMORY */ > #define VMALLOC_END (VMALLOC_START + _AC((VMALLOC_SIZE_TB << 40) - 1, UL)) > #define MODULES_VADDR (__START_KERNEL_map + KERNEL_IMAGE_SIZE) > diff --git a/arch/x86/mm/kaslr.c b/arch/x86/mm/kaslr.c > index 26dccd6..3e9875f 100644 > --- a/arch/x86/mm/kaslr.c > +++ b/arch/x86/mm/kaslr.c > @@ -44,13 +44,22 @@ > * ensure that this order is correct and won't be changed. > */ > static const unsigned long vaddr_start = __PAGE_OFFSET_BASE; > -static const unsigned long vaddr_end = VMEMMAP_START; > + > +#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; > +#else > +static const unsigned long vaddr_end = __START_KERNEL_map; > +#endif > > /* Default values */ > unsigned long page_offset_base = __PAGE_OFFSET_BASE; > EXPORT_SYMBOL(page_offset_base); > unsigned long vmalloc_base = __VMALLOC_BASE; > EXPORT_SYMBOL(vmalloc_base); > +unsigned long vmemmap_base = __VMEMMAP_BASE; > +EXPORT_SYMBOL(vmemmap_base); > > /* > * Memory regions randomized by KASLR (except modules that use a separate logic > @@ -63,6 +72,7 @@ static __initdata struct kaslr_memory_region { > } kaslr_regions[] = { > { &page_offset_base, 64/* Maximum */ }, > { &vmalloc_base, VMALLOC_SIZE_TB }, > + { &vmemmap_base, 1 }, > }; > > /* Get size in bytes used by the memory region */ > @@ -89,6 +99,18 @@ void __init kernel_randomize_memory(void) > struct rnd_state rand_state; > unsigned long remain_entropy; > > + /* > + * All these BUILD_BUG_ON checks ensures the memory layout is > + * consistent with the vaddr_start/vaddr_end variables. > + */ > + BUILD_BUG_ON(vaddr_start >= vaddr_end); > + BUILD_BUG_ON(config_enabled(CONFIG_X86_ESPFIX64) && > + vaddr_end >= EFI_VA_START); > + BUILD_BUG_ON((config_enabled(CONFIG_X86_ESPFIX64) || > + config_enabled(CONFIG_EFI)) && > + vaddr_end >= __START_KERNEL_map); > + BUILD_BUG_ON(vaddr_end > __START_KERNEL_map); > + > if (!kaslr_memory_enabled()) > return; > > -- > 2.8.0.rc3.226.g39d4020 >
next prev parent reply other threads:[~2016-08-01 17:10 UTC|newest] Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top 2016-07-27 15:59 [PATCH] x86/mm: Enable KASLR for vmemmap memory region (x86_64) Thomas Garnier 2016-07-27 15:59 ` [kernel-hardening] " Thomas Garnier 2016-08-01 17:09 ` Thomas Garnier [this message] 2016-08-01 17:09 ` [kernel-hardening] " Thomas Garnier 2016-08-02 8:14 ` Ingo Molnar 2016-08-02 8:14 ` [kernel-hardening] " Ingo Molnar 2016-08-02 14:24 ` Thomas Garnier 2016-08-02 14:24 ` [kernel-hardening] " Thomas Garnier 2016-08-10 18:13 ` [tip:x86/mm] x86/mm/64: Enable KASLR for vmemmap memory region tip-bot for Thomas Garnier
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=CAJcbSZHZa0tk29i08xKwRuSA0hSQJ7ec3+-1W3zQ5pibC19v_Q@mail.gmail.com \ --to=thgarnie@google.com \ --cc=hpa@zytor.com \ --cc=keescook@chromium.org \ --cc=kernel-hardening@lists.openwall.com \ --cc=linux-kernel@vger.kernel.org \ --cc=mingo@redhat.com \ --cc=tglx@linutronix.de \ --cc=x86@kernel.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.