qemu/ui
Fiona Ebner 480a6adc83 ui/clipboard: mark type as not available when there is no data
With VNC, a client can send a non-extended VNC_MSG_CLIENT_CUT_TEXT
message with len=0. In qemu_clipboard_set_data(), the clipboard info
will be updated setting data to NULL (because g_memdup(data, size)
returns NULL when size is 0). If the client does not set the
VNC_ENCODING_CLIPBOARD_EXT feature when setting up the encodings, then
the 'request' callback for the clipboard peer is not initialized.
Later, because data is NULL, qemu_clipboard_request() can be reached
via vdagent_chr_write() and vdagent_clipboard_recv_request() and
there, the clipboard owner's 'request' callback will be attempted to
be called, but that is a NULL pointer.

In particular, this can happen when using the KRDC (22.12.3) VNC
client.

Another scenario leading to the same issue is with two clients (say
noVNC and KRDC):

The noVNC client sets the extension VNC_FEATURE_CLIPBOARD_EXT and
initializes its cbpeer.

The KRDC client does not, but triggers a vnc_client_cut_text() (note
it's not the _ext variant)). There, a new clipboard info with it as
the 'owner' is created and via qemu_clipboard_set_data() is called,
which in turn calls qemu_clipboard_update() with that info.

In qemu_clipboard_update(), the notifier for the noVNC client will be
called, i.e. vnc_clipboard_notify() and also set vs->cbinfo for the
noVNC client. The 'owner' in that clipboard info is the clipboard peer
for the KRDC client, which did not initialize the 'request' function.
That sounds correct to me, it is the owner of that clipboard info.

Then when noVNC sends a VNC_MSG_CLIENT_CUT_TEXT message (it did set
the VNC_FEATURE_CLIPBOARD_EXT feature correctly, so a check for it
passes), that clipboard info is passed to qemu_clipboard_request() and
the original segfault still happens.

Fix the issue by handling updates with size 0 differently. In
particular, mark in the clipboard info that the type is not available.

While at it, switch to g_memdup2(), because g_memdup() is deprecated.

Cc: qemu-stable@nongnu.org
Fixes: CVE-2023-6683
Reported-by: Markus Frank <m.frank@proxmox.com>
Suggested-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Tested-by: Markus Frank <m.frank@proxmox.com>
Message-ID: <20240124105749.204610-1-f.ebner@proxmox.com>
(cherry picked from commit 405484b29f)
Signed-off-by: Michael Tokarev <mjt@tls.msk.ru>
2024-02-20 18:45:27 +03:00
..
icons
shader meson: do not build shaders by default 2023-10-17 15:20:53 +02:00
clipboard.c ui/clipboard: mark type as not available when there is no data 2024-02-20 18:45:27 +03:00
cocoa.m ui/cocoa: add zoom-to-fit display option 2023-11-07 11:45:48 +04:00
console-gl.c ui/console: remove redundant format field 2023-09-12 10:37:02 +04:00
console-priv.h ui/vc: split off the VC part from console.c 2023-09-12 10:37:02 +04:00
console-vc-stubs.c ui/vc: console-vc requires PIXMAN 2023-11-07 14:04:25 +04:00
console-vc.c ui/vc: split off the VC part from console.c 2023-09-12 10:37:02 +04:00
console.c ui/console: fix default VC when there are no display 2023-11-21 14:38:14 +04:00
curses_keys.h For curses display, recognize a few more control keys 2023-07-25 10:56:51 +01:00
curses.c ui/vc: rename kbd_put to qemu_text_console functions 2023-09-12 10:37:02 +04:00
cursor_hidden.xpm
cursor_left_ptr.xpm
cursor.c ui/cursor: make width/height unsigned 16-bit integer 2023-05-28 13:08:25 +04:00
dbus-chardev.c ui/dbus: win32 support 2023-06-27 17:08:56 +02:00
dbus-clipboard.c ui/dbus: unregister clipboard on connection close 2023-03-13 22:57:39 +04:00
dbus-console.c input: Allow to choose console with qemu_input_is_absolute 2023-10-03 15:04:56 +04:00
dbus-display1.xml ui/dbus: use shared D3D11 Texture2D when possible 2023-06-27 17:08:56 +02:00
dbus-error.c
dbus-listener.c ui/dbus: do not require PIXMAN 2023-11-07 14:04:25 +04:00
dbus-module.c
dbus.c ui: use "vc" chardev for dbus, gtk & spice-app 2023-11-21 14:38:14 +04:00
dbus.h ui/dbus: win32 support 2023-06-27 17:08:56 +02:00
egl-context.c ui/egl: fix make_context_current() callback return value 2023-06-27 17:08:56 +02:00
egl-headless.c ui: add optional d3d texture pointer to scanout texture 2023-06-27 17:08:56 +02:00
egl-helpers.c virtio-gpu-udmabuf: correct naming of QemuDmaBuf size properties 2023-07-17 15:22:28 +04:00
gtk-clipboard.c
gtk-egl.c ui/gtk-egl: move function calls back to regular code path 2023-12-04 10:55:18 +04:00
gtk-gl-area.c ui/gtk: set scanout mode in gd_egl/gd_gl_area_scanout_texture 2023-08-07 17:13:42 +04:00
gtk.c ui: use "vc" chardev for dbus, gtk & spice-app 2023-11-21 14:38:14 +04:00
input-barrier.c
input-barrier.h
input-keymap.c
input-legacy.c ui/input: Constify QemuInputHandler structure 2023-10-19 23:13:28 +02:00
input-linux.c ui: replace qemu_set_nonblock() 2022-05-03 15:52:37 +04:00
input.c ui/input: Constify QemuInputHandler structure 2023-10-19 23:13:28 +02:00
kbd-state.c
keymaps.c
keymaps.h ui: spelling fixes 2023-08-31 19:47:43 +02:00
meson.build ui/dbus: do not require PIXMAN 2023-11-07 14:04:25 +04:00
qemu-pixman.c ui: compile out some qemu-pixman functions when !PIXMAN 2023-11-07 14:04:24 +04:00
qemu-x509.h
qemu.desktop
sdl2-2d.c ui: spelling fixes 2023-08-31 19:47:43 +02:00
sdl2-gl.c ui: add optional d3d texture pointer to scanout texture 2023-06-27 17:08:56 +02:00
sdl2-input.c ui/vc: rename kbd_put to qemu_text_console functions 2023-09-12 10:37:02 +04:00
sdl2.c ui/sdl2: use correct key names in win title on mac 2023-11-07 13:08:49 +01:00
shader.c
spice-app.c ui: use "vc" chardev for dbus, gtk & spice-app 2023-11-21 14:38:14 +04:00
spice-core.c migration: simplify notifiers 2023-10-20 08:51:41 +02:00
spice-display.c ui: Clean up local variable shadowing 2023-09-29 08:13:57 +02:00
spice-input.c input: Allow to choose console with qemu_input_is_absolute 2023-10-03 15:04:56 +04:00
spice-module.c
trace-events input: Allow to choose console with qemu_input_is_absolute 2023-10-03 15:04:56 +04:00
trace.h
udmabuf.c Do not include "qemu/error-report.h" in headers that do not need it 2023-02-14 09:11:27 +01:00
ui-hmp-cmds.c qmp/hmp: disable screendump if PIXMAN is missing 2023-11-07 14:04:25 +04:00
ui-qmp-cmds.c ui/qmp-cmds: Improve two error messages 2023-11-17 10:07:52 +01:00
util.c include/hw/pci: Split pci_device.h off pci.h 2023-01-08 01:54:22 -05:00
vdagent.c Migration Pull request (20231020) 2023-10-20 06:46:53 -07:00
vgafont.h ui: fix tab indentation 2022-11-08 10:23:06 +01:00
vnc_keysym.h ui: fix tab indentation 2022-11-08 10:23:06 +01:00
vnc-auth-sasl.c
vnc-auth-sasl.h
vnc-auth-vencrypt.c
vnc-auth-vencrypt.h
vnc-clipboard.c ui/vnc-clipboard: fix inflate_buffer 2023-12-04 11:28:26 +04:00
vnc-enc-hextile-template.h ui/vnc-enc-hextile: Use static rather than dynamic length stack array 2023-09-04 14:57:44 +04:00
vnc-enc-hextile.c Drop useless casts from g_malloc() & friends to pointer 2022-10-22 23:15:40 +02:00
vnc-enc-tight.c ui/vnc-enc-tight: Avoid dynamic stack allocation 2023-09-04 14:57:44 +04:00
vnc-enc-tight.h
vnc-enc-zlib.c
vnc-enc-zrle.c
vnc-enc-zrle.c.inc ui: Clean up local variable shadowing 2023-09-29 08:13:57 +02:00
vnc-enc-zrle.h
vnc-enc-zywrle-template.c ui: fix tab indentation 2022-11-08 10:23:06 +01:00
vnc-enc-zywrle.h ui: spelling fixes 2023-08-31 19:47:43 +02:00
vnc-jobs.c vnc: move assert in vnc_worker_thread_loop 2023-06-10 00:00:24 +03:00
vnc-jobs.h
vnc-palette.c ui: Clean up local variable shadowing 2023-09-29 08:13:57 +02:00
vnc-palette.h
vnc-stubs.c qemu-options: define -vnc only #ifdef CONFIG_VNC 2023-11-07 14:04:25 +04:00
vnc-ws.c bulk: Remove pointless QOM casts 2023-06-05 20:48:34 +02:00
vnc-ws.h
vnc.c ui: reject extended clipboard message if not activated 2024-02-20 18:45:20 +03:00
vnc.h ui/vnc: Require audiodev= to enable audio 2023-10-03 10:29:39 +02:00
win32-kbd-hook.c
x_keymap.c
x_keymap.h