Do not resume a session if the negotiated protocol version does not match

the session's version (server).

See also BoringSSL's commit bdf5e72f50e25f0e45e825c156168766d8442dde.

Reviewed-by: Dr. Stephen Henson <steve@openssl.org>
(cherry picked from commit 9e189b9dc1)
This commit is contained in:
David Benjamin 2014-11-20 16:22:40 +01:00 committed by Emilia Kasper
parent 249a3e362f
commit 7fc5f4f117
2 changed files with 16 additions and 1 deletions

View File

@ -4,6 +4,12 @@
Changes between 1.0.1j and 1.0.1k [xx XXX xxxx] Changes between 1.0.1j and 1.0.1k [xx XXX xxxx]
*) Do not resume sessions on the server if the negotiated protocol
version does not match the session's version. Resuming with a different
version, while not strictly forbidden by the RFC, is of questionable
sanity and breaks all known clients.
[David Benjamin, Emilia Käsper]
*) Tighten handling of the ChangeCipherSpec (CCS) message: reject *) Tighten handling of the ChangeCipherSpec (CCS) message: reject
early CCS messages during renegotiation. (Note that because early CCS messages during renegotiation. (Note that because
renegotiation is encrypted, this early CCS was not exploitable.) renegotiation is encrypted, this early CCS was not exploitable.)

View File

@ -1051,7 +1051,16 @@ int ssl3_get_client_hello(SSL *s)
else else
{ {
i=ssl_get_prev_session(s, p, j, d + n); i=ssl_get_prev_session(s, p, j, d + n);
if (i == 1) /*
* Only resume if the session's version matches the negotiated
* version.
* RFC 5246 does not provide much useful advice on resumption
* with a different protocol version. It doesn't forbid it but
* the sanity of such behaviour would be questionable.
* In practice, clients do not accept a version mismatch and
* will abort the handshake with an error.
*/
if (i == 1 && s->version == s->session->ssl_version)
{ /* previous session */ { /* previous session */
s->hit=1; s->hit=1;
} }