Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ebiederm/user-namespace
Pull (again) user namespace infrastructure changes from Eric Biederman: "Those bugs, those darn embarrasing bugs just want don't want to get fixed. Linus I just updated my mirror of your kernel.org tree and it appears you successfully pulled everything except the last 4 commits that fix those embarrasing bugs. When you get a chance can you please repull my branch" * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ebiederm/user-namespace: userns: Fix typo in description of the limitation of userns_install userns: Add a more complete capability subset test to commit_creds userns: Require CAP_SYS_ADMIN for most uses of setns. Fix cap_capable to only allow owners in the parent user namespace to have caps.
This commit is contained in:
+17
-8
@@ -76,24 +76,33 @@ int cap_netlink_send(struct sock *sk, struct sk_buff *skb)
|
||||
int cap_capable(const struct cred *cred, struct user_namespace *targ_ns,
|
||||
int cap, int audit)
|
||||
{
|
||||
for (;;) {
|
||||
/* The owner of the user namespace has all caps. */
|
||||
if (targ_ns != &init_user_ns && uid_eq(targ_ns->owner, cred->euid))
|
||||
return 0;
|
||||
struct user_namespace *ns = targ_ns;
|
||||
|
||||
/* See if cred has the capability in the target user namespace
|
||||
* by examining the target user namespace and all of the target
|
||||
* user namespace's parents.
|
||||
*/
|
||||
for (;;) {
|
||||
/* Do we have the necessary capabilities? */
|
||||
if (targ_ns == cred->user_ns)
|
||||
if (ns == cred->user_ns)
|
||||
return cap_raised(cred->cap_effective, cap) ? 0 : -EPERM;
|
||||
|
||||
/* Have we tried all of the parent namespaces? */
|
||||
if (targ_ns == &init_user_ns)
|
||||
if (ns == &init_user_ns)
|
||||
return -EPERM;
|
||||
|
||||
/*
|
||||
* The owner of the user namespace in the parent of the
|
||||
* user namespace has all caps.
|
||||
*/
|
||||
if ((ns->parent == cred->user_ns) && uid_eq(ns->owner, cred->euid))
|
||||
return 0;
|
||||
|
||||
/*
|
||||
*If you have a capability in a parent user ns, then you have
|
||||
* If you have a capability in a parent user ns, then you have
|
||||
* it over all children user namespaces as well.
|
||||
*/
|
||||
targ_ns = targ_ns->parent;
|
||||
ns = ns->parent;
|
||||
}
|
||||
|
||||
/* We never get here */
|
||||
|
||||
Reference in New Issue
Block a user