From: Manuel Nickschas Date: Tue, 21 Oct 2014 19:20:07 +0000 (+0200) Subject: Check for invalid input in encrypted buffers X-Git-Tag: 0.12-beta1~57 X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=commitdiff_plain;h=8b5ecd226f9208af3074b33d3b7cf5e14f55b138;hp=d6888a62baaa3cbb5fcf461aafa1fbf5197c4f49 Check for invalid input in encrypted buffers The ECB Blowfish decryption function assumed that encrypted input would always come in blocks of 12 characters, as specified. However, buggy clients or annoying people may not adhere to that assumption, causing the core to crash while trying to process the invalid base64 input. With this commit we make sure that we're not overstepping the bounds of the input string while decoding it; instead we bail out early and display the original input. Fixes #1314. Thanks to Tucos for finding that one! --- diff --git a/src/core/cipher.cpp b/src/core/cipher.cpp index 7cc75d0a..7d1fe46a 100644 --- a/src/core/cipher.cpp +++ b/src/core/cipher.cpp @@ -364,6 +364,10 @@ QByteArray Cipher::blowfishECB(QByteArray cipherText, bool direction) } else { + // ECB Blowfish encodes in blocks of 12 chars, so anything else is malformed input + if ((temp.length() % 12) != 0) + return cipherText; + temp = b64ToByte(temp); while ((temp.length() % 8) != 0) temp.append('\0'); } @@ -376,8 +380,13 @@ QByteArray Cipher::blowfishECB(QByteArray cipherText, bool direction) if (!cipher.ok()) return cipherText; - if (direction) + if (direction) { + // Sanity check + if ((temp2.length() % 8) != 0) + return cipherText; + temp2 = byteToB64(temp2); + } return temp2; }