From: James Hogan <james.hogan-1AXoQHu6uovQT0dZR+AlfA@public.gmane.org>
To: "Eric W. Biederman" <ebiederm-aS9lmoZGLiVWk0Htik3J/w@public.gmane.org>
Cc: Greg Kroah-Hartman
<gregkh-hQyY1W1yCW8ekmWlsbkhG0B+6BGkLq7r@public.gmane.org>,
Linux Containers
<containers-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org>,
linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
Andy Lutomirski <luto-kltTT9wpgjJwATOyAt5JVQ@public.gmane.org>,
linux-fsdevel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
Subject: Re: [REVIEW][PATCH 2/2] sysfs: Restrict mounting sysfs
Date: Mon, 23 Sep 2013 11:33:14 +0100 [thread overview]
Message-ID: <524018EA.9070202@imgtec.com> (raw)
In-Reply-To: <874naahkng.fsf-aS9lmoZGLiVWk0Htik3J/w@public.gmane.org>
[-- Attachment #1.1: Type: text/plain, Size: 4416 bytes --]
On 27/08/13 22:46, Eric W. Biederman wrote:
>
> Don't allow mounting sysfs unless the caller has CAP_SYS_ADMIN rights
> over the net namespace. The principle here is if you create or have
> capabilities over it you can mount it, otherwise you get to live with
> what other people have mounted.
>
> Instead of testing this with a straight forward ns_capable call,
> perform this check the long and torturous way with kobject helpers,
> this keeps direct knowledge of namespaces out of sysfs, and preserves
> the existing sysfs abstractions.
>
> Signed-off-by: "Eric W. Biederman" <ebiederm-aS9lmoZGLiVWk0Htik3J/w@public.gmane.org>
Hi,
Unfortunately this patch causes problems for me in v3.12-rc1 if
CONFIG_NET=n. Sysfs fails to mount with EPERM. Having networking enabled
seems an odd prerequisite for mounting sysfs :-P.
Cheers
James
> ---
> fs/sysfs/mount.c | 12 +++++++++---
> include/linux/kobject_ns.h | 2 ++
> lib/kobject.c | 12 ++++++++++++
> net/core/net-sysfs.c | 8 ++++++++
> 4 files changed, 31 insertions(+), 3 deletions(-)
>
> diff --git a/fs/sysfs/mount.c b/fs/sysfs/mount.c
> index 4a2da3a..8c69ef4 100644
> --- a/fs/sysfs/mount.c
> +++ b/fs/sysfs/mount.c
> @@ -112,9 +112,15 @@ static struct dentry *sysfs_mount(struct file_system_type *fs_type,
> struct super_block *sb;
> int error;
>
> - if (!(flags & MS_KERNMOUNT) && !capable(CAP_SYS_ADMIN) &&
> - !fs_fully_visible(fs_type))
> - return ERR_PTR(-EPERM);
> + if (!(flags & MS_KERNMOUNT)) {
> + if (!capable(CAP_SYS_ADMIN) && !fs_fully_visible(fs_type))
> + return ERR_PTR(-EPERM);
> +
> + for (type = KOBJ_NS_TYPE_NONE; type < KOBJ_NS_TYPES; type++) {
> + if (!kobj_ns_current_may_mount(type))
> + return ERR_PTR(-EPERM);
> + }
> + }
>
> info = kzalloc(sizeof(*info), GFP_KERNEL);
> if (!info)
> diff --git a/include/linux/kobject_ns.h b/include/linux/kobject_ns.h
> index f66b065..df32d25 100644
> --- a/include/linux/kobject_ns.h
> +++ b/include/linux/kobject_ns.h
> @@ -39,6 +39,7 @@ enum kobj_ns_type {
> */
> struct kobj_ns_type_operations {
> enum kobj_ns_type type;
> + bool (*current_may_mount)(void);
> void *(*grab_current_ns)(void);
> const void *(*netlink_ns)(struct sock *sk);
> const void *(*initial_ns)(void);
> @@ -50,6 +51,7 @@ int kobj_ns_type_registered(enum kobj_ns_type type);
> const struct kobj_ns_type_operations *kobj_child_ns_ops(struct kobject *parent);
> const struct kobj_ns_type_operations *kobj_ns_ops(struct kobject *kobj);
>
> +bool kobj_ns_current_may_mount(enum kobj_ns_type type);
> void *kobj_ns_grab_current(enum kobj_ns_type type);
> const void *kobj_ns_netlink(enum kobj_ns_type type, struct sock *sk);
> const void *kobj_ns_initial(enum kobj_ns_type type);
> diff --git a/lib/kobject.c b/lib/kobject.c
> index 4a1f33d..1853bd9 100644
> --- a/lib/kobject.c
> +++ b/lib/kobject.c
> @@ -915,6 +915,18 @@ const struct kobj_ns_type_operations *kobj_ns_ops(struct kobject *kobj)
> return kobj_child_ns_ops(kobj->parent);
> }
>
> +bool kobj_ns_current_may_mount(enum kobj_ns_type type)
> +{
> + bool may_mount = false;
> +
> + spin_lock(&kobj_ns_type_lock);
> + if ((type > KOBJ_NS_TYPE_NONE) && (type < KOBJ_NS_TYPES) &&
> + kobj_ns_ops_tbl[type])
> + may_mount = kobj_ns_ops_tbl[type]->current_may_mount();
> + spin_unlock(&kobj_ns_type_lock);
> +
> + return may_mount;
> +}
>
> void *kobj_ns_grab_current(enum kobj_ns_type type)
> {
> diff --git a/net/core/net-sysfs.c b/net/core/net-sysfs.c
> index 981fed3..0b0ff95 100644
> --- a/net/core/net-sysfs.c
> +++ b/net/core/net-sysfs.c
> @@ -1157,6 +1157,13 @@ static void remove_queue_kobjects(struct net_device *net)
> #endif
> }
>
> +static bool net_current_may_mount(void)
> +{
> + struct net *net = current->nsproxy->net_ns;
> +
> + return !ns_capable(net->user_ns, CAP_SYS_ADMIN);
> +}
> +
> static void *net_grab_current_ns(void)
> {
> struct net *ns = current->nsproxy->net_ns;
> @@ -1179,6 +1186,7 @@ static const void *net_netlink_ns(struct sock *sk)
>
> struct kobj_ns_type_operations net_ns_type_operations = {
> .type = KOBJ_NS_TYPE_NET,
> + .current_may_mount = net_current_may_mount,
> .grab_current_ns = net_grab_current_ns,
> .netlink_ns = net_netlink_ns,
> .initial_ns = net_initial_ns,
>
[-- Attachment #1.2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 836 bytes --]
[-- Attachment #2: Type: text/plain, Size: 205 bytes --]
_______________________________________________
Containers mailing list
Containers-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org
https://lists.linuxfoundation.org/mailman/listinfo/containers
WARNING: multiple messages have this Message-ID (diff)
From: James Hogan <james.hogan@imgtec.com>
To: "Eric W. Biederman" <ebiederm@xmission.com>
Cc: Linux Containers <containers@lists.linux-foundation.org>,
"Serge E. Hallyn" <serge@hallyn.com>,
<linux-fsdevel@vger.kernel.org>, <linux-kernel@vger.kernel.org>,
Andy Lutomirski <luto@amacapital.net>,
"Greg Kroah-Hartman" <gregkh@linuxfoundation.org>
Subject: Re: [REVIEW][PATCH 2/2] sysfs: Restrict mounting sysfs
Date: Mon, 23 Sep 2013 11:33:14 +0100 [thread overview]
Message-ID: <524018EA.9070202@imgtec.com> (raw)
In-Reply-To: <874naahkng.fsf@xmission.com>
[-- Attachment #1: Type: text/plain, Size: 4389 bytes --]
On 27/08/13 22:46, Eric W. Biederman wrote:
>
> Don't allow mounting sysfs unless the caller has CAP_SYS_ADMIN rights
> over the net namespace. The principle here is if you create or have
> capabilities over it you can mount it, otherwise you get to live with
> what other people have mounted.
>
> Instead of testing this with a straight forward ns_capable call,
> perform this check the long and torturous way with kobject helpers,
> this keeps direct knowledge of namespaces out of sysfs, and preserves
> the existing sysfs abstractions.
>
> Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
Hi,
Unfortunately this patch causes problems for me in v3.12-rc1 if
CONFIG_NET=n. Sysfs fails to mount with EPERM. Having networking enabled
seems an odd prerequisite for mounting sysfs :-P.
Cheers
James
> ---
> fs/sysfs/mount.c | 12 +++++++++---
> include/linux/kobject_ns.h | 2 ++
> lib/kobject.c | 12 ++++++++++++
> net/core/net-sysfs.c | 8 ++++++++
> 4 files changed, 31 insertions(+), 3 deletions(-)
>
> diff --git a/fs/sysfs/mount.c b/fs/sysfs/mount.c
> index 4a2da3a..8c69ef4 100644
> --- a/fs/sysfs/mount.c
> +++ b/fs/sysfs/mount.c
> @@ -112,9 +112,15 @@ static struct dentry *sysfs_mount(struct file_system_type *fs_type,
> struct super_block *sb;
> int error;
>
> - if (!(flags & MS_KERNMOUNT) && !capable(CAP_SYS_ADMIN) &&
> - !fs_fully_visible(fs_type))
> - return ERR_PTR(-EPERM);
> + if (!(flags & MS_KERNMOUNT)) {
> + if (!capable(CAP_SYS_ADMIN) && !fs_fully_visible(fs_type))
> + return ERR_PTR(-EPERM);
> +
> + for (type = KOBJ_NS_TYPE_NONE; type < KOBJ_NS_TYPES; type++) {
> + if (!kobj_ns_current_may_mount(type))
> + return ERR_PTR(-EPERM);
> + }
> + }
>
> info = kzalloc(sizeof(*info), GFP_KERNEL);
> if (!info)
> diff --git a/include/linux/kobject_ns.h b/include/linux/kobject_ns.h
> index f66b065..df32d25 100644
> --- a/include/linux/kobject_ns.h
> +++ b/include/linux/kobject_ns.h
> @@ -39,6 +39,7 @@ enum kobj_ns_type {
> */
> struct kobj_ns_type_operations {
> enum kobj_ns_type type;
> + bool (*current_may_mount)(void);
> void *(*grab_current_ns)(void);
> const void *(*netlink_ns)(struct sock *sk);
> const void *(*initial_ns)(void);
> @@ -50,6 +51,7 @@ int kobj_ns_type_registered(enum kobj_ns_type type);
> const struct kobj_ns_type_operations *kobj_child_ns_ops(struct kobject *parent);
> const struct kobj_ns_type_operations *kobj_ns_ops(struct kobject *kobj);
>
> +bool kobj_ns_current_may_mount(enum kobj_ns_type type);
> void *kobj_ns_grab_current(enum kobj_ns_type type);
> const void *kobj_ns_netlink(enum kobj_ns_type type, struct sock *sk);
> const void *kobj_ns_initial(enum kobj_ns_type type);
> diff --git a/lib/kobject.c b/lib/kobject.c
> index 4a1f33d..1853bd9 100644
> --- a/lib/kobject.c
> +++ b/lib/kobject.c
> @@ -915,6 +915,18 @@ const struct kobj_ns_type_operations *kobj_ns_ops(struct kobject *kobj)
> return kobj_child_ns_ops(kobj->parent);
> }
>
> +bool kobj_ns_current_may_mount(enum kobj_ns_type type)
> +{
> + bool may_mount = false;
> +
> + spin_lock(&kobj_ns_type_lock);
> + if ((type > KOBJ_NS_TYPE_NONE) && (type < KOBJ_NS_TYPES) &&
> + kobj_ns_ops_tbl[type])
> + may_mount = kobj_ns_ops_tbl[type]->current_may_mount();
> + spin_unlock(&kobj_ns_type_lock);
> +
> + return may_mount;
> +}
>
> void *kobj_ns_grab_current(enum kobj_ns_type type)
> {
> diff --git a/net/core/net-sysfs.c b/net/core/net-sysfs.c
> index 981fed3..0b0ff95 100644
> --- a/net/core/net-sysfs.c
> +++ b/net/core/net-sysfs.c
> @@ -1157,6 +1157,13 @@ static void remove_queue_kobjects(struct net_device *net)
> #endif
> }
>
> +static bool net_current_may_mount(void)
> +{
> + struct net *net = current->nsproxy->net_ns;
> +
> + return !ns_capable(net->user_ns, CAP_SYS_ADMIN);
> +}
> +
> static void *net_grab_current_ns(void)
> {
> struct net *ns = current->nsproxy->net_ns;
> @@ -1179,6 +1186,7 @@ static const void *net_netlink_ns(struct sock *sk)
>
> struct kobj_ns_type_operations net_ns_type_operations = {
> .type = KOBJ_NS_TYPE_NET,
> + .current_may_mount = net_current_may_mount,
> .grab_current_ns = net_grab_current_ns,
> .netlink_ns = net_netlink_ns,
> .initial_ns = net_initial_ns,
>
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 836 bytes --]
next prev parent reply other threads:[~2013-09-23 10:33 UTC|newest]
Thread overview: 45+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-08-27 21:44 [REVIEW][PATCH 1/2] userns: Better restrictions on when proc and sysfs can be mounted Eric W. Biederman
2013-08-27 21:44 ` Eric W. Biederman
[not found] ` <878uzmhkqg.fsf-aS9lmoZGLiVWk0Htik3J/w@public.gmane.org>
2013-08-27 21:46 ` [REVIEW][PATCH 2/2] sysfs: Restrict mounting sysfs Eric W. Biederman
2013-08-27 21:46 ` Eric W. Biederman
[not found] ` <874naahkng.fsf-aS9lmoZGLiVWk0Htik3J/w@public.gmane.org>
2013-08-28 19:00 ` Greg Kroah-Hartman
2013-08-28 19:00 ` Greg Kroah-Hartman
2013-09-23 10:33 ` James Hogan [this message]
2013-09-23 10:33 ` James Hogan
[not found] ` <524018EA.9070202-1AXoQHu6uovQT0dZR+AlfA@public.gmane.org>
2013-09-23 21:41 ` [PATCH] sysfs: Allow mounting without CONFIG_NET Eric W. Biederman
2013-09-23 21:41 ` Eric W. Biederman
[not found] ` <87ioxrrzb6.fsf_-_-HxuHnoDHeQZYhcs0q7wBk77fW72O3V7zAL8bYrjMMd8@public.gmane.org>
2013-09-24 11:25 ` James Hogan
2013-09-24 11:25 ` James Hogan
2013-08-27 21:47 ` [REVIEW][PATCH 1/2] userns: Better restrictions on when proc and sysfs can be mounted Andy Lutomirski
2013-08-27 21:47 ` Andy Lutomirski
[not found] ` <CALCETrWPDzuoaJp2ko5jAbwYUBqSdPjvO5uGo-gZVsS4Wm1PKQ-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2013-08-27 21:57 ` Eric W. Biederman
2013-08-27 21:57 ` Eric W. Biederman
2013-09-01 4:45 ` Eric W. Biederman
[not found] ` <87eh99noa0.fsf-aS9lmoZGLiVWk0Htik3J/w@public.gmane.org>
2013-09-03 17:40 ` Andy Lutomirski
2013-09-03 17:40 ` Andy Lutomirski
[not found] ` <87a9k2g5la.fsf-aS9lmoZGLiVWk0Htik3J/w@public.gmane.org>
2013-09-01 4:45 ` Eric W. Biederman
2013-11-02 6:06 ` Gao feng
2013-11-02 6:06 ` Gao feng
[not found] ` <52749663.2000701-BthXqXjhjHXQFUHtdCDX3A@public.gmane.org>
2013-11-04 7:00 ` Janne Karhunen
2013-11-04 7:00 ` Janne Karhunen
[not found] ` <CAE=NcrY+CzX+H4XQTdGj7CSZ98a5T=bNgT6=jGZzcjyaHb-ttw-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2013-11-09 5:22 ` Eric W. Biederman
2013-11-09 5:22 ` Eric W. Biederman
2013-11-08 2:33 ` Gao feng
2013-11-08 2:33 ` Gao feng
[not found] ` <527C4D88.10907-BthXqXjhjHXQFUHtdCDX3A@public.gmane.org>
2013-11-09 5:42 ` Eric W. Biederman
2013-11-09 5:42 ` Eric W. Biederman
[not found] ` <87k3gigmgj.fsf-aS9lmoZGLiVWk0Htik3J/w@public.gmane.org>
2013-11-13 7:26 ` Gao feng
2013-11-13 7:26 ` Gao feng
[not found] ` <5283299B.8080702-BthXqXjhjHXQFUHtdCDX3A@public.gmane.org>
2013-11-14 11:10 ` Gao feng
2013-11-14 11:10 ` Gao feng
2013-11-14 11:10 ` Gao feng
[not found] ` <5284AF90.7060506-BthXqXjhjHXQFUHtdCDX3A@public.gmane.org>
2013-11-14 16:54 ` Andy Lutomirski
2013-11-14 16:54 ` Andy Lutomirski
[not found] ` <CALCETrXtWtF=JgiwENNzh7UZKnXijHauOQ5ZjHYxYJC-BAU5Aw-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2013-11-15 1:16 ` Gao feng
2013-11-15 1:16 ` Gao feng
[not found] ` <528575EC.2030309-BthXqXjhjHXQFUHtdCDX3A@public.gmane.org>
2013-11-15 4:54 ` Eric W. Biederman
2013-11-15 4:54 ` Eric W. Biederman
[not found] ` <87txfexo25.fsf-aS9lmoZGLiVWk0Htik3J/w@public.gmane.org>
2013-11-15 6:14 ` Gao feng
2013-11-15 6:14 ` Gao feng
[not found] ` <5285BBE2.7010001-BthXqXjhjHXQFUHtdCDX3A@public.gmane.org>
2013-11-15 8:37 ` Eric W. Biederman
2013-11-15 8:37 ` Eric W. Biederman
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=524018EA.9070202@imgtec.com \
--to=james.hogan-1axoqhu6uovqt0dzr+alfa@public.gmane.org \
--cc=containers-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org \
--cc=ebiederm-aS9lmoZGLiVWk0Htik3J/w@public.gmane.org \
--cc=gregkh-hQyY1W1yCW8ekmWlsbkhG0B+6BGkLq7r@public.gmane.org \
--cc=linux-fsdevel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=luto-kltTT9wpgjJwATOyAt5JVQ@public.gmane.org \
/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.