summary refs log tree commit diff stats
path: root/hw/9pfs/9p-xattr-user.c
diff options
context:
space:
mode:
authorGreg Kurz <groug@kaod.org>2017-02-26 23:42:26 +0100
committerGreg Kurz <groug@kaod.org>2017-02-28 11:21:15 +0100
commit56ad3e54dad6cdcee8668d170df161d89581846f (patch)
tree1408dc37298a3c74d867820793ecfc8fd0dfa317 /hw/9pfs/9p-xattr-user.c
parent996a0d76d7e756e4023ef79bc37bfe629b9eaca7 (diff)
downloadfocaccia-qemu-56ad3e54dad6cdcee8668d170df161d89581846f.tar.gz
focaccia-qemu-56ad3e54dad6cdcee8668d170df161d89581846f.zip
9pfs: local: lgetxattr: don't follow symlinks
The local_lgetxattr() callback is vulnerable to symlink attacks because
it calls lgetxattr() which follows symbolic links in all path elements but
the rightmost one.

This patch introduces a helper to emulate the non-existing fgetxattrat()
function: it is implemented with /proc/self/fd which provides a trusted
path that can be safely passed to lgetxattr().

local_lgetxattr() is converted to use this helper and opendir_nofollow().

This partly fixes CVE-2016-9602.

Signed-off-by: Greg Kurz <groug@kaod.org>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
Diffstat (limited to 'hw/9pfs/9p-xattr-user.c')
-rw-r--r--hw/9pfs/9p-xattr-user.c8
1 files changed, 1 insertions, 7 deletions
diff --git a/hw/9pfs/9p-xattr-user.c b/hw/9pfs/9p-xattr-user.c
index f87530c8b5..4071fbc4c0 100644
--- a/hw/9pfs/9p-xattr-user.c
+++ b/hw/9pfs/9p-xattr-user.c
@@ -20,9 +20,6 @@
 static ssize_t mp_user_getxattr(FsContext *ctx, const char *path,
                                 const char *name, void *value, size_t size)
 {
-    char *buffer;
-    ssize_t ret;
-
     if (strncmp(name, "user.virtfs.", 12) == 0) {
         /*
          * Don't allow fetch of user.virtfs namesapce
@@ -31,10 +28,7 @@ static ssize_t mp_user_getxattr(FsContext *ctx, const char *path,
         errno = ENOATTR;
         return -1;
     }
-    buffer = rpath(ctx, path);
-    ret = lgetxattr(buffer, name, value, size);
-    g_free(buffer);
-    return ret;
+    return local_getxattr_nofollow(ctx, path, name, value, size);
 }
 
 static ssize_t mp_user_listxattr(FsContext *ctx, const char *path,