• E
    unshare: Unsharing a thread does not require unsharing a vm · 12c641ab
    Eric W. Biederman 提交于
    In the logic in the initial commit of unshare made creating a new
    thread group for a process, contingent upon creating a new memory
    address space for that process.  That is wrong.  Two separate
    processes in different thread groups can share a memory address space
    and clone allows creation of such proceses.
    
    This is significant because it was observed that mm_users > 1 does not
    mean that a process is multi-threaded, as reading /proc/PID/maps
    temporarily increments mm_users, which allows other processes to
    (accidentally) interfere with unshare() calls.
    
    Correct the check in check_unshare_flags() to test for
    !thread_group_empty() for CLONE_THREAD, CLONE_SIGHAND, and CLONE_VM.
    For sighand->count > 1 for CLONE_SIGHAND and CLONE_VM.
    For !current_is_single_threaded instead of mm_users > 1 for CLONE_VM.
    
    By using the correct checks in unshare this removes the possibility of
    an accidental denial of service attack.
    
    Additionally using the correct checks in unshare ensures that only an
    explicit unshare(CLONE_VM) can possibly trigger the slow path of
    current_is_single_threaded().  As an explict unshare(CLONE_VM) is
    pointless it is not expected there are many applications that make
    that call.
    
    Cc: stable@vger.kernel.org
    Fixes: b2e0d987 userns: Implement unshare of the user namespace
    Reported-by: NRicky Zhou <rickyz@chromium.org>
    Reported-by: NKees Cook <keescook@chromium.org>
    Reviewed-by: NKees Cook <keescook@chromium.org>
    Signed-off-by: N"Eric W. Biederman" <ebiederm@xmission.com>
    12c641ab
fork.c 50.1 KB