• Kees Cook's avatar
    binfmt_elf: Honor PT_LOAD alignment for static PIE · 3545deff
    Kees Cook authored
    The p_align values in PT_LOAD were ignored for static PIE executables
    (i.e. ET_DYN without PT_INTERP). This is because there is no way to
    request a non-fixed mmap region with a specific alignment. ET_DYN with
    PT_INTERP uses a separate base address (ELF_ET_DYN_BASE) and binfmt_elf
    performs the ASLR itself, which means it can also apply alignment. For
    the mmap region, the address selection happens deep within the vm_mmap()
    implementation (when the requested address is 0).
    
    The earlier attempt to implement this:
    
      commit 9630f0d6 ("fs/binfmt_elf: use PT_LOAD p_align values for static PIE")
      commit 925346c1 ("fs/binfmt_elf: fix PT_LOAD p_align values for loaders")
    
    did not take into account the different base address origins, and were
    eventually reverted:
    
      aeb79237 ("revert "fs/binfmt_elf: use PT_LOAD p_align values for static PIE"")
    
    In order to get the correct alignment from an mmap base, binfmt_elf must
    perform a 0-address load first, then tear down the mapping and perform
    alignment on the resulting address. Since this is slightly more overhead,
    only do this when it is needed (i.e. the alignment is not the default
    ELF alignment). This does, however, have the benefit of being able to
    use MAP_FIXED_NOREPLACE, to avoid potential collisions.
    
    With this fixed, enable the static PIE self tests again.
    Reported-by: default avatarH.J. Lu <hjl.tools@gmail.com>
    Closes: https://bugzilla.kernel.org/show_bug.cgi?id=215275
    Link: https://lore.kernel.org/r/20240508173149.677910-3-keescook@chromium.orgSigned-off-by: default avatarKees Cook <kees@kernel.org>
    3545deff
binfmt_elf.c 57.2 KB