summaryrefslogtreecommitdiffstats
path: root/kernel
diff options
context:
space:
mode:
authorEric W. Biederman <ebiederm@xmission.com>2014-12-05 18:51:47 -0500
committerEric W. Biederman <ebiederm@xmission.com>2014-12-05 20:07:26 -0500
commit0542f17bf2c1f2430d368f44c8fcf2f82ec9e53e (patch)
treef52eba42635a23cb5c2b6a49eb3180285ccba925 /kernel
parent7ff4d90b4c24a03666f296c3d4878cd39001e81e (diff)
userns: Document what the invariant required for safe unprivileged mappings.
The rule is simple. Don't allow anything that wouldn't be allowed without unprivileged mappings. It was previously overlooked that establishing gid mappings would allow dropping groups and potentially gaining permission to files and directories that had lesser permissions for a specific group than for all other users. This is the rule needed to fix CVE-2014-8989 and prevent any other security issues with new_idmap_permitted. The reason for this rule is that the unix permission model is old and there are programs out there somewhere that take advantage of every little corner of it. So allowing a uid or gid mapping to be established without privielge that would allow anything that would not be allowed without that mapping will result in expectations from some code somewhere being violated. Violated expectations about the behavior of the OS is a long way to say a security issue. Cc: stable@vger.kernel.org Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
Diffstat (limited to 'kernel')
-rw-r--r--kernel/user_namespace.c4
1 files changed, 3 insertions, 1 deletions
diff --git a/kernel/user_namespace.c b/kernel/user_namespace.c
index aa312b0dc3ec..b99c862a2e3f 100644
--- a/kernel/user_namespace.c
+++ b/kernel/user_namespace.c
@@ -812,7 +812,9 @@ 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 /* Allow mapping to your own filesystem ids */ 815 /* Don't allow mappings that would allow anything that wouldn't
816 * be allowed without the establishment of unprivileged mappings.
817 */
816 if ((new_map->nr_extents == 1) && (new_map->extent[0].count == 1)) { 818 if ((new_map->nr_extents == 1) && (new_map->extent[0].count == 1)) {
817 u32 id = new_map->extent[0].lower_first; 819 u32 id = new_map->extent[0].lower_first;
818 if (cap_setid == CAP_SETUID) { 820 if (cap_setid == CAP_SETUID) {