]> source.dussan.org Git - tigervnc.git/commitdiff
Limit max username/password size in SSecurityPlain. 440/head
authorMichal Srb <michalsrb@gmail.com>
Wed, 29 Mar 2017 14:05:45 +0000 (17:05 +0300)
committerMichal Srb <michalsrb@gmail.com>
Thu, 30 Mar 2017 00:25:04 +0000 (03:25 +0300)
Setting the limit to 1024 which should be still more than enough.

Unlimited ulen and plen can cause various security problems:
  * Overflow in `is->checkNoWait(ulen + plen)` causing it to contine when there is not enough data and then wait forever.
  * Overflow in `new char[plen + 1]` that would allocate zero sized array which succeeds but returns pointer that should not be written into.
  * Allocation failure in `new char[plen + 1]` from trying to allocate too much and crashing the whole server.

All those issues can be triggered by a client before authentication.

common/rfb/SSecurityPlain.cxx
common/rfb/SSecurityPlain.h

index 05315490b9e15c77affbec041d27e43e3b5256df..fc9dff23eab8b95546f97671ff8359bdf8f1b2e0 100644 (file)
@@ -86,8 +86,15 @@ bool SSecurityPlain::processMsg(SConnection* sc)
   if (state == 0) {
     if (!is->checkNoWait(8))
       return false;
+
     ulen = is->readU32();
+    if (ulen > MaxSaneUsernameLength)
+      throw AuthFailureException("Too long username");
+
     plen = is->readU32();
+    if (plen > MaxSanePasswordLength)
+      throw AuthFailureException("Too long password");
+
     state = 1;
   }
 
index 080fcd598f631b1714175c3233c2d420d34ce86c..2c08c24e6566e5844d7aca64f2da5f4a57439378 100644 (file)
@@ -54,6 +54,9 @@ namespace rfb {
     PasswordValidator* valid;
     unsigned int ulen, plen, state;
     CharArray username;
+
+    static const unsigned int MaxSaneUsernameLength = 1024;
+    static const unsigned int MaxSanePasswordLength = 1024;
   };
 
 }