• Axel Rasmussen's avatar
    userfaultfd: add /dev/userfaultfd for fine grained access control · 2d5de004
    Axel Rasmussen authored
    Historically, it has been shown that intercepting kernel faults with
    userfaultfd (thereby forcing the kernel to wait for an arbitrary amount of
    time) can be exploited, or at least can make some kinds of exploits
    easier.  So, in 37cd0575 "userfaultfd: add UFFD_USER_MODE_ONLY" we
    changed things so, in order for kernel faults to be handled by
    userfaultfd, either the process needs CAP_SYS_PTRACE, or this sysctl must
    be configured so that any unprivileged user can do it.
    
    In a typical implementation of a hypervisor with live migration (take
    QEMU/KVM as one such example), we do indeed need to be able to handle
    kernel faults.  But, both options above are less than ideal:
    
    - Toggling the sysctl increases attack surface by allowing any
      unprivileged user to do it.
    
    - Granting the live migration process CAP_SYS_PTRACE gives it this
      ability, but *also* the ability to "observe and control the
      execution of another process [...], and examine and change [its]
      memory and registers" (from ptrace(2)). This isn't something we need
      or want to be able to do, so granting this permission violates the
      "principle of least privilege".
    
    This is all a long winded way to say: we want a more fine-grained way to
    grant access to userfaultfd, without granting other additional permissions
    at the same time.
    
    To achieve this, add a /dev/userfaultfd misc device.  This device provides
    an alternative to the userfaultfd(2) syscall for the creation of new
    userfaultfds.  The idea is, any userfaultfds created this way will be able
    to handle kernel faults, without the caller having any special
    capabilities.  Access to this mechanism is instead restricted using e.g. 
    standard filesystem permissions.
    
    [axelrasmussen@google.com: Handle misc_register() failure properly]
      Link: https://lkml.kernel.org/r/20220819205201.658693-3-axelrasmussen@google.com
    Link: https://lkml.kernel.org/r/20220808175614.3885028-3-axelrasmussen@google.com
    
    Signed-off-by: default avatarAxel Rasmussen <axelrasmussen@google.com>
    Acked-by: default avatarNadav Amit <namit@vmware.com>
    Acked-by: default avatarPeter Xu <peterx@redhat.com>
    Acked-by: default avatarMike Rapoport <rppt@linux.ibm.com>
    Cc: Al Viro <viro@zeniv.linux.org.uk>
    Cc: Dave Hansen <dave.hansen@linux.intel.com>
    Cc: Dmitry V. Levin <ldv@altlinux.org>
    Cc: Gleb Fotengauer-Malinovskiy <glebfm@altlinux.org>
    Cc: Hugh Dickins <hughd@google.com>
    Cc: Jan Kara <jack@suse.cz>
    Cc: Jonathan Corbet <corbet@lwn.net>
    Cc: Mel Gorman <mgorman@techsingularity.net>
    Cc: Mike Kravetz <mike.kravetz@oracle.com>
    Cc: Shuah Khan <shuah@kernel.org>
    Cc: Shuah Khan <skhan@linuxfoundation.org>
    Cc: Suren Baghdasaryan <surenb@google.com>
    Cc: Vlastimil Babka <vbabka@suse.cz>
    Cc: Zhang Yi <yi.zhang@huawei.com>
    Cc: Mike Rapoport <rppt@kernel.org>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    2d5de004
userfaultfd.c 55.3 KB