Split early startup code out of locore.S into locore0.S. Adjust link
authorderaadt <deraadt@openbsd.org>
Mon, 5 Jun 2017 17:49:05 +0000 (17:49 +0000)
committerderaadt <deraadt@openbsd.org>
Mon, 5 Jun 2017 17:49:05 +0000 (17:49 +0000)
commit599a5352d9cf80c1cd045c515cf0ac6464b69dad
treed5f0a72c27e27de3e401edb34579dbc7ebf52cb4
parentd212e93426015ed7e0ca9a41f5f1f06919907723
Split early startup code out of locore.S into locore0.S.  Adjust link
run so that this locore0.o is always at the start of the executable.
But randomize the link order of all other .o files in the kernel, so
that their exec/rodata/data/bss segments land all over the place.

Late during kernel boot, smash the startup code with traps so that
it does not point to the other randomly placed code.  It has be smashed,
because alpha (insecurely in my view) runs in the KSEG0 space.

As a result, the internal layout of every newly build bsd kernel is
different from past kernels.  Internal relative offsets are not known
to an outside attacker.  The only known offsets are in the startup code,
which is gone.

Ramdisk kernels cannot be compiled like this, because they are gzip'd.
When the internal pointer references change, the compression dictionary
bloats and results in poorer compression.
sys/arch/alpha/alpha/autoconf.c
sys/arch/alpha/alpha/locore.s
sys/arch/alpha/alpha/locore0.S [new file with mode: 0644]
sys/arch/alpha/conf/Makefile.alpha
sys/arch/alpha/conf/files.alpha
sys/arch/alpha/include/param.h