Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 361884
b: refs/heads/master
c: 87a8ebd
h: refs/heads/master
v: v3
  • Loading branch information
Eric W. Biederman committed Mar 27, 2013
1 parent 64416fc commit 18c2ceb
Show file tree
Hide file tree
Showing 7 changed files with 38 additions and 1 deletion.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: a636b702ed1805e988ad3d8ff8b52c060f8b341c
refs/heads/master: 87a8ebd637dafc255070f503909a053cf0d98d3f
21 changes: 21 additions & 0 deletions trunk/fs/namespace.c
Original file line number Diff line number Diff line change
Expand Up @@ -2763,6 +2763,27 @@ bool current_chrooted(void)
return chrooted;
}

void update_mnt_policy(struct user_namespace *userns)
{
struct mnt_namespace *ns = current->nsproxy->mnt_ns;
struct mount *mnt;

down_read(&namespace_sem);
list_for_each_entry(mnt, &ns->list, mnt_list) {
switch (mnt->mnt.mnt_sb->s_magic) {
case SYSFS_MAGIC:
userns->may_mount_sysfs = true;
break;
case PROC_SUPER_MAGIC:
userns->may_mount_proc = true;
break;
}
if (userns->may_mount_sysfs && userns->may_mount_proc)
break;
}
up_read(&namespace_sem);
}

static void *mntns_get(struct task_struct *task)
{
struct mnt_namespace *ns = NULL;
Expand Down
4 changes: 4 additions & 0 deletions trunk/fs/proc/root.c
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
#include <linux/sched.h>
#include <linux/module.h>
#include <linux/bitops.h>
#include <linux/user_namespace.h>
#include <linux/mount.h>
#include <linux/pid_namespace.h>
#include <linux/parser.h>
Expand Down Expand Up @@ -108,6 +109,9 @@ static struct dentry *proc_mount(struct file_system_type *fs_type,
} else {
ns = task_active_pid_ns(current);
options = data;

if (!current_user_ns()->may_mount_proc)
return ERR_PTR(-EPERM);
}

sb = sget(fs_type, proc_test_super, proc_set_super, flags, ns);
Expand Down
4 changes: 4 additions & 0 deletions trunk/fs/sysfs/mount.c
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
#include <linux/module.h>
#include <linux/magic.h>
#include <linux/slab.h>
#include <linux/user_namespace.h>

#include "sysfs.h"

Expand Down Expand Up @@ -111,6 +112,9 @@ static struct dentry *sysfs_mount(struct file_system_type *fs_type,
struct super_block *sb;
int error;

if (!(flags & MS_KERNMOUNT) && !current_user_ns()->may_mount_sysfs)
return ERR_PTR(-EPERM);

info = kzalloc(sizeof(*info), GFP_KERNEL);
if (!info)
return ERR_PTR(-ENOMEM);
Expand Down
4 changes: 4 additions & 0 deletions trunk/include/linux/user_namespace.h
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@ struct user_namespace {
kuid_t owner;
kgid_t group;
unsigned int proc_inum;
bool may_mount_sysfs;
bool may_mount_proc;
};

extern struct user_namespace init_user_ns;
Expand Down Expand Up @@ -82,4 +84,6 @@ static inline void put_user_ns(struct user_namespace *ns)

#endif

void update_mnt_policy(struct user_namespace *userns);

#endif /* _LINUX_USER_H */
2 changes: 2 additions & 0 deletions trunk/kernel/user.c
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,8 @@ struct user_namespace init_user_ns = {
.owner = GLOBAL_ROOT_UID,
.group = GLOBAL_ROOT_GID,
.proc_inum = PROC_USER_INIT_INO,
.may_mount_sysfs = true,
.may_mount_proc = true,
};
EXPORT_SYMBOL_GPL(init_user_ns);

Expand Down
2 changes: 2 additions & 0 deletions trunk/kernel/user_namespace.c
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,8 @@ int create_user_ns(struct cred *new)

set_cred_user_ns(new, ns);

update_mnt_policy(ns);

return 0;
}

Expand Down

0 comments on commit 18c2ceb

Please sign in to comment.