The patch titled Subject: mm: expose arch_mmap_rnd when available has been added to the -mm tree. Its filename is mm-expose-arch_mmap_rnd-when-available.patch This patch should soon appear at http://ozlabs.org/~akpm/mmots/broken-out/mm-expose-arch_mmap_rnd-when-available.patch and later at http://ozlabs.org/~akpm/mmotm/broken-out/mm-expose-arch_mmap_rnd-when-available.patch Before you just go and hit "reply", please: a) Consider who else should be cc'ed b) Prefer to cc a suitable mailing list as well c) Ideally: find the original patch on the mailing list and do a reply-to-all to that, adding suitable additional cc's *** Remember to use Documentation/SubmitChecklist when testing your code *** The -mm tree is included into linux-next and is updated there every 3-4 working days ------------------------------------------------------ From: Kees Cook <keescook@xxxxxxxxxxxx> Subject: mm: expose arch_mmap_rnd when available When an architecture fully supports randomizing the ELF load location, the arch_mmap_rnd() function becomes available. Rename and expose these functions where they exist. Introduces CONFIG_ARCH_HAS_ELF_RANDOMIZE. Signed-off-by: Kees Cook <keescook@xxxxxxxxxxxx> Cc: Hector Marco-Gisbert <hecmargi@xxxxxx> Cc: Russell King <linux@xxxxxxxxxxxxxxxx> Cc: Ingo Molnar <mingo@xxxxxxx> Cc: Catalin Marinas <catalin.marinas@xxxxxxx> Cc: Will Deacon <will.deacon@xxxxxxx> Cc: Ralf Baechle <ralf@xxxxxxxxxxxxxx> Cc: Benjamin Herrenschmidt <benh@xxxxxxxxxxxxxxxxxxx> Cc: Paul Mackerras <paulus@xxxxxxxxx> Cc: Michael Ellerman <mpe@xxxxxxxxxxxxxx> Cc: Martin Schwidefsky <schwidefsky@xxxxxxxxxx> Cc: Heiko Carstens <heiko.carstens@xxxxxxxxxx> Cc: Alexander Viro <viro@xxxxxxxxxxxxxxxxxx> Cc: Oleg Nesterov <oleg@xxxxxxxxxx> Cc: Andy Lutomirski <luto@xxxxxxxxxxxxxx> Cc: "David A. Long" <dave.long@xxxxxxxxxx> Cc: Andrey Ryabinin <a.ryabinin@xxxxxxxxxxx> Cc: Arun Chandran <achandran@xxxxxxxxxx> Cc: Yann Droneaud <ydroneaud@xxxxxxxxxx> Cc: Min-Hua Chen <orca.chen@xxxxxxxxx> Cc: Paul Burton <paul.burton@xxxxxxxxxx> Cc: Alex Smith <alex@xxxxxxxxxxxxxxxx> Cc: Markos Chandras <markos.chandras@xxxxxxxxxx> Cc: Vineeth Vijayan <vvijayan@xxxxxxxxxx> Cc: Jeff Bailey <jeffbailey@xxxxxxxxxx> Cc: Michael Holzheu <holzheu@xxxxxxxxxxxxxxxxxx> Cc: Ben Hutchings <ben@xxxxxxxxxxxxxxx> Cc: Behan Webster <behanw@xxxxxxxxxxxxxxxxxx> Cc: Ismael Ripoll <iripoll@xxxxxx> Cc: Hector Marco-Gisbert <hecmargi@xxxxxx> Cc: Jan-Simon Mller <dl9pf@xxxxxx> Signed-off-by: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx> --- arch/Kconfig | 7 +++++++ arch/arm/Kconfig | 1 + arch/arm/mm/mmap.c | 4 ++-- arch/arm64/Kconfig | 1 + arch/arm64/mm/mmap.c | 4 ++-- arch/mips/Kconfig | 1 + arch/mips/mm/mmap.c | 9 ++++++--- arch/powerpc/Kconfig | 1 + arch/powerpc/mm/mmap.c | 4 ++-- arch/s390/Kconfig | 1 + arch/s390/mm/mmap.c | 8 ++++---- arch/x86/Kconfig | 1 + arch/x86/mm/mmap.c | 6 +++--- fs/binfmt_elf.c | 1 + include/linux/elf-randomize.h | 10 ++++++++++ 15 files changed, 43 insertions(+), 16 deletions(-) diff -puN arch/Kconfig~mm-expose-arch_mmap_rnd-when-available arch/Kconfig --- a/arch/Kconfig~mm-expose-arch_mmap_rnd-when-available +++ a/arch/Kconfig @@ -488,6 +488,13 @@ config PGTABLE_LEVELS int default 2 +config ARCH_HAS_ELF_RANDOMIZE + bool + help + An architecture supports choosing randomized locations for + stack, mmap, brk, and ET_DYN. Defined functions: + - arch_mmap_rnd(), must respect (current->flags & PF_RANDOMIZE) + # # ABI hall of shame # diff -puN arch/arm/Kconfig~mm-expose-arch_mmap_rnd-when-available arch/arm/Kconfig --- a/arch/arm/Kconfig~mm-expose-arch_mmap_rnd-when-available +++ a/arch/arm/Kconfig @@ -3,6 +3,7 @@ config ARM default y select ARCH_BINFMT_ELF_RANDOMIZE_PIE select ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE + select ARCH_HAS_ELF_RANDOMIZE select ARCH_HAS_TICK_BROADCAST if GENERIC_CLOCKEVENTS_BROADCAST select ARCH_HAVE_CUSTOM_GPIO_H select ARCH_HAS_GCOV_PROFILE_ALL diff -puN arch/arm/mm/mmap.c~mm-expose-arch_mmap_rnd-when-available arch/arm/mm/mmap.c --- a/arch/arm/mm/mmap.c~mm-expose-arch_mmap_rnd-when-available +++ a/arch/arm/mm/mmap.c @@ -169,7 +169,7 @@ arch_get_unmapped_area_topdown(struct fi return addr; } -static unsigned long mmap_rnd(void) +unsigned long arch_mmap_rnd(void) { unsigned long rnd = 0UL; @@ -183,7 +183,7 @@ static unsigned long mmap_rnd(void) void arch_pick_mmap_layout(struct mm_struct *mm) { - unsigned long random_factor = mmap_rnd(); + unsigned long random_factor = arch_mmap_rnd(); if (mmap_is_legacy()) { mm->mmap_base = TASK_UNMAPPED_BASE + random_factor; diff -puN arch/arm64/Kconfig~mm-expose-arch_mmap_rnd-when-available arch/arm64/Kconfig --- a/arch/arm64/Kconfig~mm-expose-arch_mmap_rnd-when-available +++ a/arch/arm64/Kconfig @@ -2,6 +2,7 @@ config ARM64 def_bool y select ARCH_BINFMT_ELF_RANDOMIZE_PIE select ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE + select ARCH_HAS_ELF_RANDOMIZE select ARCH_HAS_GCOV_PROFILE_ALL select ARCH_HAS_SG_CHAIN select ARCH_HAS_TICK_BROADCAST if GENERIC_CLOCKEVENTS_BROADCAST diff -puN arch/arm64/mm/mmap.c~mm-expose-arch_mmap_rnd-when-available arch/arm64/mm/mmap.c --- a/arch/arm64/mm/mmap.c~mm-expose-arch_mmap_rnd-when-available +++ a/arch/arm64/mm/mmap.c @@ -47,7 +47,7 @@ static int mmap_is_legacy(void) return sysctl_legacy_va_layout; } -static unsigned long mmap_rnd(void) +unsigned long arch_mmap_rnd(void) { unsigned long rnd = 0; @@ -66,7 +66,7 @@ static unsigned long mmap_base(void) else if (gap > MAX_GAP) gap = MAX_GAP; - return PAGE_ALIGN(STACK_TOP - gap - mmap_rnd()); + return PAGE_ALIGN(STACK_TOP - gap - arch_mmap_rnd()); } /* diff -puN arch/mips/Kconfig~mm-expose-arch_mmap_rnd-when-available arch/mips/Kconfig --- a/arch/mips/Kconfig~mm-expose-arch_mmap_rnd-when-available +++ a/arch/mips/Kconfig @@ -24,6 +24,7 @@ config MIPS select HAVE_DEBUG_KMEMLEAK select HAVE_SYSCALL_TRACEPOINTS select ARCH_BINFMT_ELF_RANDOMIZE_PIE + select ARCH_HAS_ELF_RANDOMIZE select HAVE_ARCH_TRANSPARENT_HUGEPAGE if CPU_SUPPORTS_HUGEPAGES && 64BIT select RTC_LIB if !MACH_LOONGSON select GENERIC_ATOMIC64 if !64BIT diff -puN arch/mips/mm/mmap.c~mm-expose-arch_mmap_rnd-when-available arch/mips/mm/mmap.c --- a/arch/mips/mm/mmap.c~mm-expose-arch_mmap_rnd-when-available +++ a/arch/mips/mm/mmap.c @@ -164,9 +164,12 @@ void arch_pick_mmap_layout(struct mm_str } } -static inline unsigned long brk_rnd(void) +unsigned long arch_mmap_rnd(void) { - unsigned long rnd = get_random_int(); + unsigned long rnd = 0; + + if (current->flags & PF_RANDOMIZE) + rnd = get_random_int(); rnd = rnd << PAGE_SHIFT; /* 8MB for 32bit, 256MB for 64bit */ @@ -183,7 +186,7 @@ unsigned long arch_randomize_brk(struct unsigned long base = mm->brk; unsigned long ret; - ret = PAGE_ALIGN(base + brk_rnd()); + ret = PAGE_ALIGN(base + arch_mmap_rnd()); if (ret < mm->brk) return mm->brk; diff -puN arch/powerpc/Kconfig~mm-expose-arch_mmap_rnd-when-available arch/powerpc/Kconfig --- a/arch/powerpc/Kconfig~mm-expose-arch_mmap_rnd-when-available +++ a/arch/powerpc/Kconfig @@ -89,6 +89,7 @@ config PPC select ARCH_MIGHT_HAVE_PC_SERIO select BINFMT_ELF select ARCH_BINFMT_ELF_RANDOMIZE_PIE + select ARCH_HAS_ELF_RANDOMIZE select OF select OF_EARLY_FLATTREE select OF_RESERVED_MEM diff -puN arch/powerpc/mm/mmap.c~mm-expose-arch_mmap_rnd-when-available arch/powerpc/mm/mmap.c --- a/arch/powerpc/mm/mmap.c~mm-expose-arch_mmap_rnd-when-available +++ a/arch/powerpc/mm/mmap.c @@ -53,7 +53,7 @@ static inline int mmap_is_legacy(void) return sysctl_legacy_va_layout; } -static unsigned long mmap_rnd(void) +unsigned long arch_mmap_rnd(void) { unsigned long rnd = 0; @@ -76,7 +76,7 @@ static inline unsigned long mmap_base(vo else if (gap > MAX_GAP) gap = MAX_GAP; - return PAGE_ALIGN(TASK_SIZE - gap - mmap_rnd()); + return PAGE_ALIGN(TASK_SIZE - gap - arch_mmap_rnd()); } /* diff -puN arch/s390/Kconfig~mm-expose-arch_mmap_rnd-when-available arch/s390/Kconfig --- a/arch/s390/Kconfig~mm-expose-arch_mmap_rnd-when-available +++ a/arch/s390/Kconfig @@ -65,6 +65,7 @@ config S390 def_bool y select ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE select ARCH_HAS_DEBUG_STRICT_USER_COPY_CHECKS + select ARCH_HAS_ELF_RANDOMIZE select ARCH_HAS_GCOV_PROFILE_ALL select ARCH_HAS_SG_CHAIN select ARCH_HAVE_NMI_SAFE_CMPXCHG diff -puN arch/s390/mm/mmap.c~mm-expose-arch_mmap_rnd-when-available arch/s390/mm/mmap.c --- a/arch/s390/mm/mmap.c~mm-expose-arch_mmap_rnd-when-available +++ a/arch/s390/mm/mmap.c @@ -60,7 +60,7 @@ static inline int mmap_is_legacy(void) return sysctl_legacy_va_layout; } -static unsigned long mmap_rnd(void) +unsigned long arch_mmap_rnd(void) { if (!(current->flags & PF_RANDOMIZE)) return 0; @@ -72,7 +72,7 @@ static unsigned long mmap_rnd(void) static unsigned long mmap_base_legacy(void) { - return TASK_UNMAPPED_BASE + mmap_rnd(); + return TASK_UNMAPPED_BASE + arch_mmap_rnd(); } static inline unsigned long mmap_base(void) @@ -84,7 +84,7 @@ static inline unsigned long mmap_base(vo else if (gap > MAX_GAP) gap = MAX_GAP; gap &= PAGE_MASK; - return STACK_TOP - stack_maxrandom_size() - mmap_rnd() - gap; + return STACK_TOP - stack_maxrandom_size() - arch_mmap_rnd() - gap; } unsigned long @@ -187,7 +187,7 @@ unsigned long randomize_et_dyn(void) if (!is_32bit_task()) /* Align to 4GB */ base &= ~((1UL << 32) - 1); - return base + mmap_rnd(); + return base + arch_mmap_rnd(); } #ifndef CONFIG_64BIT diff -puN arch/x86/Kconfig~mm-expose-arch_mmap_rnd-when-available arch/x86/Kconfig --- a/arch/x86/Kconfig~mm-expose-arch_mmap_rnd-when-available +++ a/arch/x86/Kconfig @@ -88,6 +88,7 @@ config X86 select HAVE_ARCH_KASAN if X86_64 && SPARSEMEM_VMEMMAP select HAVE_USER_RETURN_NOTIFIER select ARCH_BINFMT_ELF_RANDOMIZE_PIE + select ARCH_HAS_ELF_RANDOMIZE select HAVE_ARCH_JUMP_LABEL select ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE select SPARSE_IRQ diff -puN arch/x86/mm/mmap.c~mm-expose-arch_mmap_rnd-when-available arch/x86/mm/mmap.c --- a/arch/x86/mm/mmap.c~mm-expose-arch_mmap_rnd-when-available +++ a/arch/x86/mm/mmap.c @@ -65,7 +65,7 @@ static int mmap_is_legacy(void) return sysctl_legacy_va_layout; } -static unsigned long mmap_rnd(void) +unsigned long arch_mmap_rnd(void) { unsigned long rnd = 0; @@ -91,7 +91,7 @@ static unsigned long mmap_base(void) else if (gap > MAX_GAP) gap = MAX_GAP; - return PAGE_ALIGN(TASK_SIZE - gap - mmap_rnd()); + return PAGE_ALIGN(TASK_SIZE - gap - arch_mmap_rnd()); } /* @@ -103,7 +103,7 @@ static unsigned long mmap_legacy_base(vo if (mmap_is_ia32()) return TASK_UNMAPPED_BASE; else - return TASK_UNMAPPED_BASE + mmap_rnd(); + return TASK_UNMAPPED_BASE + arch_mmap_rnd(); } /* diff -puN fs/binfmt_elf.c~mm-expose-arch_mmap_rnd-when-available fs/binfmt_elf.c --- a/fs/binfmt_elf.c~mm-expose-arch_mmap_rnd-when-available +++ a/fs/binfmt_elf.c @@ -31,6 +31,7 @@ #include <linux/security.h> #include <linux/random.h> #include <linux/elf.h> +#include <linux/elf-randomize.h> #include <linux/utsname.h> #include <linux/coredump.h> #include <linux/sched.h> diff -puN /dev/null include/linux/elf-randomize.h --- /dev/null +++ a/include/linux/elf-randomize.h @@ -0,0 +1,10 @@ +#ifndef _ELF_RANDOMIZE_H +#define _ELF_RANDOMIZE_H + +#ifndef CONFIG_ARCH_HAS_ELF_RANDOMIZE +static inline unsigned long arch_mmap_rnd(void) { return 0; } +#else +extern unsigned long arch_mmap_rnd(void); +#endif + +#endif _ Patches currently in -mm which might be from keescook@xxxxxxxxxxxx are origin.patch arm-factor-out-mmap-aslr-into-mmap_rnd.patch mm-expose-arch_mmap_rnd-when-available.patch mm-move-randomize_et_dyn-into-elf_et_dyn_base.patch mm-split-et_dyn-aslr-from-mmap-aslr.patch mm-fold-arch_randomize_brk-into-arch_has_elf_randomize.patch lib-vsprintf-add-%pt-format-specifier.patch linux-next.patch -- To unsubscribe from this list: send the line "unsubscribe mm-commits" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html