diff options
author | Matt Caswell <matt@openssl.org> | 2016-09-09 10:08:45 +0100 |
---|---|---|
committer | Matt Caswell <matt@openssl.org> | 2016-09-22 09:27:45 +0100 |
commit | e408c09bbf7c3057bda4b8d20bec1b3a7771c15b (patch) | |
tree | f1841a085ec97722ae1ad0d5014739bcd6c14fea /ssl/t1_lib.c | |
parent | a449b47c7d8e20efc8cc524ed695a060b11ef889 (diff) | |
download | openssl-e408c09bbf7c3057bda4b8d20bec1b3a7771c15b.tar.gz |
Fix OCSP Status Request extension unbounded memory growth
A malicious client can send an excessively large OCSP Status Request
extension. If that client continually requests renegotiation,
sending a large OCSP Status Request extension each time, then there will
be unbounded memory growth on the server. This will eventually lead to a
Denial Of Service attack through memory exhaustion. Servers with a
default configuration are vulnerable even if they do not support OCSP.
Builds using the "no-ocsp" build time option are not affected.
I have also checked other extensions to see if they suffer from a similar
problem but I could not find any other issues.
CVE-2016-6304
Issue reported by Shi Lei.
Reviewed-by: Rich Salz <rsalz@openssl.org>
Diffstat (limited to 'ssl/t1_lib.c')
-rw-r--r-- | ssl/t1_lib.c | 23 |
1 files changed, 16 insertions, 7 deletions
diff --git a/ssl/t1_lib.c b/ssl/t1_lib.c index 035353c330..d7ccea260d 100644 --- a/ssl/t1_lib.c +++ b/ssl/t1_lib.c @@ -2019,6 +2019,22 @@ static int ssl_scan_clienthello_tlsext(SSL *s, PACKET *pkt, int *al) (&extension, &responder_id_list)) return 0; + /* + * We remove any OCSP_RESPIDs from a previous handshake + * to prevent unbounded memory growth - CVE-2016-6304 + */ + sk_OCSP_RESPID_pop_free(s->tlsext_ocsp_ids, + OCSP_RESPID_free); + if (PACKET_remaining(&responder_id_list) > 0) { + s->tlsext_ocsp_ids = sk_OCSP_RESPID_new_null(); + if (s->tlsext_ocsp_ids == NULL) { + *al = SSL_AD_INTERNAL_ERROR; + return 0; + } + } else { + s->tlsext_ocsp_ids = NULL; + } + while (PACKET_remaining(&responder_id_list) > 0) { OCSP_RESPID *id; PACKET responder_id; @@ -2030,13 +2046,6 @@ static int ssl_scan_clienthello_tlsext(SSL *s, PACKET *pkt, int *al) return 0; } - if (s->tlsext_ocsp_ids == NULL - && (s->tlsext_ocsp_ids = - sk_OCSP_RESPID_new_null()) == NULL) { - *al = SSL_AD_INTERNAL_ERROR; - return 0; - } - id_data = PACKET_data(&responder_id); id = d2i_OCSP_RESPID(NULL, &id_data, PACKET_remaining(&responder_id)); |