Fix DTLS anonymous EC(DH) denial of service
authorEmilia Käsper <emilia@openssl.org>
Thu, 24 Jul 2014 20:15:29 +0000 (22:15 +0200)
committerMatt Caswell <matt@openssl.org>
Wed, 6 Aug 2014 21:02:00 +0000 (22:02 +0100)
CVE-2014-3510

Reviewed-by: Dr. Stephen Henson <steve@openssl.org>
ssl/d1_clnt.c
ssl/s3_clnt.c

index ac24bfb35ed82d2f7883c2b75bdaca03221a854e..58a3b469940b8b9c015ea43f8cd23ea5ed2b4a63 100644 (file)
@@ -796,6 +796,13 @@ int dtls1_send_client_key_exchange(SSL *s)
                        RSA *rsa;
                        unsigned char tmp_buf[SSL_MAX_MASTER_KEY_LENGTH];
 
+                       if (s->session->sess_cert == NULL)
+                               {
+                               /* We should always have a server certificate with SSL_kRSA. */
+                               SSLerr(SSL_F_DTLS1_SEND_CLIENT_KEY_EXCHANGE,ERR_R_INTERNAL_ERROR);
+                               goto err;
+                               }
+
                        if (s->session->sess_cert->peer_rsa_tmp != NULL)
                                rsa=s->session->sess_cert->peer_rsa_tmp;
                        else
@@ -986,6 +993,13 @@ int dtls1_send_client_key_exchange(SSL *s)
                        {
                        DH *dh_srvr,*dh_clnt;
 
+                       if (s->session->sess_cert == NULL)
+                               {
+                               ssl3_send_alert(s,SSL3_AL_FATAL,SSL_AD_UNEXPECTED_MESSAGE);
+                               SSLerr(SSL_F_DTLS1_SEND_CLIENT_KEY_EXCHANGE,SSL_R_UNEXPECTED_MESSAGE);
+                               goto err;
+                               }
+
                        if (s->session->sess_cert->peer_dh_tmp != NULL)
                                dh_srvr=s->session->sess_cert->peer_dh_tmp;
                        else
@@ -1226,5 +1240,3 @@ int dtls1_send_client_certificate(SSL *s)
        /* SSL3_ST_CW_CERT_D */
        return(dtls1_do_write(s,SSL3_RT_HANDSHAKE));
        }
-
-
index 4b41a2be9df8449e36f484d54009b003367cb04f..c11048edaa680e47a1d4a9897763a66f55c35b05 100644 (file)
@@ -1916,6 +1916,13 @@ int ssl3_send_client_key_exchange(SSL *s)
                        RSA *rsa;
                        unsigned char tmp_buf[SSL_MAX_MASTER_KEY_LENGTH];
 
+                       if (s->session->sess_cert == NULL)
+                               {
+                               /* We should always have a server certificate with SSL_kRSA. */
+                               SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,ERR_R_INTERNAL_ERROR);
+                               goto err;
+                               }
+
                        if (s->session->sess_cert->peer_rsa_tmp != NULL)
                                rsa=s->session->sess_cert->peer_rsa_tmp;
                        else