freebsd-nq/sys/arm
Konstantin Belousov fa50a3552d Implement Address Space Layout Randomization (ASLR)
With this change, randomization can be enabled for all non-fixed
mappings.  It means that the base address for the mapping is selected
with a guaranteed amount of entropy (bits). If the mapping was
requested to be superpage aligned, the randomization honours the
superpage attributes.

Although the value of ASLR is diminshing over time as exploit authors
work out simple ASLR bypass techniques, it elimintates the trivial
exploitation of certain vulnerabilities, at least in theory.  This
implementation is relatively small and happens at the correct
architectural level.  Also, it is not expected to introduce
regressions in existing cases when turned off (default for now), or
cause any significant maintaince burden.

The randomization is done on a best-effort basis - that is, the
allocator falls back to a first fit strategy if fragmentation prevents
entropy injection.  It is trivial to implement a strong mode where
failure to guarantee the requested amount of entropy results in
mapping request failure, but I do not consider that to be usable.

I have not fine-tuned the amount of entropy injected right now. It is
only a quantitive change that will not change the implementation.  The
current amount is controlled by aslr_pages_rnd.

To not spoil coalescing optimizations, to reduce the page table
fragmentation inherent to ASLR, and to keep the transient superpage
promotion for the malloced memory, locality clustering is implemented
for anonymous private mappings, which are automatically grouped until
fragmentation kicks in.  The initial location for the anon group range
is, of course, randomized.  This is controlled by vm.cluster_anon,
enabled by default.

The default mode keeps the sbrk area unpopulated by other mappings,
but this can be turned off, which gives much more breathing bits on
architectures with small address space, such as i386.  This is tied
with the question of following an application's hint about the mmap(2)
base address. Testing shows that ignoring the hint does not affect the
function of common applications, but I would expect more demanding
code could break. By default sbrk is preserved and mmap hints are
satisfied, which can be changed by using the
kern.elf{32,64}.aslr.honor_sbrk sysctl.

ASLR is enabled on per-ABI basis, and currently it is only allowed on
FreeBSD native i386 and amd64 (including compat 32bit) ABIs.  Support
for additional architectures will be added after further testing.

Both per-process and per-image controls are implemented:
- procctl(2) adds PROC_ASLR_CTL/PROC_ASLR_STATUS;
- NT_FREEBSD_FCTL_ASLR_DISABLE feature control note bit makes it possible
  to force ASLR off for the given binary.  (A tool to edit the feature
  control note is in development.)
Global controls are:
- kern.elf{32,64}.aslr.enable - for non-fixed mappings done by mmap(2);
- kern.elf{32,64}.aslr.pie_enable - for PIE image activation mappings;
- kern.elf{32,64}.aslr.honor_sbrk - allow to use sbrk area for mmap(2);
- vm.cluster_anon - enables anon mapping clustering.

PR:	208580 (exp runs)
Exp-runs done by:	antoine
Reviewed by:	markj (previous version)
Discussed with:	emaste
Tested by:	pho
MFC after:	1 month
Sponsored by:	The FreeBSD Foundation
Differential revision:	https://reviews.freebsd.org/D5603
2019-02-10 17:19:45 +00:00
..
allwinner Enable necessary bits when activating interrupts. This allows 2019-02-10 08:41:52 +00:00
altera/socfpga Remove IPI_IRQ_START and IPI_IRQ_END from the arm kernel config files. 2018-07-28 06:46:10 +00:00
amlogic/aml8726 Remove the Yarrow PRNG algorithm option in accordance with due notice 2018-08-26 12:51:46 +00:00
annapurna/alpine Remove IPI_IRQ_START and IPI_IRQ_END from the arm kernel config files. 2018-07-28 06:46:10 +00:00
arm Implement Address Space Layout Randomization (ASLR) 2019-02-10 17:19:45 +00:00
broadcom/bcm2835 o Don't allocate resources for SDMA in sdhci(4) if the controller or the 2018-12-30 23:08:06 +00:00
cloudabi32 Correct some more places where TO_PTR() should be used. 2017-11-26 14:53:56 +00:00
conf Remove IEEE80211_AMPDU_AGE config option. 2019-01-20 15:17:56 +00:00
freescale use -m ${LD_EMULATION} for binary->elf link invocation 2018-11-09 19:16:01 +00:00
include Implement atomic_swap_xxx() for all platforms. 2018-12-10 13:38:13 +00:00
mv [mv] Fix invalid condition in fdt_fixup_ranges 2019-01-16 21:13:50 +00:00
nvidia Don't allocate same clock twice.. 2019-02-10 14:30:15 +00:00
qemu Remove IPI_IRQ_START and IPI_IRQ_END from the arm kernel config files. 2018-07-28 06:46:10 +00:00
ralink Remove PHYSADDR from kernel configurations that don't need it. The only 2018-08-15 13:13:19 +00:00
rockchip Remove IPI_IRQ_START and IPI_IRQ_END from the arm kernel config files. 2018-07-28 06:46:10 +00:00
samsung/exynos Eliminate kmem_alloc_contig()'s unused arena parameter. 2018-08-20 15:57:27 +00:00
ti Support the SPI mode and bus clock frequency parameters set by the devices 2018-12-31 16:01:22 +00:00
versatile Revert r327250 as it broke the build for some armv6 kernel and all armv4/5 2017-12-28 07:31:14 +00:00
xilinx Remove IPI_IRQ_START and IPI_IRQ_END from the arm kernel config files. 2018-07-28 06:46:10 +00:00