• Mathias Krause's avatar
    nitro_enclaves: Fix stale file descriptors on failed usercopy · f1ce3986
    Mathias Krause authored
    A failing usercopy of the slot uid will lead to a stale entry in the
    file descriptor table as put_unused_fd() won't release it. This enables
    userland to refer to a dangling 'file' object through that still valid
    file descriptor, leading to all kinds of use-after-free exploitation
    scenarios.
    
    Exchanging put_unused_fd() for close_fd(), ksys_close() or alike won't
    solve the underlying issue, as the file descriptor might have been
    replaced in the meantime, e.g. via userland calling close() on it
    (leading to a NULL pointer dereference in the error handling code as
    'fget(enclave_fd)' will return a NULL pointer) or by dup2()'ing a
    completely different file object to that very file descriptor, leading
    to the same situation: a dangling file descriptor pointing to a freed
    object -- just in this case to a file object of user's choosing.
    
    Generally speaking, after the call to fd_install() the file descriptor
    is live and userland is free to do whatever with it. We cannot rely on
    it to still refer to our enclave object afterwards. In fact, by abusing
    userfaultfd() userland can hit the condition without any racing and
    abuse the error handling in the nitro code as it pleases.
    
    To fix the above issues, defer the call to fd_install() until all
    possible errors are handled. In this case it's just the usercopy, so do
    it directly in ne_create_vm_ioctl() itself.
    Signed-off-by: default avatarMathias Krause <minipli@grsecurity.net>
    Signed-off-by: default avatarAndra Paraschiv <andraprs@amazon.com>
    Cc: stable <stable@vger.kernel.org>
    Link: https://lore.kernel.org/r/20210429165941.27020-2-andraprs@amazon.comSigned-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    f1ce3986
ne_misc_dev.c 45.3 KB