• Rick Edgecombe's avatar
    proc: refactor pde_get_unmapped_area as prep · 5def1e0f
    Rick Edgecombe authored
    Patch series "Cover a guard gap corner case", v4.
    
    In working on x86’s shadow stack feature, I came across some limitations
    around the kernel’s handling of guard gaps.  AFAICT these limitations
    are not too important for the traditional stack usage of guard gaps, but
    have bigger impact on shadow stack’s usage.  And now in addition to x86,
    we have two other architectures implementing shadow stack like features
    that plan to use guard gaps.  I wanted to see about addressing them, but I
    have not worked on mmap() placement related code before, so would greatly
    appreciate if people could take a look and point me in the right
    direction.
    
    The nature of the limitations of concern is as follows. In order to ensure 
    guard gaps between mappings, mmap() would need to consider two things:
     1. That the new mapping isn’t placed in an any existing mapping’s guard
        gap.
     2. That the new mapping isn’t placed such that any existing mappings are
        not in *its* guard gaps
    Currently mmap never considers (2), and (1) is not considered in some 
    situations.
    
    When not passing an address hint, or passing one without
    MAP_FIXED_NOREPLACE, (1) is enforced.  With MAP_FIXED_NOREPLACE, (1) is
    not enforced.  With MAP_FIXED, (1) is not considered, but this seems to be
    expected since MAP_FIXED can already clobber existing mappings.  For
    MAP_FIXED_NOREPLACE I would have guessed it should respect the guard gaps
    of existing mappings, but it is probably a little ambiguous.
    
    In this series I just tried to add enforcement of (2) for the normal (no
    address hint) case and only for the newer shadow stack memory (not
    stacks).  The reason is that with the no-address-hint situation, landing
    next to a guard gap could come up naturally and so be more influencable by
    attackers such that two shadow stacks could be adjacent without a guard
    gap.  Where as the address-hint scenarios would require more control -
    being able to call mmap() with specific arguments.  As for why not just
    fix the other corner cases anyway, I thought it might have some greater
    possibility of affecting existing apps.
    
    
    This patch (of 14):
    
    Future changes will perform a treewide change to remove the indirect
    branch that is involved in calling mm->get_unmapped_area().  After doing
    this, the function will no longer be able to be handled as a function
    pointer.  To make the treewide change diff cleaner and easier to review,
    refactor pde_get_unmapped_area() such that mm->get_unmapped_area() is
    called without being stored in a local function pointer.  With this in
    refactoring, follow on changes will be able to simply replace the call
    site with a future function that calls it directly.
    
    Link: https://lkml.kernel.org/r/20240326021656.202649-1-rick.p.edgecombe@intel.com
    Link: https://lkml.kernel.org/r/20240326021656.202649-2-rick.p.edgecombe@intel.comSigned-off-by: default avatarRick Edgecombe <rick.p.edgecombe@intel.com>
    Cc: Andy Lutomirski <luto@kernel.org>
    Cc: Borislav Petkov (AMD) <bp@alien8.de>
    Cc: Christophe Leroy <christophe.leroy@csgroup.eu>
    Cc: Dave Hansen <dave.hansen@linux.intel.com>
    Cc: Deepak Gupta <debug@rivosinc.com>
    Cc: H. Peter Anvin (Intel) <hpa@zytor.com>
    Cc: Ingo Molnar <mingo@redhat.com>
    Cc: Kees Cook <keescook@chromium.org>
    Cc: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
    Cc: Liam R. Howlett <Liam.Howlett@oracle.com>
    Cc: Mark Brown <broonie@kernel.org>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: Alexei Starovoitov <ast@kernel.org>
    Cc: Aneesh Kumar K.V <aneesh.kumar@kernel.org>
    Cc: Dan Williams <dan.j.williams@intel.com>
    Cc: Guo Ren <guoren@kernel.org>
    Cc: Helge Deller <deller@gmx.de>
    Cc: "James E.J. Bottomley" <James.Bottomley@HansenPartnership.com>
    Cc: Michael Ellerman <mpe@ellerman.id.au>
    Cc: Naveen N. Rao <naveen.n.rao@linux.ibm.com>
    Cc: Nicholas Piggin <npiggin@gmail.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    5def1e0f
inode.c 17 KB