• Ard Biesheuvel's avatar
    arm64/kernel: kaslr: reduce module randomization range to 2 GB · b2eed9b5
    Ard Biesheuvel authored
    The following commit
    
      7290d580 ("module: use relative references for __ksymtab entries")
    
    updated the ksymtab handling of some KASLR capable architectures
    so that ksymtab entries are emitted as pairs of 32-bit relative
    references. This reduces the size of the entries, but more
    importantly, it gets rid of statically assigned absolute
    addresses, which require fixing up at boot time if the kernel
    is self relocating (which takes a 24 byte RELA entry for each
    member of the ksymtab struct).
    
    Since ksymtab entries are always part of the same module as the
    symbol they export, it was assumed at the time that a 32-bit
    relative reference is always sufficient to capture the offset
    between a ksymtab entry and its target symbol.
    
    Unfortunately, this is not always true: in the case of per-CPU
    variables, a per-CPU variable's base address (which usually differs
    from the actual address of any of its per-CPU copies) is allocated
    in the vicinity of the ..data.percpu section in the core kernel
    (i.e., in the per-CPU reserved region which follows the section
    containing the core kernel's statically allocated per-CPU variables).
    
    Since we randomize the module space over a 4 GB window covering
    the core kernel (based on the -/+ 4 GB range of an ADRP/ADD pair),
    we may end up putting the core kernel out of the -/+ 2 GB range of
    32-bit relative references of module ksymtab entries that refer to
    per-CPU variables.
    
    So reduce the module randomization range a bit further. We lose
    1 bit of randomization this way, but this is something we can
    tolerate.
    
    Cc: <stable@vger.kernel.org> # v4.19+
    Signed-off-by: default avatarArd Biesheuvel <ard.biesheuvel@arm.com>
    Signed-off-by: default avatarWill Deacon <will.deacon@arm.com>
    b2eed9b5
kaslr.c 5.2 KB