[PATCH 0/3] arm64: more granular KASLR

Ard Biesheuvel ard.biesheuvel at linaro.org
Wed Mar 2 09:11:49 PST 2016


It turns out we can squeeze out 5 to 7 bits of additional KASLR entropy in
the new arm64 implementation. This is based on the observation that the
minimal 2 MB alignment of the kernel image is only required for kernels
that are non-relocatable, and since KASLR already implies a relocatable
kernel anyway, we get this additional wiggle room almost [1] for free.

The idea is that, since we need to fix up all absolute symbol references
anyway, the hardcoded virtual start address of the kernel does not need to
be 2 MB aligned (+ TEXT_OFFSET), and the only thing we need to ensure is
that the physical misalignment and the virtual misalignment are equal modulo
the swapper block size.

Patch #1 removes the explicit mapping of the TEXT_OFFSET region below the
kernel, and only maps it if the rounding to swapper block size of the kernel
start address ends up covering it.

Patch #2 updates the early boot code to treat the physical misalignment as
the initial KASLR displacement. Note that this only affects code that is
compiled conditionally if CONFIG_RANDOMIZE_BASE=y

Patch #3 updates the stub allocation strategy to allow a more granular mapping.
Note that the allocation itself is still rounded to 2 MB as before, to prevent
the early mapping to cover adjacent regions inadvertently. As is the case for
patch #2, this only affects the new code under CONFIG_RANDOMIZE_BASE=y

Sample output from a 4k/4 levels kernel, where we have 33 bits of entropy
in the kernel addresses:

Virtual kernel memory layout:
    modules : 0xffff000000000000 - 0xffff000008000000   (   128 MB)
    vmalloc : 0xffff000008000000 - 0xffff7dffbfff0000   (129022 GB)
      .init : 0xffff0bbbe14a6000 - 0xffff0bbbe17d5000   (  3260 KB)
      .text : 0xffff0bbbe0c24000 - 0xffff0bbbe120a000   (  6040 KB)
    .rodata : 0xffff0bbbe120a000 - 0xffff0bbbe14a6000   (  2672 KB)
      .data : 0xffff0bbbe17d5000 - 0xffff0bbbe1866e00   (   584 KB)
      fixed : 0xffff7dfffe7fd000 - 0xffff7dfffec00000   (  4108 KB)
    PCI I/O : 0xffff7dfffee00000 - 0xffff7dffffe00000   (    16 MB)
    vmemmap : 0xffff7e0000000000 - 0xffff800000000000   (  2048 GB maximum)
              0xffff7e1333000000 - 0xffff7e1337000000   (    64 MB actual)
     memory : 0xffff84ccc0000000 - 0xffff84cdc0000000   (  4096 MB)

Ard Biesheuvel (3):
  arm64: don't map TEXT_OFFSET bytes below the kernel if we can avoid it
  arm64: kaslr: deal with physically misaligned kernel images
  arm64: kaslr: increase randomization granularity

 arch/arm64/kernel/head.S                  | 22 +++++++++++++-------
 arch/arm64/kernel/kaslr.c                 |  6 +++---
 drivers/firmware/efi/libstub/arm64-stub.c | 14 ++++++++++---
 3 files changed, 29 insertions(+), 13 deletions(-)

-- 
2.5.0




More information about the linux-arm-kernel mailing list