userns: Require CAP_SYS_ADMIN for most uses of setns.
authorEric W. Biederman <ebiederm@xmission.com>
Fri, 14 Dec 2012 15:55:36 +0000 (07:55 -0800)
committerEric W. Biederman <ebiederm@xmission.com>
Sat, 15 Dec 2012 00:12:03 +0000 (16:12 -0800)
commit5e4a08476b50fa39210fca82e03325cc46b9c235
treefb3a3c6b4c3f613abf354adefcff8a74051acdce
parent520d9eabce18edfef76a60b7b839d54facafe1f9
userns: Require CAP_SYS_ADMIN for most uses of setns.

Andy Lutomirski <luto@amacapital.net> found a nasty little bug in
the permissions of setns.  With unprivileged user namespaces it
became possible to create new namespaces without privilege.

However the setns calls were relaxed to only require CAP_SYS_ADMIN in
the user nameapce of the targed namespace.

Which made the following nasty sequence possible.

pid = clone(CLONE_NEWUSER | CLONE_NEWNS);
if (pid == 0) { /* child */
system("mount --bind /home/me/passwd /etc/passwd");
}
else if (pid != 0) { /* parent */
char path[PATH_MAX];
snprintf(path, sizeof(path), "/proc/%u/ns/mnt");
fd = open(path, O_RDONLY);
setns(fd, 0);
system("su -");
}

Prevent this possibility by requiring CAP_SYS_ADMIN
in the current user namespace when joing all but the user namespace.

Acked-by: Serge Hallyn <serge.hallyn@canonical.com>
Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
fs/namespace.c
ipc/namespace.c
kernel/pid_namespace.c
kernel/utsname.c
net/core/net_namespace.c