Address Space Layout Randomization (ASLR) is an exploit mitigation technique
implemented in the majority of modern operating systems. It involves randomly
positioning the base address of an executable and the position of libraries,
heap, and stack, in a process's address space. Although over the years
ASLR proved to not guarantee full OS security on its own, this mechanism
should make exploitation more difficult.
Tests on the tier 1 64-bit architectures proved that the ASLR is stable and does
not result in noticeable performance degradation, therefore it should be safe to
enable this mechanism by default. Moreover its effectiveness is increased for
the PIE (Position Independentent Executables) binaries - thanks to the
commit 9a227a2fd642 ("Enable PIE by default on 64-bit architectures"),
it is enough to control usage of ASLR in the OS solely by the sysctls.
This patch toggles the kernel settings to use address map randomization for
PIE & non-PIE 64-bit binaries. It also disables SBRK, in order to allow to utilize
the bss grow region for mappings. The latter is respected only in case the
ASLR is enabled, so do it for all architectures.
As for the drawbacks, a consequence of using the ASLR is more significant
VM fragmentation, hence the issues may be encountered in the systems with
a limited address space in the high memory consumption cases, such as the buildworld.
As a result, although the tests on 32-bit architectures with ASLR enabled were
mostly on par with what was observed on 64-bit ones, the defaults for the
former are not changed. Also, for the sake of safety keep the feature disabled for 32-bit
executables on 64-bit machines, too.
The committed change affects the overall OS operation, so the following should be taken
into consideration:
* Address space fragmentation.
* A changed ABI due to modified layout of address space.
* More complicated debugging due to:
* Non-reproducible address space layout between runs.
* Some debuggers automatically disable ASLR for spawned processes,
making target's environment different between debug and non-debug runs.
In order to confirm/rule-out the dependency of any encountered issue on ASLR
it is strongly advised to re-run the test with the feature disabled - it can be done
by setting the following sysctls in the /etc/sysctl.conf file:
kern.elf64.aslr.enable=0
kern.elf64.aslr.pie_enable=0