x86/vdso: Move vDSO to mmap region
authorDaniel Micay <danielmicay@gmail.com>
Sat, 10 Feb 2024 09:18:35 +0000 (01:18 -0800)
committerThomas Gleixner <tglx@linutronix.de>
Mon, 26 Feb 2024 23:23:55 +0000 (00:23 +0100)
commit3c6539b4c177695aaa77893c4ce91d21dea7bb3d
treeae62c37fb38623bf9f5e1932e37bc7b307efb55b
parentb7bcffe752957c6eac7c4cd77dd6f5d943478769
x86/vdso: Move vDSO to mmap region

The vDSO (and its initial randomization) was introduced in commit 2aae950b21e4
("x86_64: Add vDSO for x86-64 with gettimeofday/clock_gettime/getcpu"), but
had very low entropy. The entropy was improved in commit 394f56fe4801
("x86_64, vdso: Fix the vdso address randomization algorithm"), but there
is still improvement to be made.

In principle there should not be executable code at a low entropy offset
from the stack, since the stack and executable code having separate
randomization is part of what makes ASLR stronger.

Remove the only executable code near the stack region and give the vDSO
the same randomized base as other mmap mappings including the linker
and other shared objects. This results in higher entropy being provided
and there's little to no advantage in separating this from the existing
executable code there. This is already how other architectures like
arm64 handle the vDSO.

As an side, while it's sensible for userspace to reserve the initial mmap
base as a region for executable code with a random gap for other mmap
allocations, along with providing randomization within that region, there
isn't much the kernel can do to help due to how dynamic linkers load the
shared objects.

This was extracted from the PaX RANDMMAP feature.

[kees: updated commit log with historical details and other tweaks]

Signed-off-by: Daniel Micay <danielmicay@gmail.com>
Signed-off-by: Kees Cook <keescook@chromium.org>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Closes: https://github.com/KSPP/linux/issues/280
Link: https://lore.kernel.org/r/20240210091827.work.233-kees@kernel.org
arch/x86/entry/vdso/vma.c
arch/x86/include/asm/elf.h
arch/x86/kernel/sys_x86_64.c