Check the message type requested is the type received in DTLS
authorMatt Caswell <matt@openssl.org>
Fri, 29 May 2015 16:05:01 +0000 (17:05 +0100)
committerMatt Caswell <matt@openssl.org>
Sun, 31 May 2015 23:30:56 +0000 (00:30 +0100)
dtls1_get_message has an |mt| variable which is the type of the message that
is being requested. If it is negative then any message type is allowed.
However the value of |mt| is not checked in one of the main code paths, so a
peer can send a message of a completely different type and it will be
processed as if it was the message type that we were expecting. This has
very little practical consequences because the current behaviour will still
fail when the format of the message isn't as expected.

Reviewed-by: Andy Polyakov <appro@openssl.org>
(cherry picked from commit 8c2b1d872b25f3ec78e04f5cd2de8f21e853c4a6)

ssl/d1_both.c

index ae8239a2eff09d24be488336bae1cf5eb71a7163..ffd4784a26195a2ad7b4f1aaa8e53452b7b521cd 100644 (file)
@@ -489,6 +489,12 @@ long dtls1_get_message(SSL *s, int st1, int stn, int mt, long max, int *ok)
         return i;
     }
 
+    if (mt >= 0 && s->s3->tmp.message_type != mt) {
+        al = SSL_AD_UNEXPECTED_MESSAGE;
+        SSLerr(SSL_F_DTLS1_GET_MESSAGE, SSL_R_UNEXPECTED_MESSAGE);
+        goto f_err;
+    }
+
     p = (unsigned char *)s->init_buf->data;
     msg_len = msg_hdr->msg_len;