[Devel] Re: [PATCH] cred_to_ucred: use the creator of the right namespace
Eric W. Biederman
ebiederm at xmission.com
Sun Jun 13 05:50:15 PDT 2010
"Serge E. Hallyn" <serue at us.ibm.com> writes:
> Except, while it is *technically* correct, semantically I'm
> not sure that's what we want either.
>
> Assuming again that pid 100 owned by uid 1001 clones a task 200 in a new
> user_ns, which does setresuid(25,25,25). Now 200 sends SCM_CREDENTIALS
> to 100. (Again clearly uid 0 was wrong.) But sending 1001 isn't quite
> right either. In particular, there is a reason why 100 cloned a new
> user namespace: so the uid passed back perhaps should just be
> overflowuid?
>
> As a concrete example I'll again use the case where a task owned by uid
> 0 in init_user_ns creates a child in new user_ns, with uid 25 there, and
> now the child calls /sbin/reboot. reboot talks over abstract unix sock to
> init in the parent and sends SCM_CREDENTIALS. With my patch above, it
> would now send uid 0, and so init would reboot the host. That this is
> wrong becomes particularly obvious when we consider sending posix caps
> along with uid: any posix caps which the child has should be N/A to
> the init_user_ns.
I am conflicted I think there is real justification for showing uids
in a child uid namespace as the creator of the uid namespace. At the
same time I very much agree that it is safer and less dangerous from
an existing security perspective if we don't map the uids to the
creator of the namespace so I have dropped that feature for now.
Thank you for spotting that.
I have extracted the heart of the code and added two functions
to user_namespace.c as that seems to make the most sense for the
moment. I will send this all to netdev shortly.
> IIUC you coded this originally for use by NFS - would sending
> overflowuid make sense for its use as well?
The first time I thought of mapping I was indeed thinking of NFS.
Either overflowuid or whatever NFS does for the nobody user that
it uses for root squash.
> The existing code is still right in the inverse case - if pid 100
> sends SCM_CREDENTIALS to pid 200, it sends uid 0 which I think always
> makes sense.
Agreed.
Below is what I am currently working with, the essence of my cred_to_ucred
patch, but in a form the code can be used elsewhere. I have completely
removed the section for children as we that appears dangerous for the moment.
Eric
uid_t user_ns_map_uid(struct user_namespace *to, const struct cred *cred, uid_t uid)
{
struct user_namespace *tmp;
if (likely(to == cred->user->user_ns))
return uid;
/* Is cred->user the creator of the target user_ns
* or the creator of one of it's parents?
*/
for ( tmp = to; tmp != &init_user_ns;
tmp = tmp->creator->user_ns ) {
if (cred->user == tmp->creator) {
return (uid_t)0;
}
}
/* No useful relationship so no mapping */
return overflowuid;
}
gid_t user_ns_map_gid(struct user_namespace *to, const struct cred *cred, gid_t gid)
{
struct user_namespace *tmp;
if (likely(to == cred->user->user_ns))
return gid;
/* Is cred->user the creator of the target user_ns
* or the creator of one of it's parents?
*/
for ( tmp = to; tmp != &init_user_ns;
tmp = tmp->creator->user_ns ) {
if (cred->user == tmp->creator) {
return (gid_t)0;
}
}
/* No useful relationship so no mapping */
return overflowgid;
}
_______________________________________________
Containers mailing list
Containers at lists.linux-foundation.org
https://lists.linux-foundation.org/mailman/listinfo/containers
More information about the Devel
mailing list