Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

mm: expose arch_mmap_rnd when available

When an architecture fully supports randomizing the ELF load location,
a per-arch mmap_rnd() function is used to find a randomized mmap base.
In preparation for randomizing the location of ET_DYN binaries
separately from mmap, this renames and exports these functions as
arch_mmap_rnd(). Additionally introduces CONFIG_ARCH_HAS_ELF_RANDOMIZE
for describing this feature on architectures that support it
(which is a superset of ARCH_BINFMT_ELF_RANDOMIZE_PIE, since s390
already supports a separated ET_DYN ASLR from mmap ASLR without the
ARCH_BINFMT_ELF_RANDOMIZE_PIE logic).

Signed-off-by: Kees Cook <keescook@chromium.org>
Cc: Hector Marco-Gisbert <hecmargi@upv.es>
Cc: Russell King <linux@arm.linux.org.uk>
Reviewed-by: Ingo Molnar <mingo@kernel.org>
Cc: Catalin Marinas <catalin.marinas@arm.com>
Cc: Will Deacon <will.deacon@arm.com>
Cc: Ralf Baechle <ralf@linux-mips.org>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Michael Ellerman <mpe@ellerman.id.au>
Cc: Martin Schwidefsky <schwidefsky@de.ibm.com>
Cc: Heiko Carstens <heiko.carstens@de.ibm.com>
Cc: Alexander Viro <viro@zeniv.linux.org.uk>
Cc: Oleg Nesterov <oleg@redhat.com>
Cc: Andy Lutomirski <luto@amacapital.net>
Cc: "David A. Long" <dave.long@linaro.org>
Cc: Andrey Ryabinin <a.ryabinin@samsung.com>
Cc: Arun Chandran <achandran@mvista.com>
Cc: Yann Droneaud <ydroneaud@opteya.com>
Cc: Min-Hua Chen <orca.chen@gmail.com>
Cc: Paul Burton <paul.burton@imgtec.com>
Cc: Alex Smith <alex@alex-smith.me.uk>
Cc: Markos Chandras <markos.chandras@imgtec.com>
Cc: Vineeth Vijayan <vvijayan@mvista.com>
Cc: Jeff Bailey <jeffbailey@google.com>
Cc: Michael Holzheu <holzheu@linux.vnet.ibm.com>
Cc: Ben Hutchings <ben@decadent.org.uk>
Cc: Behan Webster <behanw@converseincode.com>
Cc: Ismael Ripoll <iripoll@upv.es>
Cc: Jan-Simon Mller <dl9pf@gmx.de>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

authored by

Kees Cook and committed by
Linus Torvalds
2b68f6ca 8e89a356

+37 -14
+7
arch/Kconfig
··· 491 491 int 492 492 default 2 493 493 494 + config ARCH_HAS_ELF_RANDOMIZE 495 + bool 496 + help 497 + An architecture supports choosing randomized locations for 498 + stack, mmap, brk, and ET_DYN. Defined functions: 499 + - arch_mmap_rnd() 500 + 494 501 # 495 502 # ABI hall of shame 496 503 #
+1
arch/arm/Kconfig
··· 3 3 default y 4 4 select ARCH_BINFMT_ELF_RANDOMIZE_PIE 5 5 select ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE 6 + select ARCH_HAS_ELF_RANDOMIZE 6 7 select ARCH_HAS_TICK_BROADCAST if GENERIC_CLOCKEVENTS_BROADCAST 7 8 select ARCH_HAVE_CUSTOM_GPIO_H 8 9 select ARCH_HAS_GCOV_PROFILE_ALL
+2 -2
arch/arm/mm/mmap.c
··· 169 169 return addr; 170 170 } 171 171 172 - static unsigned long mmap_rnd(void) 172 + unsigned long arch_mmap_rnd(void) 173 173 { 174 174 unsigned long rnd; 175 175 ··· 184 184 unsigned long random_factor = 0UL; 185 185 186 186 if (current->flags & PF_RANDOMIZE) 187 - random_factor = mmap_rnd(); 187 + random_factor = arch_mmap_rnd(); 188 188 189 189 if (mmap_is_legacy()) { 190 190 mm->mmap_base = TASK_UNMAPPED_BASE + random_factor;
+1
arch/arm64/Kconfig
··· 2 2 def_bool y 3 3 select ARCH_BINFMT_ELF_RANDOMIZE_PIE 4 4 select ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE 5 + select ARCH_HAS_ELF_RANDOMIZE 5 6 select ARCH_HAS_GCOV_PROFILE_ALL 6 7 select ARCH_HAS_SG_CHAIN 7 8 select ARCH_HAS_TICK_BROADCAST if GENERIC_CLOCKEVENTS_BROADCAST
+2 -2
arch/arm64/mm/mmap.c
··· 47 47 return sysctl_legacy_va_layout; 48 48 } 49 49 50 - static unsigned long mmap_rnd(void) 50 + unsigned long arch_mmap_rnd(void) 51 51 { 52 52 unsigned long rnd; 53 53 ··· 77 77 unsigned long random_factor = 0UL; 78 78 79 79 if (current->flags & PF_RANDOMIZE) 80 - random_factor = mmap_rnd(); 80 + random_factor = arch_mmap_rnd(); 81 81 82 82 /* 83 83 * Fall back to the standard layout if the personality bit is set, or
+1
arch/mips/Kconfig
··· 24 24 select HAVE_DEBUG_KMEMLEAK 25 25 select HAVE_SYSCALL_TRACEPOINTS 26 26 select ARCH_BINFMT_ELF_RANDOMIZE_PIE 27 + select ARCH_HAS_ELF_RANDOMIZE 27 28 select HAVE_ARCH_TRANSPARENT_HUGEPAGE if CPU_SUPPORTS_HUGEPAGES && 64BIT 28 29 select RTC_LIB if !MACH_LOONGSON 29 30 select GENERIC_ATOMIC64 if !64BIT
+2 -2
arch/mips/mm/mmap.c
··· 142 142 addr0, len, pgoff, flags, DOWN); 143 143 } 144 144 145 - static unsigned long mmap_rnd(void) 145 + unsigned long arch_mmap_rnd(void) 146 146 { 147 147 unsigned long rnd; 148 148 ··· 161 161 unsigned long random_factor = 0UL; 162 162 163 163 if (current->flags & PF_RANDOMIZE) 164 - random_factor = mmap_rnd(); 164 + random_factor = arch_mmap_rnd(); 165 165 166 166 if (mmap_is_legacy()) { 167 167 mm->mmap_base = TASK_UNMAPPED_BASE + random_factor;
+1
arch/powerpc/Kconfig
··· 89 89 select ARCH_MIGHT_HAVE_PC_SERIO 90 90 select BINFMT_ELF 91 91 select ARCH_BINFMT_ELF_RANDOMIZE_PIE 92 + select ARCH_HAS_ELF_RANDOMIZE 92 93 select OF 93 94 select OF_EARLY_FLATTREE 94 95 select OF_RESERVED_MEM
+2 -2
arch/powerpc/mm/mmap.c
··· 53 53 return sysctl_legacy_va_layout; 54 54 } 55 55 56 - static unsigned long mmap_rnd(void) 56 + unsigned long arch_mmap_rnd(void) 57 57 { 58 58 unsigned long rnd; 59 59 ··· 87 87 unsigned long random_factor = 0UL; 88 88 89 89 if (current->flags & PF_RANDOMIZE) 90 - random_factor = mmap_rnd(); 90 + random_factor = arch_mmap_rnd(); 91 91 92 92 /* 93 93 * Fall back to the standard layout if the personality
+1
arch/s390/Kconfig
··· 65 65 def_bool y 66 66 select ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE 67 67 select ARCH_HAS_DEBUG_STRICT_USER_COPY_CHECKS 68 + select ARCH_HAS_ELF_RANDOMIZE 68 69 select ARCH_HAS_GCOV_PROFILE_ALL 69 70 select ARCH_HAS_SG_CHAIN 70 71 select ARCH_HAVE_NMI_SAFE_CMPXCHG
+4 -4
arch/s390/mm/mmap.c
··· 60 60 return sysctl_legacy_va_layout; 61 61 } 62 62 63 - static unsigned long mmap_rnd(void) 63 + unsigned long arch_mmap_rnd(void) 64 64 { 65 65 if (is_32bit_task()) 66 66 return (get_random_int() & 0x7ff) << PAGE_SHIFT; ··· 187 187 base &= ~((1UL << 32) - 1); 188 188 189 189 if (current->flags & PF_RANDOMIZE) 190 - base += mmap_rnd(); 190 + base += arch_mmap_rnd(); 191 191 192 192 return base; 193 193 } ··· 203 203 unsigned long random_factor = 0UL; 204 204 205 205 if (current->flags & PF_RANDOMIZE) 206 - random_factor = mmap_rnd(); 206 + random_factor = arch_mmap_rnd(); 207 207 208 208 /* 209 209 * Fall back to the standard layout if the personality ··· 283 283 unsigned long random_factor = 0UL; 284 284 285 285 if (current->flags & PF_RANDOMIZE) 286 - random_factor = mmap_rnd(); 286 + random_factor = arch_mmap_rnd(); 287 287 288 288 /* 289 289 * Fall back to the standard layout if the personality
+1
arch/x86/Kconfig
··· 88 88 select HAVE_ARCH_KASAN if X86_64 && SPARSEMEM_VMEMMAP 89 89 select HAVE_USER_RETURN_NOTIFIER 90 90 select ARCH_BINFMT_ELF_RANDOMIZE_PIE 91 + select ARCH_HAS_ELF_RANDOMIZE 91 92 select HAVE_ARCH_JUMP_LABEL 92 93 select ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE 93 94 select SPARSE_IRQ
+2 -2
arch/x86/mm/mmap.c
··· 65 65 return sysctl_legacy_va_layout; 66 66 } 67 67 68 - static unsigned long mmap_rnd(void) 68 + unsigned long arch_mmap_rnd(void) 69 69 { 70 70 unsigned long rnd; 71 71 ··· 114 114 unsigned long random_factor = 0UL; 115 115 116 116 if (current->flags & PF_RANDOMIZE) 117 - random_factor = mmap_rnd(); 117 + random_factor = arch_mmap_rnd(); 118 118 119 119 mm->mmap_legacy_base = mmap_legacy_base(random_factor); 120 120
+10
include/linux/elf-randomize.h
··· 1 + #ifndef _ELF_RANDOMIZE_H 2 + #define _ELF_RANDOMIZE_H 3 + 4 + #ifndef CONFIG_ARCH_HAS_ELF_RANDOMIZE 5 + static inline unsigned long arch_mmap_rnd(void) { return 0; } 6 + #else 7 + extern unsigned long arch_mmap_rnd(void); 8 + #endif 9 + 10 + #endif