Countermeasure against "triple handshake" attack

This commit is contained in:
Manuel Pégourié-Gonnard 2014-03-10 09:34:49 +01:00 committed by Paul Bakker
parent 397858b81d
commit 963918b88f
2 changed files with 29 additions and 0 deletions

View File

@ -4,6 +4,11 @@ PolarSSL ChangeLog
Changes Changes
* Introduced POLARSSL_HAVE_READDIR_R for systems without it * Introduced POLARSSL_HAVE_READDIR_R for systems without it
Security
* Forbid change of server certificate during renegotiation to prevent
"triple handshake" attack when authentication mode is optional (the
attack was already impossible when authentication is required).
Bugfix Bugfix
* Fixed X.509 hostname comparison (with non-regular characters) * Fixed X.509 hostname comparison (with non-regular characters)
* SSL now gracefully handles missing RNG * SSL now gracefully handles missing RNG

View File

@ -2402,6 +2402,30 @@ int ssl_parse_certificate( ssl_context *ssl )
SSL_DEBUG_CRT( 3, "peer certificate", ssl->session_negotiate->peer_cert ); SSL_DEBUG_CRT( 3, "peer certificate", ssl->session_negotiate->peer_cert );
/*
* On client, make sure the server cert doesn't change during renego to
* avoid "triple handshake" attack: https://secure-resumption.com/
*/
if( ssl->endpoint == SSL_IS_CLIENT &&
ssl->renegotiation == SSL_RENEGOTIATION )
{
if( ssl->session->peer_cert == NULL )
{
SSL_DEBUG_MSG( 1, ( "new server cert during renegotiation" ) );
return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE );
}
if( ssl->session->peer_cert->raw.len !=
ssl->session_negotiate->peer_cert->raw.len ||
memcmp( ssl->session->peer_cert->raw.p,
ssl->session_negotiate->peer_cert->raw.p,
ssl->session->peer_cert->raw.len ) != 0 )
{
SSL_DEBUG_MSG( 1, ( "server cert changed during renegotiation" ) );
return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE );
}
}
if( ssl->authmode != SSL_VERIFY_NONE ) if( ssl->authmode != SSL_VERIFY_NONE )
{ {
if( ssl->ca_chain == NULL ) if( ssl->ca_chain == NULL )