| From 80dd00a23784b384ccea049bfb3f259d3f973b9d Mon Sep 17 00:00:00 2001 |
| From: "Eric W. Biederman" <ebiederm@xmission.com> |
| Date: Fri, 5 Dec 2014 18:26:30 -0600 |
| Subject: userns: Check euid no fsuid when establishing an unprivileged uid mapping |
| |
| From: "Eric W. Biederman" <ebiederm@xmission.com> |
| |
| commit 80dd00a23784b384ccea049bfb3f259d3f973b9d upstream. |
| |
| setresuid allows the euid to be set to any of uid, euid, suid, and |
| fsuid. Therefor it is safe to allow an unprivileged user to map |
| their euid and use CAP_SETUID privileged with exactly that uid, |
| as no new credentials can be obtained. |
| |
| I can not find a combination of existing system calls that allows setting |
| uid, euid, suid, and fsuid from the fsuid making the previous use |
| of fsuid for allowing unprivileged mappings a bug. |
| |
| This is part of a fix for CVE-2014-8989. |
| |
| Reviewed-by: Andy Lutomirski <luto@amacapital.net> |
| Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| kernel/user_namespace.c | 2 +- |
| 1 file changed, 1 insertion(+), 1 deletion(-) |
| |
| --- a/kernel/user_namespace.c |
| +++ b/kernel/user_namespace.c |
| @@ -811,7 +811,7 @@ static bool new_idmap_permitted(const st |
| u32 id = new_map->extent[0].lower_first; |
| if (cap_setid == CAP_SETUID) { |
| kuid_t uid = make_kuid(ns->parent, id); |
| - if (uid_eq(uid, file->f_cred->fsuid)) |
| + if (uid_eq(uid, file->f_cred->euid)) |
| return true; |
| } |
| } |