lkml.org 
[lkml]   [2015]   [Jul]   [28]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    From
    Date
    SubjectRe: [PATCH] user_ns: use correct check for single-threadedness
    Kees Cook <keescook@chromium.org> writes:

    > From: Ricky Zhou <rickyz@chromium.org>
    >
    > Checking mm_users > 1 does not mean a process is multithreaded. For
    > example, reading /proc/PID/maps temporarily increments mm_users, allowing
    > other processes to (accidentally) interfere with unshare() calls.
    >
    > This fixes observed failures of unshare(CLONE_NEWUSER) incorrectly
    > returning EINVAL if another processes happened to be simultaneously
    > reading the maps file.
    >
    > Signed-off-by: Ricky Zhou <rickyz@chromium.org>
    > Signed-off-by: Kees Cook <keescook@chromium.org>
    > Cc: stable@vger.kernel.org

    This looks like a good fix. Any chance you can drudge up the commit where
    this hack came in so that Greg & Company know how far to back port this?

    > ---
    > kernel/fork.c | 4 ++--
    > kernel/user_namespace.c | 3 ++-
    > 2 files changed, 4 insertions(+), 3 deletions(-)
    >
    > diff --git a/kernel/fork.c b/kernel/fork.c
    > index dbd9b8d7b7cc..7d138f152dcd 100644
    > --- a/kernel/fork.c
    > +++ b/kernel/fork.c
    > @@ -75,6 +75,7 @@
    > #include <linux/aio.h>
    > #include <linux/compiler.h>
    > #include <linux/sysctl.h>
    > +#include <linux/sched.h>
    >
    > #include <asm/pgtable.h>
    > #include <asm/pgalloc.h>
    > @@ -1876,8 +1877,7 @@ static int check_unshare_flags(unsigned long unshare_flags)
    > * needs to unshare vm.
    > */
    > if (unshare_flags & (CLONE_THREAD | CLONE_SIGHAND | CLONE_VM)) {
    > - /* FIXME: get_task_mm() increments ->mm_users */
    > - if (atomic_read(&current->mm->mm_users) > 1)
    > + if (!current_is_single_threaded())
    > return -EINVAL;
    > }
    >
    > diff --git a/kernel/user_namespace.c b/kernel/user_namespace.c
    > index 4109f8320684..7e0e021e4304 100644
    > --- a/kernel/user_namespace.c
    > +++ b/kernel/user_namespace.c
    > @@ -22,6 +22,7 @@
    > #include <linux/ctype.h>
    > #include <linux/projid.h>
    > #include <linux/fs_struct.h>
    > +#include <linux/sched.h>
    >
    > static struct kmem_cache *user_ns_cachep __read_mostly;
    > static DEFINE_MUTEX(userns_state_mutex);
    > @@ -977,7 +978,7 @@ static int userns_install(struct nsproxy *nsproxy, struct ns_common *ns)
    > return -EINVAL;
    >
    > /* Threaded processes may not enter a different user namespace */
    > - if (atomic_read(&current->mm->mm_users) > 1)
    > + if (!current_is_single_threaded())
    > return -EINVAL;
    >
    > if (current->fs->users != 1)
    > --
    > 1.9.1


    \
     
     \ /
      Last update: 2015-07-28 20:41    [W:4.863 / U:0.228 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site