summaryrefslogtreecommitdiff
path: root/ui/vnc.h
diff options
context:
space:
mode:
authorDaniel P. Berrange <berrange@redhat.com>2015-03-23 22:58:21 +0000
committerGerd Hoffmann <kraxel@redhat.com>2015-04-01 17:11:34 +0200
commita2bebfd6e09d285aa793cae3fb0fc3a39a9fee6e (patch)
tree50dd263e322551021e69347f95dfb0aef5a0a2ac /ui/vnc.h
parentb8a86c4ac4d04c106ba38fbd707041cba334a155 (diff)
downloadqemu-a2bebfd6e09d285aa793cae3fb0fc3a39a9fee6e.tar.gz
CVE-2015-1779: incrementally decode websocket frames
The logic for decoding websocket frames wants to fully decode the frame header and payload, before allowing the VNC server to see any of the payload data. There is no size limit on websocket payloads, so this allows a malicious network client to consume 2^64 bytes in memory in QEMU. It can trigger this denial of service before the VNC server even performs any authentication. The fix is to decode the header, and then incrementally decode the payload data as it is needed. With this fix the websocket decoder will allow at most 4k of data to be buffered before decoding and processing payload. Signed-off-by: Daniel P. Berrange <berrange@redhat.com> [ kraxel: fix frequent spurious disconnects, suggested by Peter Maydell ] @@ -361,7 +361,7 @@ int vncws_decode_frame_payload(Buffer *input, - *payload_size = input->offset; + *payload_size = *payload_remain; [ kraxel: fix 32bit build ] @@ -306,7 +306,7 @@ struct VncState - uint64_t ws_payload_remain; + size_t ws_payload_remain; Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
Diffstat (limited to 'ui/vnc.h')
-rw-r--r--ui/vnc.h2
1 files changed, 2 insertions, 0 deletions
diff --git a/ui/vnc.h b/ui/vnc.h
index e19ac396f2..3f7c6a9bc6 100644
--- a/ui/vnc.h
+++ b/ui/vnc.h
@@ -306,6 +306,8 @@ struct VncState
#ifdef CONFIG_VNC_WS
Buffer ws_input;
Buffer ws_output;
+ size_t ws_payload_remain;
+ WsMask ws_payload_mask;
#endif
/* current output mode information */
VncWritePixels *write_pixels;