1. 28 2月, 2017 22 次提交
    • G
      9pfs: local: link: don't follow symlinks · ad0b46e6
      Greg Kurz 提交于
      The local_link() callback is vulnerable to symlink attacks because it calls:
      
      (1) link() which follows symbolic links for all path elements but the
          rightmost one
      (2) local_create_mapped_attr_dir()->mkdir() which follows symbolic links
          for all path elements but the rightmost one
      
      This patch converts local_link() to rely on opendir_nofollow() and linkat()
      to fix (1), mkdirat() to fix (2).
      
      This partly fixes CVE-2016-9602.
      Signed-off-by: NGreg Kurz <groug@kaod.org>
      Reviewed-by: NStefan Hajnoczi <stefanha@redhat.com>
      ad0b46e6
    • G
      9pfs: local: improve error handling in link op · 6dd4b1f1
      Greg Kurz 提交于
      When using the mapped-file security model, we also have to create a link
      for the metadata file if it exists. In case of failure, we should rollback.
      
      That's what this patch does.
      Signed-off-by: NGreg Kurz <groug@kaod.org>
      Reviewed-by: NStefan Hajnoczi <stefanha@redhat.com>
      6dd4b1f1
    • G
      9pfs: local: rename: use renameat · d2767ede
      Greg Kurz 提交于
      The local_rename() callback is vulnerable to symlink attacks because it
      uses rename() which follows symbolic links in all path elements but the
      rightmost one.
      
      This patch simply transforms local_rename() into a wrapper around
      local_renameat() which is symlink-attack safe.
      
      This partly fixes CVE-2016-9602.
      Signed-off-by: NGreg Kurz <groug@kaod.org>
      Reviewed-by: NStefan Hajnoczi <stefanha@redhat.com>
      d2767ede
    • G
      9pfs: local: renameat: don't follow symlinks · 99f2cf4b
      Greg Kurz 提交于
      The local_renameat() callback is currently a wrapper around local_rename()
      which is vulnerable to symlink attacks.
      
      This patch rewrites local_renameat() to have its own implementation, based
      on local_opendir_nofollow() and renameat().
      
      This partly fixes CVE-2016-9602.
      Signed-off-by: NGreg Kurz <groug@kaod.org>
      Reviewed-by: NStefan Hajnoczi <stefanha@redhat.com>
      99f2cf4b
    • G
      9pfs: local: lstat: don't follow symlinks · f9aef99b
      Greg Kurz 提交于
      The local_lstat() callback is vulnerable to symlink attacks because it
      calls:
      
      (1) lstat() which follows symbolic links in all path elements but the
          rightmost one
      (2) getxattr() which follows symbolic links in all path elements
      (3) local_mapped_file_attr()->local_fopen()->openat(O_NOFOLLOW) which
          follows symbolic links in all path elements but the rightmost
          one
      
      This patch converts local_lstat() to rely on opendir_nofollow() and
      fstatat(AT_SYMLINK_NOFOLLOW) to fix (1), fgetxattrat_nofollow() to
      fix (2).
      
      A new local_fopenat() helper is introduced as a replacement to
      local_fopen() to fix (3). No effort is made to factor out code
      because local_fopen() will be dropped when all users have been
      converted to call local_fopenat().
      
      This partly fixes CVE-2016-9602.
      Signed-off-by: NGreg Kurz <groug@kaod.org>
      Reviewed-by: NStefan Hajnoczi <stefanha@redhat.com>
      f9aef99b
    • G
      9pfs: local: readlink: don't follow symlinks · bec1e954
      Greg Kurz 提交于
      The local_readlink() callback is vulnerable to symlink attacks because it
      calls:
      
      (1) open(O_NOFOLLOW) which follows symbolic links for all path elements but
          the rightmost one
      (2) readlink() which follows symbolic links for all path elements but the
          rightmost one
      
      This patch converts local_readlink() to rely on open_nofollow() to fix (1)
      and opendir_nofollow(), readlinkat() to fix (2).
      
      This partly fixes CVE-2016-9602.
      Signed-off-by: NGreg Kurz <groug@kaod.org>
      Reviewed-by: NStefan Hajnoczi <stefanha@redhat.com>
      bec1e954
    • G
      9pfs: local: truncate: don't follow symlinks · ac125d99
      Greg Kurz 提交于
      The local_truncate() callback is vulnerable to symlink attacks because
      it calls truncate() which follows symbolic links in all path elements.
      
      This patch converts local_truncate() to rely on open_nofollow() and
      ftruncate() instead.
      
      This partly fixes CVE-2016-9602.
      Signed-off-by: NGreg Kurz <groug@kaod.org>
      Reviewed-by: NStefan Hajnoczi <stefanha@redhat.com>
      ac125d99
    • G
      9pfs: local: statfs: don't follow symlinks · 31e51d1c
      Greg Kurz 提交于
      The local_statfs() callback is vulnerable to symlink attacks because it
      calls statfs() which follows symbolic links in all path elements.
      
      This patch converts local_statfs() to rely on open_nofollow() and fstatfs()
      instead.
      
      This partly fixes CVE-2016-9602.
      Signed-off-by: NGreg Kurz <groug@kaod.org>
      Reviewed-by: NStefan Hajnoczi <stefanha@redhat.com>
      31e51d1c
    • G
      9pfs: local: utimensat: don't follow symlinks · a33eda0d
      Greg Kurz 提交于
      The local_utimensat() callback is vulnerable to symlink attacks because it
      calls qemu_utimens()->utimensat(AT_SYMLINK_NOFOLLOW) which follows symbolic
      links in all path elements but the rightmost one or qemu_utimens()->utimes()
      which follows symbolic links for all path elements.
      
      This patch converts local_utimensat() to rely on opendir_nofollow() and
      utimensat(AT_SYMLINK_NOFOLLOW) directly instead of using qemu_utimens().
      It is hence assumed that the OS supports utimensat(), i.e. has glibc 2.6
      or higher and linux 2.6.22 or higher, which seems reasonable nowadays.
      
      This partly fixes CVE-2016-9602.
      Signed-off-by: NGreg Kurz <groug@kaod.org>
      Reviewed-by: NStefan Hajnoczi <stefanha@redhat.com>
      a33eda0d
    • G
      9pfs: local: remove: don't follow symlinks · a0e640a8
      Greg Kurz 提交于
      The local_remove() callback is vulnerable to symlink attacks because it
      calls:
      
      (1) lstat() which follows symbolic links in all path elements but the
          rightmost one
      (2) remove() which follows symbolic links in all path elements but the
          rightmost one
      
      This patch converts local_remove() to rely on opendir_nofollow(),
      fstatat(AT_SYMLINK_NOFOLLOW) to fix (1) and unlinkat() to fix (2).
      
      This partly fixes CVE-2016-9602.
      Signed-off-by: NGreg Kurz <groug@kaod.org>
      Reviewed-by: NStefan Hajnoczi <stefanha@redhat.com>
      a0e640a8
    • G
      9pfs: local: unlinkat: don't follow symlinks · df4938a6
      Greg Kurz 提交于
      The local_unlinkat() callback is vulnerable to symlink attacks because it
      calls remove() which follows symbolic links in all path elements but the
      rightmost one.
      
      This patch converts local_unlinkat() to rely on opendir_nofollow() and
      unlinkat() instead.
      
      Most of the code is moved to a separate local_unlinkat_common() helper
      which will be reused in a subsequent patch to fix the same issue in
      local_remove().
      
      This partly fixes CVE-2016-9602.
      Signed-off-by: NGreg Kurz <groug@kaod.org>
      Reviewed-by: NStefan Hajnoczi <stefanha@redhat.com>
      Reviewed-by: NStefan Hajnoczi <stefanha@redhat.com>
      df4938a6
    • G
      9pfs: local: lremovexattr: don't follow symlinks · 72f0d0bf
      Greg Kurz 提交于
      The local_lremovexattr() callback is vulnerable to symlink attacks because
      it calls lremovexattr() which follows symbolic links in all path elements
      but the rightmost one.
      
      This patch introduces a helper to emulate the non-existing fremovexattrat()
      function: it is implemented with /proc/self/fd which provides a trusted
      path that can be safely passed to lremovexattr().
      
      local_lremovexattr() is converted to use this helper and opendir_nofollow().
      
      This partly fixes CVE-2016-9602.
      Signed-off-by: NGreg Kurz <groug@kaod.org>
      Reviewed-by: NStefan Hajnoczi <stefanha@redhat.com>
      72f0d0bf
    • G
      9pfs: local: lsetxattr: don't follow symlinks · 3e36aba7
      Greg Kurz 提交于
      The local_lsetxattr() callback is vulnerable to symlink attacks because
      it calls lsetxattr() which follows symbolic links in all path elements but
      the rightmost one.
      
      This patch introduces a helper to emulate the non-existing fsetxattrat()
      function: it is implemented with /proc/self/fd which provides a trusted
      path that can be safely passed to lsetxattr().
      
      local_lsetxattr() is converted to use this helper and opendir_nofollow().
      
      This partly fixes CVE-2016-9602.
      Signed-off-by: NGreg Kurz <groug@kaod.org>
      Reviewed-by: NStefan Hajnoczi <stefanha@redhat.com>
      3e36aba7
    • G
      9pfs: local: llistxattr: don't follow symlinks · 5507904e
      Greg Kurz 提交于
      The local_llistxattr() callback is vulnerable to symlink attacks because
      it calls llistxattr() which follows symbolic links in all path elements but
      the rightmost one.
      
      This patch introduces a helper to emulate the non-existing flistxattrat()
      function: it is implemented with /proc/self/fd which provides a trusted
      path that can be safely passed to llistxattr().
      
      local_llistxattr() is converted to use this helper and opendir_nofollow().
      
      This partly fixes CVE-2016-9602.
      Signed-off-by: NGreg Kurz <groug@kaod.org>
      Reviewed-by: NStefan Hajnoczi <stefanha@redhat.com>
      5507904e
    • G
      9pfs: local: lgetxattr: don't follow symlinks · 56ad3e54
      Greg Kurz 提交于
      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: NGreg Kurz <groug@kaod.org>
      Reviewed-by: NStefan Hajnoczi <stefanha@redhat.com>
      56ad3e54
    • G
      9pfs: local: open/opendir: don't follow symlinks · 996a0d76
      Greg Kurz 提交于
      The local_open() and local_opendir() callbacks are vulnerable to symlink
      attacks because they call:
      
      (1) open(O_NOFOLLOW) which follows symbolic links in all path elements but
          the rightmost one
      (2) opendir() which follows symbolic links in all path elements
      
      This patch converts both callbacks to use new helpers based on
      openat_nofollow() to only open files and directories if they are
      below the virtfs shared folder
      
      This partly fixes CVE-2016-9602.
      Signed-off-by: NGreg Kurz <groug@kaod.org>
      Reviewed-by: NStefan Hajnoczi <stefanha@redhat.com>
      996a0d76
    • G
      9pfs: local: keep a file descriptor on the shared folder · 0e35a378
      Greg Kurz 提交于
      This patch opens the shared folder and caches the file descriptor, so that
      it can be used to do symlink-safe path walk.
      Signed-off-by: NGreg Kurz <groug@kaod.org>
      Reviewed-by: NStefan Hajnoczi <stefanha@redhat.com>
      0e35a378
    • G
      9pfs: introduce relative_openat_nofollow() helper · 6482a961
      Greg Kurz 提交于
      When using the passthrough security mode, symbolic links created by the
      guest are actual symbolic links on the host file system.
      
      Since the resolution of symbolic links during path walk is supposed to
      occur on the client side. The server should hence never receive any path
      pointing to an actual symbolic link. This isn't guaranteed by the protocol
      though, and malicious code in the guest can trick the server to issue
      various syscalls on paths whose one or more elements are symbolic links.
      In the case of the "local" backend using the "passthrough" or "none"
      security modes, the guest can directly create symbolic links to arbitrary
      locations on the host (as per spec). The "mapped-xattr" and "mapped-file"
      security modes are also affected to a lesser extent as they require some
      help from an external entity to create actual symbolic links on the host,
      i.e. another guest using "passthrough" mode for example.
      
      The current code hence relies on O_NOFOLLOW and "l*()" variants of system
      calls. Unfortunately, this only applies to the rightmost path component.
      A guest could maliciously replace any component in a trusted path with a
      symbolic link. This could allow any guest to escape a virtfs shared folder.
      
      This patch introduces a variant of the openat() syscall that successively
      opens each path element with O_NOFOLLOW. When passing a file descriptor
      pointing to a trusted directory, one is guaranteed to be returned a
      file descriptor pointing to a path which is beneath the trusted directory.
      This will be used by subsequent patches to implement symlink-safe path walk
      for any access to the backend.
      
      Symbolic links aren't the only threats actually: a malicious guest could
      change a path element to point to other types of file with undesirable
      effects:
      - a named pipe or any other thing that would cause openat() to block
      - a terminal device which would become QEMU's controlling terminal
      
      These issues can be addressed with O_NONBLOCK and O_NOCTTY.
      
      Two helpers are introduced: one to open intermediate path elements and one
      to open the rightmost path element.
      Suggested-by: NJann Horn <jannh@google.com>
      Signed-off-by: NGreg Kurz <groug@kaod.org>
      Reviewed-by: NStefan Hajnoczi <stefanha@redhat.com>
      (renamed openat_nofollow() to relative_openat_nofollow(),
       assert path is relative and doesn't contain '//',
       fixed side-effect in assert, Greg Kurz)
      Signed-off-by: NGreg Kurz <groug@kaod.org>
      6482a961
    • G
      9pfs: remove side-effects in local_open() and local_opendir() · 21328e1e
      Greg Kurz 提交于
      If these functions fail, they should not change *fs. Let's use local
      variables to fix this.
      Signed-off-by: NGreg Kurz <groug@kaod.org>
      Reviewed-by: NStefan Hajnoczi <stefanha@redhat.com>
      21328e1e
    • G
      9pfs: remove side-effects in local_init() · 00c90bd1
      Greg Kurz 提交于
      If this function fails, it should not modify *ctx.
      Signed-off-by: NGreg Kurz <groug@kaod.org>
      Reviewed-by: NStefan Hajnoczi <stefanha@redhat.com>
      00c90bd1
    • G
      9pfs: local: move xattr security ops to 9p-xattr.c · 56fc494b
      Greg Kurz 提交于
      These functions are always called indirectly. It really doesn't make sense
      for them to sit in a header file.
      Signed-off-by: NGreg Kurz <groug@kaod.org>
      Reviewed-by: NStefan Hajnoczi <stefanha@redhat.com>
      56fc494b
    • P
      Merge remote-tracking branch 'remotes/kraxel/tags/pull-ui-20170227-1' into staging · 9b9fbe8a
      Peter Maydell 提交于
      gtk: fix kbd on xwayland
      vnc: fix double free issues
      opengl improvements
      
      # gpg: Signature made Mon 27 Feb 2017 16:11:30 GMT
      # gpg:                using RSA key 0x4CB6D8EED3E87138
      # gpg: Good signature from "Gerd Hoffmann (work) <kraxel@redhat.com>"
      # gpg:                 aka "Gerd Hoffmann <gerd@kraxel.org>"
      # gpg:                 aka "Gerd Hoffmann (private) <kraxel@gmail.com>"
      # Primary key fingerprint: A032 8CFF B93A 17A7 9901  FE7D 4CB6 D8EE D3E8 7138
      
      * remotes/kraxel/tags/pull-ui-20170227-1:
        vnc: fix double free issues
        spice: add display & head options
        ui: Use XkbGetMap and XkbGetNames instead of XkbGetKeyboard
        gtk-egl: add scanout_disable support
        sdl2: add scanout_disable support
        spice: add scanout_disable support
        virtio-gpu: use dpy_gl_scanout_disable
        console: add dpy_gl_scanout_disable
        console: rename dpy_gl_scanout to dpy_gl_scanout_texture
      Signed-off-by: NPeter Maydell <peter.maydell@linaro.org>
      9b9fbe8a
  2. 27 2月, 2017 17 次提交
  3. 26 2月, 2017 1 次提交