qemu-e2k/hw/9pfs
Greg Kurz 1d20398694 9p: fix QEMU crash when renaming files
When using the 9P2000.u version of the protocol, the following shell
command line in the guest can cause QEMU to crash:

    while true; do rm -rf aa; mkdir -p a/b & touch a/b/c & mv a aa; done

With 9P2000.u, file renaming is handled by the WSTAT command. The
v9fs_wstat() function calls v9fs_complete_rename(), which calls
v9fs_fix_path() for every fid whose path is affected by the change.
The involved calls to v9fs_path_copy() may race with any other access
to the fid path performed by some worker thread, causing a crash like
shown below:

Thread 12 "qemu-system-x86" received signal SIGSEGV, Segmentation fault.
0x0000555555a25da2 in local_open_nofollow (fs_ctx=0x555557d958b8, path=0x0,
 flags=65536, mode=0) at hw/9pfs/9p-local.c:59
59          while (*path && fd != -1) {
(gdb) bt
#0  0x0000555555a25da2 in local_open_nofollow (fs_ctx=0x555557d958b8,
 path=0x0, flags=65536, mode=0) at hw/9pfs/9p-local.c:59
#1  0x0000555555a25e0c in local_opendir_nofollow (fs_ctx=0x555557d958b8,
 path=0x0) at hw/9pfs/9p-local.c:92
#2  0x0000555555a261b8 in local_lstat (fs_ctx=0x555557d958b8,
 fs_path=0x555556b56858, stbuf=0x7fff84830ef0) at hw/9pfs/9p-local.c:185
#3  0x0000555555a2b367 in v9fs_co_lstat (pdu=0x555557d97498,
 path=0x555556b56858, stbuf=0x7fff84830ef0) at hw/9pfs/cofile.c:53
#4  0x0000555555a1e9e2 in v9fs_stat (opaque=0x555557d97498)
 at hw/9pfs/9p.c:1083
#5  0x0000555555e060a2 in coroutine_trampoline (i0=-669165424, i1=32767)
 at util/coroutine-ucontext.c:116
#6  0x00007fffef4f5600 in __start_context () at /lib64/libc.so.6
#7  0x0000000000000000 in  ()
(gdb)

The fix is to take the path write lock when calling v9fs_complete_rename(),
like in v9fs_rename().

Impact:  DoS triggered by unprivileged guest users.

Fixes: CVE-2018-19489
Cc: P J P <ppandit@redhat.com>
Reported-by: zhibin hu <noirfate@gmail.com>
Reviewed-by: Prasad J Pandit <pjp@fedoraproject.org>
Signed-off-by: Greg Kurz <groug@kaod.org>
2018-11-23 13:28:03 +01:00
..
9p-handle.c 9pfs: Fix CLI parsing crash on error 2018-10-19 14:51:34 +02:00
9p-local.c error: Fix use of error_prepend() with &error_fatal, &error_abort 2018-10-19 14:51:34 +02:00
9p-local.h 9pfs: local: open/opendir: don't follow symlinks 2017-02-28 11:21:15 +01:00
9p-posix-acl.c 9pfs: local: lremovexattr: don't follow symlinks 2017-02-28 11:21:15 +01:00
9p-proxy.c 9p: proxy: Fix size passed to connect 2018-06-07 12:17:21 +02:00
9p-proxy.h
9p-synth.c 9p: fix leak in synth_name_to_path() 2018-02-19 18:27:32 +01:00
9p-synth.h tests: virtio-9p: add FLUSH operation test 2018-02-02 11:11:55 +01:00
9p-util.c 9p: Move a couple xattr functions to 9p-util 2018-06-07 12:17:22 +02:00
9p-util.h 9p: Move a couple xattr functions to 9p-util 2018-06-07 12:17:22 +02:00
9p-xattr-user.c 9pfs: local: lremovexattr: don't follow symlinks 2017-02-28 11:21:15 +01:00
9p-xattr.c 9p: Move a couple xattr functions to 9p-util 2018-06-07 12:17:22 +02:00
9p-xattr.h 9pfs: fix XattrOperations typedef 2018-01-08 11:18:22 +01:00
9p.c 9p: fix QEMU crash when renaming files 2018-11-23 13:28:03 +01:00
9p.h 9p: xattr: Properly translate xattrcreate flags 2018-06-07 12:17:22 +02:00
codir.c
cofile.c 9p: write lock path in v9fs_co_open2() 2018-11-08 21:19:05 +01:00
cofs.c
coth.c
coth.h
coxattr.c
Makefile.objs hw: make virtio devices configurable via default-configs/ 2018-06-01 15:14:31 +02:00
trace-events 9p: add trace event for v9fs_setattr() 2018-05-02 08:59:24 +02:00
virtio-9p-device.c 9pfs: drop v9fs_register_transport() 2018-02-01 21:21:27 +01:00
virtio-9p.h
xen-9p-backend.c fsdev: Clean up error reporting in qemu_fsdev_add() 2018-10-19 14:51:34 +02:00
xen-9pfs.h xen/9pfs: introduce Xen 9pfs backend 2017-04-25 11:04:28 -07:00