• Andrii Nakryiko's avatar
    fs/procfs: add build ID fetching to PROCMAP_QUERY API · bfc69fd0
    Andrii Nakryiko authored
    The need to get ELF build ID reliably is an important aspect when dealing
    with profiling and stack trace symbolization, and /proc/<pid>/maps textual
    representation doesn't help with this.
    
    To get backing file's ELF build ID, application has to first resolve VMA,
    then use it's start/end address range to follow a special
    /proc/<pid>/map_files/<start>-<end> symlink to open the ELF file (this is
    necessary because backing file might have been removed from the disk or
    was already replaced with another binary in the same file path.
    
    Such approach, beyond just adding complexity of having to do a bunch of
    extra work, has extra security implications.  Because application opens
    underlying ELF file and needs read access to its entire contents (as far
    as kernel is concerned), kernel puts additional capable() checks on
    following /proc/<pid>/map_files/<start>-<end> symlink.  And that makes
    sense in general.
    
    But in the case of build ID, profiler/symbolizer doesn't need the contents
    of ELF file, per se.  It's only build ID that is of interest, and ELF
    build ID itself doesn't provide any sensitive information.
    
    So this patch adds a way to request backing file's ELF build ID along the
    rest of VMA information in the same API.  User has control over whether
    this piece of information is requested or not by either setting
    build_id_size field to zero or non-zero maximum buffer size they provided
    through build_id_addr field (which encodes user pointer as __u64 field). 
    This is a completely optional piece of information, and so has no
    performance implications for user cases that don't care about build ID,
    while improving performance and simplifying the setup for those
    application that do need it.
    
    Kernel already implements build ID fetching, which is used from BPF
    subsystem.  We are reusing this code here, but plan a follow up changes to
    make it work better under more relaxed assumption (compared to what
    existing code assumes) of being called from user process context, in which
    page faults are allowed.  BPF-specific implementation currently bails out
    if necessary part of ELF file is not paged in, all due to extra
    BPF-specific restrictions (like the need to fetch build ID in restrictive
    contexts such as NMI handler).
    
    [andrii@kernel.org: fix integer to pointer cast warning in do_procmap_query()]
      Link: https://lkml.kernel.org/r/20240701174805.1897344-1-andrii@kernel.org
    Link: https://lkml.kernel.org/r/20240627170900.1672542-4-andrii@kernel.orgSigned-off-by: default avatarAndrii Nakryiko <andrii@kernel.org>
    Acked-by: default avatarLiam R. Howlett <Liam.Howlett@Oracle.com>
    Cc: Alexey Dobriyan <adobriyan@gmail.com>
    Cc: Al Viro <viro@zeniv.linux.org.uk>
    Cc: Christian Brauner <brauner@kernel.org>
    Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Cc: Mike Rapoport (IBM) <rppt@kernel.org>
    Cc: Suren Baghdasaryan <surenb@google.com>
    Cc: Andi Kleen <ak@linux.intel.com>
    Cc: Arnd Bergmann <arnd@arndb.de>
    Cc: Stephen Rothwell <sfr@canb.auug.org.au>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    bfc69fd0
task_mmu.c 75.1 KB