Tighten session ticket handling
authorEmilia Kasper <emilia@openssl.org>
Tue, 28 Oct 2014 16:35:59 +0000 (17:35 +0100)
committerEmilia Kasper <emilia@openssl.org>
Tue, 28 Oct 2014 16:38:23 +0000 (17:38 +0100)
Tighten client-side session ticket handling during renegotiation:
ensure that the client only accepts a session ticket if the server sends
the extension anew in the ServerHello. Previously, a TLS client would
reuse the old extension state and thus accept a session ticket if one was
announced in the initial ServerHello.

Reviewed-by: Bodo Moeller <bodo@openssl.org>
(cherry picked from commit d663df2399d1d9d6015bcfd2ec87b925ea3558a2)

CHANGES
ssl/s3_clnt.c
ssl/ssl_sess.c

diff --git a/CHANGES b/CHANGES
index 5fa9cba9744daa654db3d2690552022f1bcb9f35..caee934085c61982fa53892bf3179c31313f3a48 100644 (file)
--- a/CHANGES
+++ b/CHANGES
      (CVE-2014-3566)
      [Adam Langley, Bodo Moeller]
 
+   *) Tighten client-side session ticket handling during renegotiation:
+      ensure that the client only accepts a session ticket if the server sends
+      the extension anew in the ServerHello. Previously, a TLS client would
+      reuse the old extension state and thus accept a session ticket if one was
+      announced in the initial ServerHello.
+      [Emilia Käsper]
+
   *) Accelerated NIST P-256 elliptic curve implementation for x86_64
      (other platforms pending).
      [Shay Gueron & Vlad Krasnov (Intel Corp), Andy Polyakov]
      X509_CINF_set_modified, X509_CINF_get_issuer, X509_CINF_get_extensions and
      X509_CINF_get_signature were reverted post internal team review.
 
+ Changes between 1.0.1j and 1.0.1k [xx XXX xxxx]
+
+   *) Tighten client-side session ticket handling during renegotiation:
+      ensure that the client only accepts a session ticket if the server sends
+      the extension anew in the ServerHello. Previously, a TLS client would
+      reuse the old extension state and thus accept a session ticket if one was
+      announced in the initial ServerHello.
+      [Emilia Käsper]
+
  Changes between 1.0.1i and 1.0.1j [15 Oct 2014]
 
   *) SRTP Memory Leak.
index 7d526ddac7ef8c62cec03ee535752fa413599f4c..7d7af4b4530078b4dd801ce8f33a84145579773e 100644 (file)
@@ -225,6 +225,14 @@ int ssl3_connect(SSL *s)
                        s->renegotiate=1;
                        s->state=SSL_ST_CONNECT;
                        s->ctx->stats.sess_connect_renegotiate++;
+#ifndef OPENSSL_NO_TLSEXT
+                       /*
+                        * If renegotiating, the server may choose to not issue
+                        * a new ticket, so reset the flag. It will be set to
+                        * the right value when parsing ServerHello extensions.
+                        */
+                       s->tlsext_ticket_expected = 0;
+#endif
                        /* break */
                case SSL_ST_BEFORE:
                case SSL_ST_CONNECT:
@@ -2328,7 +2336,7 @@ int ssl3_get_new_session_ticket(SSL *s)
                }
        memcpy(s->session->tlsext_tick, p, ticklen);
        s->session->tlsext_ticklen = ticklen;
-       /* There are two ways to detect a resumed ticket sesion.
+       /* There are two ways to detect a resumed ticket session.
         * One is to set an appropriate session ID and then the server
         * must return a match in ServerHello. This allows the normal
         * client session ID matching to work and we know much 
index 73d87fd6c1a3c3088606370d04e04d1473b2fb62..3f9bad10a4d3769df4b6bb7eacfcdef45ed355db 100644 (file)
@@ -340,7 +340,21 @@ int ssl_get_new_session(SSL *s, int session)
                        return(0);
                        }
 #ifndef OPENSSL_NO_TLSEXT
-               /* If RFC4507 ticket use empty session ID */
+               /*
+                * If RFC5077 ticket, use empty session ID (as server).
+                * Note that:
+                * (a) ssl_get_prev_session() does lookahead into the
+                *     ClientHello extensions to find the session ticket.
+                *     When ssl_get_prev_session() fails, s3_srvr.c calls
+                *     ssl_get_new_session() in ssl3_get_client_hello().
+                *     At that point, it has not yet parsed the extensions,
+                *     however, because of the lookahead, it already knows
+                *     whether a ticket is expected or not.
+                *
+                * (b) s3_clnt.c calls ssl_get_new_session() before parsing
+                *     ServerHello extensions, and before recording the session
+                *     ID received from the server, so this block is a noop.
+                */
                if (s->tlsext_ticket_expected)
                        {
                        ss->session_id_length = 0;