Skip to content

Commit

Permalink
ui: enforce TLS when using websockets server
Browse files Browse the repository at this point in the history
When TLS is required, the primary VNC server considers it to be
mandatory. ie the server admin decides whether or not TLS is used,
and the client has to comply with this decision. The websockets
server, however, treated it as optional, allowing non-TLS clients
to connect to a server which had setup TLS. Thus enabling websockets
lowers the security of the VNC server leaving the admin no way to
enforce use of TLS.

This removes the code that allows non-TLS fallback in the websockets
server, so that if TLS is requested for VNC it is now mandatory for
both the primary VNC server and the websockets VNC server.

Signed-off-by: Daniel P. Berrange <[email protected]>
Signed-off-by: Gerd Hoffmann <[email protected]>
  • Loading branch information
berrange authored and kraxel committed Mar 18, 2015
1 parent f9148c8 commit 51941e4
Show file tree
Hide file tree
Showing 3 changed files with 9 additions and 26 deletions.
31 changes: 7 additions & 24 deletions ui/vnc-ws.c
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,6 @@
#ifdef CONFIG_VNC_TLS
#include "qemu/sockets.h"

static void vncws_tls_handshake_io(void *opaque);

static int vncws_start_tls_handshake(struct VncState *vs)
{
int ret = gnutls_handshake(vs->ws_tls.session);
Expand Down Expand Up @@ -53,33 +51,18 @@ static int vncws_start_tls_handshake(struct VncState *vs)
return 0;
}

static void vncws_tls_handshake_io(void *opaque)
void vncws_tls_handshake_io(void *opaque)
{
struct VncState *vs = (struct VncState *)opaque;

VNC_DEBUG("Handshake IO continue\n");
vncws_start_tls_handshake(vs);
}

void vncws_tls_handshake_peek(void *opaque)
{
VncState *vs = opaque;
long ret;

if (!vs->ws_tls.session) {
char peek[4];
ret = qemu_recv(vs->csock, peek, sizeof(peek), MSG_PEEK);
if (ret && (strncmp(peek, "\x16", 1) == 0
|| strncmp(peek, "\x80", 1) == 0)) {
VNC_DEBUG("TLS Websocket connection recognized");
vnc_tls_client_setup(vs, 1);
vncws_start_tls_handshake(vs);
} else {
vncws_handshake_read(vs);
if (!vs->tls.session) {
VNC_DEBUG("TLS Websocket setup\n");
if (vnc_tls_client_setup(vs, vs->vd->tls.x509cert != NULL) < 0) {
return;
}
} else {
qemu_set_fd_handler2(vs->csock, NULL, vncws_handshake_read, NULL, vs);
}
VNC_DEBUG("Handshake IO continue\n");
vncws_start_tls_handshake(vs);
}
#endif /* CONFIG_VNC_TLS */

Expand Down
2 changes: 1 addition & 1 deletion ui/vnc-ws.h
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ enum {
};

#ifdef CONFIG_VNC_TLS
void vncws_tls_handshake_peek(void *opaque);
void vncws_tls_handshake_io(void *opaque);
#endif /* CONFIG_VNC_TLS */
void vncws_handshake_read(void *opaque);
long vnc_client_write_ws(VncState *vs);
Expand Down
2 changes: 1 addition & 1 deletion ui/vnc.c
Original file line number Diff line number Diff line change
Expand Up @@ -3036,7 +3036,7 @@ static void vnc_connect(VncDisplay *vd, int csock,
vs->websocket = 1;
#ifdef CONFIG_VNC_TLS
if (vd->ws_tls) {
qemu_set_fd_handler2(vs->csock, NULL, vncws_tls_handshake_peek,
qemu_set_fd_handler2(vs->csock, NULL, vncws_tls_handshake_io,
NULL, vs);
} else
#endif /* CONFIG_VNC_TLS */
Expand Down

0 comments on commit 51941e4

Please sign in to comment.