]> git.ipfire.org Git - thirdparty/openssl.git/commitdiff
Fix ssl_get_prev_session overrun
authorMatt Caswell <matt@openssl.org>
Fri, 10 Apr 2015 15:49:33 +0000 (16:49 +0100)
committerMatt Caswell <matt@openssl.org>
Tue, 14 Apr 2015 14:02:44 +0000 (15:02 +0100)
If OpenSSL is configured with no-tlsext then ssl_get_prev_session can read
past the end of the ClientHello message if the session_id length in the
ClientHello is invalid. This should not cause any security issues since the
underlying buffer is 16k in size. It should never be possible to overrun by
that many bytes.

This is probably made redundant by the previous commit - but you can never be
too careful.

With thanks to Qinghao Tang for reporting this issue.

Reviewed-by: Rich Salz <rsalz@openssl.org>
(cherry picked from commit 5e0a80c1c9b2b06c2d203ad89778ce1b98e0b5ad)

Conflicts:
ssl/ssl_sess.c

ssl/ssl_sess.c

index 9c797e3ed60650c50bb5e3bd9b6eff491812a2c6..fc312968f83dedf0ba994fe631aac89272891d34 100644 (file)
@@ -310,6 +310,12 @@ int ssl_get_prev_session(SSL *s, unsigned char *session_id, int len,
 
     if (len > SSL_MAX_SSL_SESSION_ID_LENGTH)
         goto err;
 
     if (len > SSL_MAX_SSL_SESSION_ID_LENGTH)
         goto err;
+
+    if (session_id + len > limit) {
+        fatal = 1;
+        goto err;
+    }
+
 #ifndef OPENSSL_NO_TLSEXT
     r = tls1_process_ticket(s, session_id, len, limit, &ret);
     if (r == -1) {
 #ifndef OPENSSL_NO_TLSEXT
     r = tls1_process_ticket(s, session_id, len, limit, &ret);
     if (r == -1) {