aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEric W. Biederman <ebiederm@xmission.com>2014-11-27 00:22:14 -0500
committerEric W. Biederman <ebiederm@xmission.com>2014-12-09 18:08:32 -0500
commitf95d7918bd1e724675de4940039f2865e5eec5fe (patch)
treedf6e44746ff643f6f70773dfb1783d9ea7b729bf
parent80dd00a23784b384ccea049bfb3f259d3f973b9d (diff)
userns: Only allow the creator of the userns unprivileged mappings
If you did not create the user namespace and are allowed to write to uid_map or gid_map you should already have the necessary privilege in the parent user namespace to establish any mapping you want so this will not affect userspace in practice. Limiting unprivileged uid mapping establishment to the creator of the user namespace makes it easier to verify all credentials obtained with the uid mapping can be obtained without the uid mapping without privilege. Limiting unprivileged gid mapping establishment (which is temporarily absent) to the creator of the user namespace also ensures that the combination of uid and gid can already be obtained without privilege. This is part of the fix for CVE-2014-8989. Cc: stable@vger.kernel.org Reviewed-by: Andy Lutomirski <luto@amacapital.net> Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
-rw-r--r--kernel/user_namespace.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/kernel/user_namespace.c b/kernel/user_namespace.c
index 9451b12a9b6c..1e34de2fbd60 100644
--- a/kernel/user_namespace.c
+++ b/kernel/user_namespace.c
@@ -812,14 +812,16 @@ static bool new_idmap_permitted(const struct file *file,
812 struct user_namespace *ns, int cap_setid, 812 struct user_namespace *ns, int cap_setid,
813 struct uid_gid_map *new_map) 813 struct uid_gid_map *new_map)
814{ 814{
815 const struct cred *cred = file->f_cred;
815 /* Don't allow mappings that would allow anything that wouldn't 816 /* Don't allow mappings that would allow anything that wouldn't
816 * be allowed without the establishment of unprivileged mappings. 817 * be allowed without the establishment of unprivileged mappings.
817 */ 818 */
818 if ((new_map->nr_extents == 1) && (new_map->extent[0].count == 1)) { 819 if ((new_map->nr_extents == 1) && (new_map->extent[0].count == 1) &&
820 uid_eq(ns->owner, cred->euid)) {
819 u32 id = new_map->extent[0].lower_first; 821 u32 id = new_map->extent[0].lower_first;
820 if (cap_setid == CAP_SETUID) { 822 if (cap_setid == CAP_SETUID) {
821 kuid_t uid = make_kuid(ns->parent, id); 823 kuid_t uid = make_kuid(ns->parent, id);
822 if (uid_eq(uid, file->f_cred->euid)) 824 if (uid_eq(uid, cred->euid))
823 return true; 825 return true;
824 } 826 }
825 } 827 }