All of lore.kernel.org
 help / color / mirror / Atom feed
From: Ian Kent <raven@themaw.net>
To: "Eric W. Biederman" <ebiederm@xmission.com>
Cc: Al Viro <viro@ZenIV.linux.org.uk>,
	Kernel Mailing List <linux-kernel@vger.kernel.org>,
	David Howells <dhowells@redhat.com>,
	Oleg Nesterov <onestero@redhat.com>,
	Trond Myklebust <trond.myklebust@primarydata.com>,
	"J. Bruce Fields" <bfields@fieldses.org>,
	Benjamin Coddington <bcodding@redhat.com>,
	Jeff Layton <jeff.layton@primarydata.com>
Subject: Re: [RFC PATCH v4 03/12] vfs - move mnt_namespace definition to linux/mount.h
Date: Fri, 20 Mar 2015 10:11:45 +0800	[thread overview]
Message-ID: <1426817505.2724.52.camel@pluto.fritz.box> (raw)
In-Reply-To: <87d244fp2a.fsf@x220.int.ebiederm.org>

On Thu, 2015-03-19 at 20:14 -0500, Eric W. Biederman wrote:
> Ian Kent <raven@themaw.net> writes:
> 
> 2> On Thu, 2015-03-19 at 19:47 +0000, Al Viro wrote:
> >> On Tue, Mar 17, 2015 at 10:45:09AM +0800, Ian Kent wrote:
> >> > From: Ian Kent <ikent@redhat.com>
> >> > 
> >> > The mnt_namespace definition will be needed by the usermode helper
> >> > contained execution implementation, move it to include/linux/mount.h.
> >> 
> >> I really don't like that.  AFAICS, the root of the evil is that fscking
> >> nsproxy keeps a pointer to mnt_namespace while all it really needs to
> >> know about is the address of ns_common field embedded into it.  Let's see...
> >
> > Thought that might be the case.
> >
> >> 
> >> fs/namespace.c:697:     struct mnt_namespace *ns = current->nsproxy->mnt_ns;
> >> fs/namespace.c:770:     return mnt->mnt_ns == current->nsproxy->mnt_ns;
> >> fs/namespace.c:1502:    return ns_capable(current->nsproxy->mnt_ns->user_ns, CAP_SYS_ADMIN);
> >> fs/namespace.c:1587:    return current->nsproxy->mnt_ns->seq >= mnt_ns->seq;
> >> fs/namespace.c:2293:    struct user_namespace *user_ns = current->nsproxy->mnt_ns->user_ns;
> >> fs/namespace.c:2961:    touch_mnt_namespace(current->nsproxy->mnt_ns);
> >> fs/namespace.c:3003:    init_task.nsproxy->mnt_ns = ns;
> >> fs/namespace.c:3101:    ns_root.mnt = &current->nsproxy->mnt_ns->root->mnt;
> >> fs/namespace.c:3119:    struct mnt_namespace *ns = current->nsproxy->mnt_ns;
> >> fs/namespace.c:3159:            ns = &nsproxy->mnt_ns->ns;
> >> fs/namespace.c:3187:    put_mnt_ns(nsproxy->mnt_ns);
> >> fs/namespace.c:3188:    nsproxy->mnt_ns = mnt_ns;
> >> fs/pnode.c:282: user_ns = current->nsproxy->mnt_ns->user_ns;
> >> fs/proc_namespace.c:246:        if (!nsp || !nsp->mnt_ns) {
> >> fs/proc_namespace.c:251:        ns = nsp->mnt_ns;
> >> include/linux/nsproxy.h:33:     struct mnt_namespace *mnt_ns;
> >> kernel/nsproxy.c:37:    .mnt_ns                 = NULL,
> >> kernel/nsproxy.c:70:    new_nsp->mnt_ns = copy_mnt_ns(flags, tsk->nsproxy->mnt_ns, user_ns, new_fs);
> >> kernel/nsproxy.c:71:    if (IS_ERR(new_nsp->mnt_ns)) {
> >> kernel/nsproxy.c:72:            err = PTR_ERR(new_nsp->mnt_ns);
> >> kernel/nsproxy.c:113:   if (new_nsp->mnt_ns)
> >> kernel/nsproxy.c:114:           put_mnt_ns(new_nsp->mnt_ns);
> >> kernel/nsproxy.c:160:   if (ns->mnt_ns)
> >> kernel/nsproxy.c:161:           put_mnt_ns(ns->mnt_ns);
> >> 
> >> OK, so we need
> >> 
> >> a) add in fs/mount.h
> >> static inline struct mnt_namespace *current_mnt_ns(void)
> >> {
> >> 	return current->nsproxy->mnt_ns;
> >> }
> >> 
> >> and replace a lot of open-coded instances.
> >> 
> >> b) lift to_mnt_ns() into fs/mount.h (as static inline)
> >> 
> >> c) switch put_mnt_ns() to struct ns_common *, replacing put_mnt_ns(ns)
> >> with put_mnt_ns(&ns->ns) and using to_mnt_ns() in the body to recover
> >> the original.
> >> 
> >> d) make copy_mnt_ns() take and return struct ns_common * (same treatment as for
> >> put_mnt_ns() in (c); replace
> >>         new_nsp->mnt_ns = copy_mnt_ns(flags, tsk->nsproxy->mnt_ns, user_ns, new_fs);
> >>         if (IS_ERR(new_nsp->mnt_ns)) {
> >>                 err = PTR_ERR(new_nsp->mnt_ns);
> >>                 goto out_ns;
> >>         }
> >> with
> >> 	ns = copy_mnt_ns(flags, &tsk->nsproxy->mnt_ns->ns, user_ns, new_fs);
> >> 	if (IS_ERR(ns)) {
> >> 		err = PTR_ERR(ns);
> >> 		goto out_ns;
> >> 	}
> >> 	new_nsp->mnt_ns = to_mnt_ns(ns);
> >> 
> >> e) replace struct mnt_namespace *mnt_ns with struct ns_common *__mnt_ns in
> >> nsproxy.h, deal with users of mnt_ns by
> >> * everywhere in the tree replace put_mnt_ns(&...->mnt_ns->ns) with
> >> put_mnt_ns(...->__mnt_ns) (i.e. modify the lines modified by (c) again).
> >> * in fs/namespace.c replace
> >> 	init_task.nsproxy->mnt_ns = ns;
> >> with
> >> 	init_task.nsproxy->__mnt_ns = &ns->ns;
> >> replace
> >> 	ns = &nsproxy->mnt_ns->ns;
> >> with
> >> 	ns = nsproxy->__mnt_ns;
> >> replace
> >> 	nsproxy->mnt_ns = mnt_ns;
> >> with
> >> 	nsproxy>__mnt_ns = &mnt_ns->ns;
> >> * in fs/proc_namespace.c replace
> >> 	ns = nsp->mnt_ns;
> >> with
> >> 	ns = to_mnt_ns(nsp->__mnt_ns);
> >> and
> >> 	if (!nsp || !nsp->mnt_ns) {
> >> with
> >> 	if (!nsp || !nsp->__mnt_ns) {
> >> * in kernel/nsproxy.c: replace
> >> 	ns = copy_mnt_ns(flags, &tsk->nsproxy->mnt_ns->ns, user_ns, new_fs);
> >> added in (d) with
> >> 	ns = copy_mnt_ns(flags, tsk->nsproxy->__mnt_ns, user_ns, new_fs);
> >> and
> >> 	new_nsp->mnt_ns = to_mnt_ns(ns);
> >> with
> >> 	new_nsp->__mnt_ns = ns;
> >> The rest of mnt_ns in that file get replaced by __mnt_ns.
> >> * in current_mnt_ns() replace ...->mnt_ns with to_mnt_ns(...->__mnt_ns)
> >> 
> >> Do you want me to push such a series in vfs.git?  After such 5 commits we have
> >> no pointers to struct mnt_namespace in nsproxy.h *and* no need for your patches
> >> to dig into ->mnt_ns->ns - we already have that as ->__mnt_ns.
> >
> > Yes please, I'd be more confident if you did this than me, there's
> > already enough to worry about with the series.
> 
> Given that this patchset is a security hole waiting to happen I don't
> see why Al should bother unless there are good reasons to do this
> otherwise.

Having now got to your mail now, I agree.

> 
> Eric



  reply	other threads:[~2015-03-20  2:12 UTC|newest]

Thread overview: 21+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-03-17  2:44 [RFC PATCH v4 00/12] Second attempt at contained helper execution Ian Kent
2015-03-17  2:44 ` [RFC PATCH v4 01/12] nsproxy - make create_new_namespaces() non-static Ian Kent
2015-03-17  2:45 ` [RFC PATCH v4 02/12] kmod - rename call_usermodehelper() flags parameter Ian Kent
2015-03-17  2:45 ` [RFC PATCH v4 03/12] vfs - move mnt_namespace definition to linux/mount.h Ian Kent
2015-03-19 19:47   ` Al Viro
2015-03-20  0:57     ` Ian Kent
2015-03-20  1:14       ` Eric W. Biederman
2015-03-20  2:11         ` Ian Kent [this message]
2015-03-20  2:47         ` Al Viro
2015-03-17  2:45 ` [RFC PATCH v4 04/12] kmod - add namespace aware thread runner Ian Kent
2015-03-17  2:45 ` [RFC PATCH v4 05/12] kmod - teach call_usermodehelper() to use a namespace Ian Kent
2015-03-17  2:45 ` [RFC PATCH v4 06/12] kmod - add namespace info store Ian Kent
2015-03-17  2:45 ` [RFC PATCH v4 07/12] kmod - add call_usermodehelper_ns() Ian Kent
2015-03-17  2:45 ` [RFC PATCH v4 08/12] nfsd - use namespace if not executing in init namespace Ian Kent
2015-03-17  2:45 ` [RFC PATCH v4 09/12] nfs - cache_lib " Ian Kent
2015-03-17  2:45 ` [RFC PATCH v4 10/12] nfs - objlayout " Ian Kent
2015-03-17  2:46 ` [RFC PATCH v4 11/12] KEYS - use correct memory allocation flag in call_usermodehelper_keys() Ian Kent
2015-03-17  2:46 ` [RFC PATCH v4 12/12] KEYS: exec request-key within the requesting task's init namespace Ian Kent
2015-03-18 17:41 ` [RFC PATCH v4 00/12] Second attempt at contained helper execution J. Bruce Fields
2015-03-19 21:38 ` Eric W. Biederman
2015-03-20  2:10   ` Ian Kent

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1426817505.2724.52.camel@pluto.fritz.box \
    --to=raven@themaw.net \
    --cc=bcodding@redhat.com \
    --cc=bfields@fieldses.org \
    --cc=dhowells@redhat.com \
    --cc=ebiederm@xmission.com \
    --cc=jeff.layton@primarydata.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=onestero@redhat.com \
    --cc=trond.myklebust@primarydata.com \
    --cc=viro@ZenIV.linux.org.uk \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.