Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1380329 > unrolled thread
| Started by | Thomas Garnier <thgarnie@google.com> |
|---|---|
| First post | 2016-04-16 00:10 +0200 |
| Last post | 2016-04-16 00:10 +0200 |
| Articles | 2 — 1 participant |
Back to article view | Back to linux.kernel
[RFC v1 0/4] x86, boot: KASLR memory implementation (x86_64) Thomas Garnier <thgarnie@google.com> - 2016-04-16 00:10 +0200
[RFC v1 4/4] x86, boot: Memory hotplug support for KASLR memory randomization Thomas Garnier <thgarnie@google.com> - 2016-04-16 00:10 +0200
| From | Thomas Garnier <thgarnie@google.com> |
|---|---|
| Date | 2016-04-16 00:10 +0200 |
| Subject | [RFC v1 0/4] x86, boot: KASLR memory implementation (x86_64) |
| Message-ID | <rok66-1C3-15@gated-at.bofh.it> |
This is RFC v1 for KASLR memory implementation on x86_64. It was reviewed
early by Kees Cook.
***Background:
The current implementation of KASLR randomizes only the base address of
the kernel and its modules. Research was published showing that static
memory can be overwitten to elevate privileges bypassing KASLR.
In more details:
The physical memory mapping holds most allocations from boot and heap
allocators. Knowning the base address and physical memory size, an
attacker can deduce the PDE virtual address for the vDSO memory page.
This attack was demonstrated at CanSecWest 2016, in the "Getting
Physical Extreme Abuse of Intel Based Paged Systems"
https://goo.gl/ANpWdV (see second part of the presentation). Similar
research was done at Google leading to this patch proposal. Variants
exists to overwrite /proc or /sys objects ACLs leading to elevation of
privileges.
This set of patches randomizes base address and padding of three
major memory sections (physical memory mapping, vmalloc & vmemmap).
It mitigates exploits relying on predictable kernel addresses. This
feature can be enabled with the CONFIG_RANDOMIZE_MEMORY option.
Padding for the memory hotplug support is managed by
CONFIG_RANDOMIZE_MEMORY_PHYSICAL_PADDING. The default value is 10
terabytes.
The patches were tested on qemu & physical machines. Xen compatibility was
also verified. Multiple reboots were used to verify entropy for each
memory section.
***Problems that needed solving:
- The three target memory sections are never at the same place between
boots.
- The physical memory mapping can use a virtual address not aligned on
the PGD page table.
- Have good entropy early at boot before get_random_bytes is available.
- Add optional padding for memory hotplug compatibility.
***Parts:
- The first part prepares for the KASLR memory randomization by
refactoring entropy functions used by the current implementation and
support PUD level virtual addresses for physical mapping.
(Patches 01-02)
- The second part implements the KASLR memory randomization for all
sections mentioned.
(Patch 03)
- The third part adds support for memory hotplug by adding an option to
define the padding used between the physical memory mapping section
and the others.
(Patch 04)
Thanks!
Thomas
[toc] | [next] | [standalone]
| From | Thomas Garnier <thgarnie@google.com> |
|---|---|
| Date | 2016-04-16 00:10 +0200 |
| Subject | [RFC v1 4/4] x86, boot: Memory hotplug support for KASLR memory randomization |
| Message-ID | <rok67-1C3-31@gated-at.bofh.it> |
| In reply to | #1380329 |
Add a new option (CONFIG_RANDOMIZE_MEMORY_PHYSICAL_PADDING) to define
the padding used for the physical memory mapping section when KASLR
memory is enabled. It ensures there is enough virtual address space when
CONFIG_MEMORY_HOTPLUG is used. The default value is 10 terabytes. If
CONFIG_MEMORY_HOTPLUG is not used, no space is reserved increasing the
entropy available.
Signed-off-by: Thomas Garnier <thgarnie@google.com>
---
Based on next-20160413
---
arch/x86/Kconfig | 15 +++++++++++++++
arch/x86/mm/kaslr.c | 14 ++++++++++++--
2 files changed, 27 insertions(+), 2 deletions(-)
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
index 7c786d4..cc01b69 100644
--- a/arch/x86/Kconfig
+++ b/arch/x86/Kconfig
@@ -2018,6 +2018,21 @@ config RANDOMIZE_MEMORY
If unsure, say N.
+config RANDOMIZE_MEMORY_PHYSICAL_PADDING
+ hex "Physical memory mapping padding" if EXPERT
+ depends on RANDOMIZE_MEMORY
+ default "0xa" if MEMORY_HOTPLUG
+ default "0x0"
+ range 0x1 0x40 if MEMORY_HOTPLUG
+ range 0x0 0x40
+ ---help---
+ Define the padding in terabyte added to the existing physical memory
+ size during kernel memory randomization. It is useful for memory
+ hotplug support but reduces the entropy available for address
+ randomization.
+
+ If unsure, leave at the default value.
+
config HOTPLUG_CPU
bool "Support for hot-pluggable CPUs"
depends on SMP
diff --git a/arch/x86/mm/kaslr.c b/arch/x86/mm/kaslr.c
index 9de807d..f7dc477 100644
--- a/arch/x86/mm/kaslr.c
+++ b/arch/x86/mm/kaslr.c
@@ -63,7 +63,7 @@ void __init kernel_randomize_memory(void)
{
size_t i;
unsigned long addr = memory_rand_start;
- unsigned long padding, rand, mem_tb;
+ unsigned long padding, rand, mem_tb, page_offset_padding;
struct rnd_state rnd_st;
unsigned long remain_padding = memory_rand_end - memory_rand_start;
@@ -74,8 +74,18 @@ void __init kernel_randomize_memory(void)
if (!xen_domain())
page_offset_base -= __XEN_SPACE;
+ /*
+ * Update Physical memory mapping to available and
+ * add padding if needed (especially for memory hotplug support).
+ */
+ page_offset_padding = CONFIG_RANDOMIZE_MEMORY_PHYSICAL_PADDING;
+
+#ifdef CONFIG_MEMORY_HOTPLUG
+ page_offset_padding = max(1UL, page_offset_padding);
+#endif
+
BUG_ON(kaslr_regions[0].base != &page_offset_base);
- mem_tb = ((max_pfn << PAGE_SHIFT) >> TB_SHIFT);
+ mem_tb = ((max_pfn << PAGE_SHIFT) >> TB_SHIFT) + page_offset_padding;
if (mem_tb < kaslr_regions[0].size_tb)
kaslr_regions[0].size_tb = mem_tb;
--
2.8.0.rc3.226.g39d4020
[toc] | [prev] | [standalone]
Back to top | Article view | linux.kernel
csiph-web