Add FreeBSD-SA-21:07.openssl.
Approved by: so
This commit is contained in:
parent
b002508ba5
commit
98ec8b7512
6 changed files with 1138 additions and 0 deletions
website
data/security
static/security
advisories
patches/SA-21:07
|
@ -1,6 +1,10 @@
|
|||
# Sort advisories by year, month and day
|
||||
# $FreeBSD$
|
||||
|
||||
[[advisories]]
|
||||
name = "FreeBSD-SA-21:07.openssl"
|
||||
date = "2021-03-25"
|
||||
|
||||
[[advisories]]
|
||||
name = "FreeBSD-SA-21:06.xen"
|
||||
date = "2021-02-24"
|
||||
|
|
170
website/static/security/advisories/FreeBSD-SA-21:07.openssl.asc
Normal file
170
website/static/security/advisories/FreeBSD-SA-21:07.openssl.asc
Normal file
|
@ -0,0 +1,170 @@
|
|||
-----BEGIN PGP SIGNED MESSAGE-----
|
||||
Hash: SHA512
|
||||
|
||||
=============================================================================
|
||||
FreeBSD-SA-21:07.openssl Security Advisory
|
||||
The FreeBSD Project
|
||||
|
||||
Topic: Multiple vulnerabilities in OpenSSL
|
||||
|
||||
Category: contrib
|
||||
Module: openssl
|
||||
Announced: 2021-03-25
|
||||
Affects: FreeBSD 12.2 and later
|
||||
Corrected: 2021-03-25 15:45:19 UTC (stable/13, 13.0-STABLE)
|
||||
2021-03-25 16:25:06 UTC (releng/13.0, 13.0-RC3-p1)
|
||||
2021-03-25 17:14:46 UTC (stable/12, 12.2-STABLE)
|
||||
2021-03-25 23:45:45 UTC (releng/12.2, 12.2-RELEASE-p5)
|
||||
CVE Name: CVE-2021-3449, CVE-2021-3450
|
||||
|
||||
For general information regarding FreeBSD Security Advisories,
|
||||
including descriptions of the fields above, security branches, and the
|
||||
following sections, please visit <URL:https://security.FreeBSD.org/>.
|
||||
|
||||
I. Background
|
||||
|
||||
FreeBSD includes software from the OpenSSL Project. The OpenSSL Project is a
|
||||
collaborative effort to develop a robust, commercial-grade, full-featured
|
||||
Open Source toolkit for the Transport Layer Security (TLS) protocol. It is
|
||||
also a general-purpose cryptography library.
|
||||
|
||||
II. Problem Description
|
||||
|
||||
This advisory covers two distinct OpenSSL issues:
|
||||
|
||||
The X509_V_FLAG_X509_STRICT flag enables additional security checks of the
|
||||
certificates present in a certificate chain. It is not set by default.
|
||||
Starting from OpenSSL version 1.1.1h a check to disallow certificates in the
|
||||
chain that have explicitly encoded elliptic curve parameters was added as an
|
||||
additional strict check. An error in the implementation of this check meant
|
||||
that the result of a previous check to confirm that certificates in the chain
|
||||
are valid CA certificates was overwritten. This effectively bypasses the
|
||||
check that non-CA certificates must not be able to issue other certificates.
|
||||
[CVE-2021-3450]
|
||||
|
||||
A TLSv1.2 renegotiation ClientHello message sent to a TLS server that omits
|
||||
the signature_algorithms extension (where it was present in the initial
|
||||
ClientHello), but includes a signature_algorithms_cert extension results in a
|
||||
NULL pointer dereference in the server. [CVE-2021-3449]
|
||||
|
||||
III. Impact
|
||||
|
||||
The X509_V_FLAG_X509_STRICT issue can result in a bypass of the check that
|
||||
non-CA certificates must not be able to issue other certificates.
|
||||
|
||||
The renegotiation issue can result in a crash and a denial of service attack.
|
||||
|
||||
IV. Workaround
|
||||
|
||||
For the X509_V_FLAG_X509_STRICT issue, no workaround is available, but
|
||||
software that doesn't explicitly set the X509_V_FLAG_X509_STRICT flag is
|
||||
unaffected.
|
||||
|
||||
For the renegotiation issue, either turning off TLSv1.2 (as TLSv1.3 is
|
||||
unaffected) or turning off renegotiation on the TLS server mitigates the
|
||||
issue.
|
||||
|
||||
V. Solution
|
||||
|
||||
Upgrade your vulnerable system to a supported FreeBSD stable or
|
||||
release / security branch (releng) dated after the correction date.
|
||||
|
||||
Perform one of the following:
|
||||
|
||||
1) To update your vulnerable system via a binary patch:
|
||||
|
||||
Systems running a RELEASE version of FreeBSD on the i386 or amd64
|
||||
platforms can be updated via the freebsd-update(8) utility:
|
||||
|
||||
# freebsd-update fetch
|
||||
# freebsd-update install
|
||||
# <restart any daemons that use the library>
|
||||
|
||||
2) To update your vulnerable system via a source code patch:
|
||||
|
||||
The following patches have been verified to apply to the applicable
|
||||
FreeBSD release branches.
|
||||
|
||||
a) Download the relevant patch from the location below, and verify the
|
||||
detached PGP signature using your PGP utility.
|
||||
|
||||
[FreeBSD 13.x]
|
||||
# fetch https://security.FreeBSD.org/patches/SA-21:07/openssl-13.patch
|
||||
# fetch https://security.FreeBSD.org/patches/SA-21:07/openssl-13.patch.asc
|
||||
# gpg --verify openssl-13.patch.asc
|
||||
|
||||
[FreeBSD 12.x]
|
||||
# fetch https://security.FreeBSD.org/patches/SA-21:07/openssl-12.patch
|
||||
# fetch https://security.FreeBSD.org/patches/SA-21:07/openssl-12.patch.asc
|
||||
# gpg --verify openssl-12.patch.asc
|
||||
|
||||
b) Apply the patch. Execute the following commands as root:
|
||||
|
||||
# cd /usr/src
|
||||
# patch < /path/to/patch
|
||||
|
||||
c) Recompile the operating system using buildworld and installworld as
|
||||
described in <URL:https://www.FreeBSD.org/handbook/makeworld.html>.
|
||||
|
||||
Restart all daemons that use the library, or reboot the system.
|
||||
|
||||
VI. Correction details
|
||||
|
||||
The following list contains the correction revision numbers for each
|
||||
affected branch.
|
||||
|
||||
Branch/path Revision
|
||||
- -------------------------------------------------------------------------
|
||||
stable/13/ b6c1fdcdf5033d20c61cc77d66f58f31cc65e2ba
|
||||
releng/13.0/ 7d3f5a19f455e0e3fb17ac3f9af288e8c7fffc15
|
||||
stable/12/ r369521
|
||||
releng/12.2/ r369523
|
||||
- -------------------------------------------------------------------------
|
||||
|
||||
[FreeBSD 13.x]
|
||||
To see which files were modified by a particular revision, run the following
|
||||
command in a checked out git repository, replacing NNNNNN with the revision
|
||||
hash:
|
||||
|
||||
# git show --stat NNNNNN
|
||||
|
||||
Or visit the following URL, replace NNNNNN with the revision hash:
|
||||
|
||||
<URL:https://cgit.freebsd.org/src/commit/?id=NNNNNN>
|
||||
|
||||
[FreeBSD 12.x]
|
||||
To see which files were modified by a particular revision, run the
|
||||
following command, replacing NNNNNN with the revision number, on a
|
||||
machine with Subversion installed:
|
||||
|
||||
# svn diff -cNNNNNN --summarize svn://svn.freebsd.org/base
|
||||
|
||||
Or visit the following URL, replacing NNNNNN with the revision number:
|
||||
|
||||
<URL:https://svnweb.freebsd.org/base?view=revision&revision=NNNNNN>
|
||||
|
||||
VII. References
|
||||
|
||||
<URL:https://www.openssl.org/news/secadv/20210325.txt>
|
||||
|
||||
<URL:https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-3449>
|
||||
<URL:https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-3450>
|
||||
|
||||
The latest revision of this advisory is available at
|
||||
<URL:https://security.FreeBSD.org/advisories/FreeBSD-SA-21:07.openssl.asc>
|
||||
-----BEGIN PGP SIGNATURE-----
|
||||
|
||||
iQIzBAEBCgAdFiEE/A6HiuWv54gCjWNV05eS9J6n5cIFAmBdIi4ACgkQ05eS9J6n
|
||||
5cJ3lRAAgeIfMDB04FRSVkOr4/GL5hAHwUmTfxJU2oPFJMELYD3NbVJR51fsXuuV
|
||||
bHf1X9xq9jlYLyoLNpG89g1/jVYBPikZl3BraIm8/Rxp3/PeYEbkJKoaVaqdV8Lg
|
||||
fQURad6z3cFSFTiZXuDaSvcXzuT5X/0U+UFncSsQJ2oF6YqWtAQzilTyti7mWxDR
|
||||
/j0pS10GDmiEbHI/XVt683rNPhlzvha+npzpLhY+PFUQ4gwUQJrJVwoYHbPYEV2M
|
||||
KngxHQ/P1u3jBnAtreEbfCEOfQYmhj7mNPMUl4KWRTvPsczTVohx4X96zi+rXgBw
|
||||
RqNntzhLsRYsKGP4xgRmuIQjNA+udctCjrz1vDioZkG8YOYBWK9ygr7OwEyRWYar
|
||||
65kykuQhKmqGqCx+r/rw7WzxwkJH+9fNKkQ+27mv7ibfqS8yD+CfELb+7aepuxGj
|
||||
r8o2wLk+hfWttCV2fN3GIPhYAoU3UlvNWIMvxJXP8KL9Hf5JCte2ePKzVFLoYsQK
|
||||
rdizxBhgngbWEISghZdmm2Qx4vG714z2bkmOjRn3muvZ5B2o9xP45Auj7nA3hZN1
|
||||
ET3jSWJHWutZds5wWlHfL7m4xr39D6BR/+6F1cmgmKr5O5YNSGWYEIqnh2G65KrM
|
||||
ULNSgrlOfDr4oodovCXeRxXOplINMFNU4b4OpgyIQNvGysyLle0=
|
||||
=+CMP
|
||||
-----END PGP SIGNATURE-----
|
281
website/static/security/patches/SA-21:07/openssl-12.patch
Normal file
281
website/static/security/patches/SA-21:07/openssl-12.patch
Normal file
|
@ -0,0 +1,281 @@
|
|||
--- crypto/openssl/crypto/x509/x509_vfy.c.orig
|
||||
+++ crypto/openssl/crypto/x509/x509_vfy.c
|
||||
@@ -526,15 +526,19 @@
|
||||
ret = 1;
|
||||
break;
|
||||
}
|
||||
- if ((ctx->param->flags & X509_V_FLAG_X509_STRICT) && num > 1) {
|
||||
+ if (ret > 0
|
||||
+ && (ctx->param->flags & X509_V_FLAG_X509_STRICT) && num > 1) {
|
||||
/* Check for presence of explicit elliptic curve parameters */
|
||||
ret = check_curve(x);
|
||||
- if (ret < 0)
|
||||
+ if (ret < 0) {
|
||||
ctx->error = X509_V_ERR_UNSPECIFIED;
|
||||
- else if (ret == 0)
|
||||
+ ret = 0;
|
||||
+ } else if (ret == 0) {
|
||||
ctx->error = X509_V_ERR_EC_KEY_EXPLICIT_PARAMS;
|
||||
+ }
|
||||
}
|
||||
- if ((x->ex_flags & EXFLAG_CA) == 0
|
||||
+ if (ret > 0
|
||||
+ && (x->ex_flags & EXFLAG_CA) == 0
|
||||
&& x->ex_pathlen != -1
|
||||
&& (ctx->param->flags & X509_V_FLAG_X509_STRICT)) {
|
||||
ctx->error = X509_V_ERR_INVALID_EXTENSION;
|
||||
--- crypto/openssl/ssl/s3_lib.c.orig
|
||||
+++ crypto/openssl/ssl/s3_lib.c
|
||||
@@ -4638,6 +4638,7 @@
|
||||
|
||||
OPENSSL_clear_free(s->s3->tmp.psk, psklen);
|
||||
s->s3->tmp.psk = NULL;
|
||||
+ s->s3->tmp.psklen = 0;
|
||||
if (!s->method->ssl3_enc->generate_master_secret(s,
|
||||
s->session->master_key, pskpms, pskpmslen,
|
||||
&s->session->master_key_length)) {
|
||||
@@ -4667,8 +4668,10 @@
|
||||
else
|
||||
OPENSSL_cleanse(pms, pmslen);
|
||||
}
|
||||
- if (s->server == 0)
|
||||
+ if (s->server == 0) {
|
||||
s->s3->tmp.pms = NULL;
|
||||
+ s->s3->tmp.pmslen = 0;
|
||||
+ }
|
||||
return ret;
|
||||
}
|
||||
|
||||
--- crypto/openssl/ssl/ssl_lib.c.orig
|
||||
+++ crypto/openssl/ssl/ssl_lib.c
|
||||
@@ -779,8 +779,10 @@
|
||||
s->ext.ecpointformats =
|
||||
OPENSSL_memdup(ctx->ext.ecpointformats,
|
||||
ctx->ext.ecpointformats_len);
|
||||
- if (!s->ext.ecpointformats)
|
||||
+ if (!s->ext.ecpointformats) {
|
||||
+ s->ext.ecpointformats_len = 0;
|
||||
goto err;
|
||||
+ }
|
||||
s->ext.ecpointformats_len =
|
||||
ctx->ext.ecpointformats_len;
|
||||
}
|
||||
@@ -789,8 +791,10 @@
|
||||
OPENSSL_memdup(ctx->ext.supportedgroups,
|
||||
ctx->ext.supportedgroups_len
|
||||
* sizeof(*ctx->ext.supportedgroups));
|
||||
- if (!s->ext.supportedgroups)
|
||||
+ if (!s->ext.supportedgroups) {
|
||||
+ s->ext.supportedgroups_len = 0;
|
||||
goto err;
|
||||
+ }
|
||||
s->ext.supportedgroups_len = ctx->ext.supportedgroups_len;
|
||||
}
|
||||
#endif
|
||||
@@ -800,8 +804,10 @@
|
||||
|
||||
if (s->ctx->ext.alpn) {
|
||||
s->ext.alpn = OPENSSL_malloc(s->ctx->ext.alpn_len);
|
||||
- if (s->ext.alpn == NULL)
|
||||
+ if (s->ext.alpn == NULL) {
|
||||
+ s->ext.alpn_len = 0;
|
||||
goto err;
|
||||
+ }
|
||||
memcpy(s->ext.alpn, s->ctx->ext.alpn, s->ctx->ext.alpn_len);
|
||||
s->ext.alpn_len = s->ctx->ext.alpn_len;
|
||||
}
|
||||
@@ -2834,6 +2840,7 @@
|
||||
OPENSSL_free(ctx->ext.alpn);
|
||||
ctx->ext.alpn = OPENSSL_memdup(protos, protos_len);
|
||||
if (ctx->ext.alpn == NULL) {
|
||||
+ ctx->ext.alpn_len = 0;
|
||||
SSLerr(SSL_F_SSL_CTX_SET_ALPN_PROTOS, ERR_R_MALLOC_FAILURE);
|
||||
return 1;
|
||||
}
|
||||
@@ -2853,6 +2860,7 @@
|
||||
OPENSSL_free(ssl->ext.alpn);
|
||||
ssl->ext.alpn = OPENSSL_memdup(protos, protos_len);
|
||||
if (ssl->ext.alpn == NULL) {
|
||||
+ ssl->ext.alpn_len = 0;
|
||||
SSLerr(SSL_F_SSL_SET_ALPN_PROTOS, ERR_R_MALLOC_FAILURE);
|
||||
return 1;
|
||||
}
|
||||
--- crypto/openssl/ssl/statem/extensions.c.orig
|
||||
+++ crypto/openssl/ssl/statem/extensions.c
|
||||
@@ -1136,6 +1136,7 @@
|
||||
/* Clear any signature algorithms extension received */
|
||||
OPENSSL_free(s->s3->tmp.peer_sigalgs);
|
||||
s->s3->tmp.peer_sigalgs = NULL;
|
||||
+ s->s3->tmp.peer_sigalgslen = 0;
|
||||
|
||||
return 1;
|
||||
}
|
||||
@@ -1145,6 +1146,7 @@
|
||||
/* Clear any signature algorithms extension received */
|
||||
OPENSSL_free(s->s3->tmp.peer_cert_sigalgs);
|
||||
s->s3->tmp.peer_cert_sigalgs = NULL;
|
||||
+ s->s3->tmp.peer_cert_sigalgslen = 0;
|
||||
|
||||
return 1;
|
||||
}
|
||||
--- crypto/openssl/ssl/statem/extensions_clnt.c.orig
|
||||
+++ crypto/openssl/ssl/statem/extensions_clnt.c
|
||||
@@ -816,6 +816,7 @@
|
||||
OPENSSL_free(s->psksession_id);
|
||||
s->psksession_id = OPENSSL_memdup(id, idlen);
|
||||
if (s->psksession_id == NULL) {
|
||||
+ s->psksession_id_len = 0;
|
||||
SSLfatal(s, SSL_AD_INTERNAL_ERROR,
|
||||
SSL_F_TLS_CONSTRUCT_CTOS_EARLY_DATA, ERR_R_INTERNAL_ERROR);
|
||||
return EXT_RETURN_FAIL;
|
||||
@@ -1375,6 +1376,7 @@
|
||||
OPENSSL_free(s->ext.peer_ecpointformats);
|
||||
s->ext.peer_ecpointformats = OPENSSL_malloc(ecpointformats_len);
|
||||
if (s->ext.peer_ecpointformats == NULL) {
|
||||
+ s->ext.peer_ecpointformats_len = 0;
|
||||
SSLfatal(s, SSL_AD_INTERNAL_ERROR,
|
||||
SSL_F_TLS_PARSE_STOC_EC_PT_FORMATS, ERR_R_INTERNAL_ERROR);
|
||||
return 0;
|
||||
@@ -1492,8 +1494,13 @@
|
||||
s->ext.scts_len = (uint16_t)size;
|
||||
if (size > 0) {
|
||||
s->ext.scts = OPENSSL_malloc(size);
|
||||
- if (s->ext.scts == NULL
|
||||
- || !PACKET_copy_bytes(pkt, s->ext.scts, size)) {
|
||||
+ if (s->ext.scts == NULL) {
|
||||
+ s->ext.scts_len = 0;
|
||||
+ SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PARSE_STOC_SCT,
|
||||
+ ERR_R_MALLOC_FAILURE);
|
||||
+ return 0;
|
||||
+ }
|
||||
+ if (!PACKET_copy_bytes(pkt, s->ext.scts, size)) {
|
||||
SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PARSE_STOC_SCT,
|
||||
ERR_R_INTERNAL_ERROR);
|
||||
return 0;
|
||||
@@ -1592,6 +1599,7 @@
|
||||
OPENSSL_free(s->ext.npn);
|
||||
s->ext.npn = OPENSSL_malloc(selected_len);
|
||||
if (s->ext.npn == NULL) {
|
||||
+ s->ext.npn_len = 0;
|
||||
SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PARSE_STOC_NPN,
|
||||
ERR_R_INTERNAL_ERROR);
|
||||
return 0;
|
||||
@@ -1632,6 +1640,7 @@
|
||||
OPENSSL_free(s->s3->alpn_selected);
|
||||
s->s3->alpn_selected = OPENSSL_malloc(len);
|
||||
if (s->s3->alpn_selected == NULL) {
|
||||
+ s->s3->alpn_selected_len = 0;
|
||||
SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PARSE_STOC_ALPN,
|
||||
ERR_R_INTERNAL_ERROR);
|
||||
return 0;
|
||||
@@ -1663,6 +1672,7 @@
|
||||
s->session->ext.alpn_selected =
|
||||
OPENSSL_memdup(s->s3->alpn_selected, s->s3->alpn_selected_len);
|
||||
if (s->session->ext.alpn_selected == NULL) {
|
||||
+ s->session->ext.alpn_selected_len = 0;
|
||||
SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PARSE_STOC_ALPN,
|
||||
ERR_R_INTERNAL_ERROR);
|
||||
return 0;
|
||||
--- crypto/openssl/ssl/statem/statem_clnt.c.orig
|
||||
+++ crypto/openssl/ssl/statem/statem_clnt.c
|
||||
@@ -2461,6 +2461,7 @@
|
||||
s->s3->tmp.ctype_len = 0;
|
||||
OPENSSL_free(s->pha_context);
|
||||
s->pha_context = NULL;
|
||||
+ s->pha_context_len = 0;
|
||||
|
||||
if (!PACKET_get_length_prefixed_1(pkt, &reqctx) ||
|
||||
!PACKET_memdup(&reqctx, &s->pha_context, &s->pha_context_len)) {
|
||||
@@ -2770,16 +2771,17 @@
|
||||
}
|
||||
s->ext.ocsp.resp = OPENSSL_malloc(resplen);
|
||||
if (s->ext.ocsp.resp == NULL) {
|
||||
+ s->ext.ocsp.resp_len = 0;
|
||||
SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_CERT_STATUS_BODY,
|
||||
ERR_R_MALLOC_FAILURE);
|
||||
return 0;
|
||||
}
|
||||
+ s->ext.ocsp.resp_len = resplen;
|
||||
if (!PACKET_copy_bytes(pkt, s->ext.ocsp.resp, resplen)) {
|
||||
SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_CERT_STATUS_BODY,
|
||||
SSL_R_LENGTH_MISMATCH);
|
||||
return 0;
|
||||
}
|
||||
- s->ext.ocsp.resp_len = resplen;
|
||||
|
||||
return 1;
|
||||
}
|
||||
@@ -3349,9 +3351,11 @@
|
||||
err:
|
||||
OPENSSL_clear_free(s->s3->tmp.pms, s->s3->tmp.pmslen);
|
||||
s->s3->tmp.pms = NULL;
|
||||
+ s->s3->tmp.pmslen = 0;
|
||||
#ifndef OPENSSL_NO_PSK
|
||||
OPENSSL_clear_free(s->s3->tmp.psk, s->s3->tmp.psklen);
|
||||
s->s3->tmp.psk = NULL;
|
||||
+ s->s3->tmp.psklen = 0;
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
@@ -3426,6 +3430,7 @@
|
||||
err:
|
||||
OPENSSL_clear_free(pms, pmslen);
|
||||
s->s3->tmp.pms = NULL;
|
||||
+ s->s3->tmp.pmslen = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
--- crypto/openssl/ssl/statem/statem_srvr.c.orig
|
||||
+++ crypto/openssl/ssl/statem/statem_srvr.c
|
||||
@@ -2178,6 +2178,7 @@
|
||||
OPENSSL_free(s->s3->alpn_selected);
|
||||
s->s3->alpn_selected = OPENSSL_memdup(selected, selected_len);
|
||||
if (s->s3->alpn_selected == NULL) {
|
||||
+ s->s3->alpn_selected_len = 0;
|
||||
SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_HANDLE_ALPN,
|
||||
ERR_R_INTERNAL_ERROR);
|
||||
return 0;
|
||||
@@ -2853,9 +2854,16 @@
|
||||
if (s->post_handshake_auth == SSL_PHA_REQUEST_PENDING) {
|
||||
OPENSSL_free(s->pha_context);
|
||||
s->pha_context_len = 32;
|
||||
- if ((s->pha_context = OPENSSL_malloc(s->pha_context_len)) == NULL
|
||||
- || RAND_bytes(s->pha_context, s->pha_context_len) <= 0
|
||||
- || !WPACKET_sub_memcpy_u8(pkt, s->pha_context, s->pha_context_len)) {
|
||||
+ if ((s->pha_context = OPENSSL_malloc(s->pha_context_len)) == NULL) {
|
||||
+ s->pha_context_len = 0;
|
||||
+ SSLfatal(s, SSL_AD_INTERNAL_ERROR,
|
||||
+ SSL_F_TLS_CONSTRUCT_CERTIFICATE_REQUEST,
|
||||
+ ERR_R_INTERNAL_ERROR);
|
||||
+ return 0;
|
||||
+ }
|
||||
+ if (RAND_bytes(s->pha_context, s->pha_context_len) <= 0
|
||||
+ || !WPACKET_sub_memcpy_u8(pkt, s->pha_context,
|
||||
+ s->pha_context_len)) {
|
||||
SSLfatal(s, SSL_AD_INTERNAL_ERROR,
|
||||
SSL_F_TLS_CONSTRUCT_CERTIFICATE_REQUEST,
|
||||
ERR_R_INTERNAL_ERROR);
|
||||
@@ -2969,6 +2977,7 @@
|
||||
OPENSSL_cleanse(psk, psklen);
|
||||
|
||||
if (s->s3->tmp.psk == NULL) {
|
||||
+ s->s3->tmp.psklen = 0;
|
||||
SSLfatal(s, SSL_AD_INTERNAL_ERROR,
|
||||
SSL_F_TLS_PROCESS_CKE_PSK_PREAMBLE, ERR_R_MALLOC_FAILURE);
|
||||
return 0;
|
||||
@@ -3508,6 +3517,7 @@
|
||||
#ifndef OPENSSL_NO_PSK
|
||||
OPENSSL_clear_free(s->s3->tmp.psk, s->s3->tmp.psklen);
|
||||
s->s3->tmp.psk = NULL;
|
||||
+ s->s3->tmp.psklen = 0;
|
||||
#endif
|
||||
return MSG_PROCESS_ERROR;
|
||||
}
|
||||
@@ -4117,6 +4127,7 @@
|
||||
s->session->ext.alpn_selected =
|
||||
OPENSSL_memdup(s->s3->alpn_selected, s->s3->alpn_selected_len);
|
||||
if (s->session->ext.alpn_selected == NULL) {
|
||||
+ s->session->ext.alpn_selected_len = 0;
|
||||
SSLfatal(s, SSL_AD_INTERNAL_ERROR,
|
||||
SSL_F_TLS_CONSTRUCT_NEW_SESSION_TICKET,
|
||||
ERR_R_MALLOC_FAILURE);
|
|
@ -0,0 +1,16 @@
|
|||
-----BEGIN PGP SIGNATURE-----
|
||||
|
||||
iQIzBAABCgAdFiEE/A6HiuWv54gCjWNV05eS9J6n5cIFAmBdIjQACgkQ05eS9J6n
|
||||
5cL5OQ//dm5Ga7kMttdTzTkHdEYYi7GhRae/Jhaxc1/lYu1shQcOO4PrasasOOmD
|
||||
lLsLOP/ZJ5mNFzFz8aiVS5cci995MYhmgCesOStJpwoFhTjGq2Oek+TUGCjJ6vSt
|
||||
W6qivOsffvMxhnpONFo1qmtDPsEgu0/BtpKkE9j9KohkptrlUoMNvE0p6e0lu02k
|
||||
wZGZlQDSrNnbyTtFBYPw0q0hYMqcKTTAb/h8TSJvAdwSM3eFr2bGqiKWRu4EagV2
|
||||
fMch81jYSZUjy7/vkfm77sIl5tRgIzi3V53AAB6llZukA8ClRk4VQFR4Lng5dF3b
|
||||
zh4M5GQSEDn3kx5iEEn/GduTO/ECa6fGyQNmaofXs7ObzBT7195wvk2YheuoXZgz
|
||||
UuQ99cQU6zTqomGg13sf7YOxzrJAnqRyn5mhiQRhPGHsHd5yeKBdxBMhQnY8o73k
|
||||
kvyYhZyYExW4GYmazuiVxPj24aA1h40XCK4cRhFh4VBgpjpAIxPyBIFOicuguNZM
|
||||
ESzpTmdLKBV04n+tm0JA729qyFHXlAub9+Tsvcx8hXxiC9QytbLKmXdpiq26l+d/
|
||||
7aIcoEkzBR2b4dewP7a8UpibXRKBX0r6oNRBSUgGjctgw822Yr4XHfUruJ5nIOFj
|
||||
vyZcsM3ircMyGeJ7Dmz3ljWAQMyrQZbRfC/usFahHYSRf1k8PJ4=
|
||||
=m/x3
|
||||
-----END PGP SIGNATURE-----
|
651
website/static/security/patches/SA-21:07/openssl-13.patch
Normal file
651
website/static/security/patches/SA-21:07/openssl-13.patch
Normal file
|
@ -0,0 +1,651 @@
|
|||
--- crypto/openssl/CHANGES.orig
|
||||
+++ crypto/openssl/CHANGES
|
||||
@@ -7,6 +7,50 @@
|
||||
https://github.com/openssl/openssl/commits/ and pick the appropriate
|
||||
release branch.
|
||||
|
||||
+ Changes between 1.1.1j and 1.1.1k [25 Mar 2021]
|
||||
+
|
||||
+ *) Fixed a problem with verifying a certificate chain when using the
|
||||
+ X509_V_FLAG_X509_STRICT flag. This flag enables additional security checks
|
||||
+ of the certificates present in a certificate chain. It is not set by
|
||||
+ default.
|
||||
+
|
||||
+ Starting from OpenSSL version 1.1.1h a check to disallow certificates in
|
||||
+ the chain that have explicitly encoded elliptic curve parameters was added
|
||||
+ as an additional strict check.
|
||||
+
|
||||
+ An error in the implementation of this check meant that the result of a
|
||||
+ previous check to confirm that certificates in the chain are valid CA
|
||||
+ certificates was overwritten. This effectively bypasses the check
|
||||
+ that non-CA certificates must not be able to issue other certificates.
|
||||
+
|
||||
+ If a "purpose" has been configured then there is a subsequent opportunity
|
||||
+ for checks that the certificate is a valid CA. All of the named "purpose"
|
||||
+ values implemented in libcrypto perform this check. Therefore, where
|
||||
+ a purpose is set the certificate chain will still be rejected even when the
|
||||
+ strict flag has been used. A purpose is set by default in libssl client and
|
||||
+ server certificate verification routines, but it can be overridden or
|
||||
+ removed by an application.
|
||||
+
|
||||
+ In order to be affected, an application must explicitly set the
|
||||
+ X509_V_FLAG_X509_STRICT verification flag and either not set a purpose
|
||||
+ for the certificate verification or, in the case of TLS client or server
|
||||
+ applications, override the default purpose.
|
||||
+ (CVE-2021-3450)
|
||||
+ [Tomáš Mráz]
|
||||
+
|
||||
+ *) Fixed an issue where an OpenSSL TLS server may crash if sent a maliciously
|
||||
+ crafted renegotiation ClientHello message from a client. If a TLSv1.2
|
||||
+ renegotiation ClientHello omits the signature_algorithms extension (where
|
||||
+ it was present in the initial ClientHello), but includes a
|
||||
+ signature_algorithms_cert extension then a NULL pointer dereference will
|
||||
+ result, leading to a crash and a denial of service attack.
|
||||
+
|
||||
+ A server is only vulnerable if it has TLSv1.2 and renegotiation enabled
|
||||
+ (which is the default configuration). OpenSSL TLS clients are not impacted
|
||||
+ by this issue.
|
||||
+ (CVE-2021-3449)
|
||||
+ [Peter Kästle and Samuel Sapalski]
|
||||
+
|
||||
Changes between 1.1.1i and 1.1.1j [16 Feb 2021]
|
||||
|
||||
*) Fixed the X509_issuer_and_serial_hash() function. It attempts to
|
||||
--- crypto/openssl/NEWS.orig
|
||||
+++ crypto/openssl/NEWS
|
||||
@@ -5,6 +5,14 @@
|
||||
This file gives a brief overview of the major changes between each OpenSSL
|
||||
release. For more details please read the CHANGES file.
|
||||
|
||||
+ Major changes between OpenSSL 1.1.1j and OpenSSL 1.1.1k [25 Mar 2021]
|
||||
+
|
||||
+ o Fixed a problem with verifying a certificate chain when using the
|
||||
+ X509_V_FLAG_X509_STRICT flag (CVE-2021-3450)
|
||||
+ o Fixed an issue where an OpenSSL TLS server may crash if sent a
|
||||
+ maliciously crafted renegotiation ClientHello message from a client
|
||||
+ (CVE-2021-3449)
|
||||
+
|
||||
Major changes between OpenSSL 1.1.1i and OpenSSL 1.1.1j [16 Feb 2021]
|
||||
|
||||
o Fixed a NULL pointer deref in the X509_issuer_and_serial_hash()
|
||||
--- crypto/openssl/README.orig
|
||||
+++ crypto/openssl/README
|
||||
@@ -1,7 +1,7 @@
|
||||
|
||||
- OpenSSL 1.1.1j 16 Feb 2021
|
||||
+ OpenSSL 1.1.1k 25 Mar 2021
|
||||
|
||||
- Copyright (c) 1998-2020 The OpenSSL Project
|
||||
+ Copyright (c) 1998-2021 The OpenSSL Project
|
||||
Copyright (c) 1995-1998 Eric A. Young, Tim J. Hudson
|
||||
All rights reserved.
|
||||
|
||||
--- crypto/openssl/apps/s_cb.c.orig
|
||||
+++ crypto/openssl/apps/s_cb.c
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
- * Copyright 1995-2020 The OpenSSL Project Authors. All Rights Reserved.
|
||||
+ * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the OpenSSL license (the "License"). You may not use
|
||||
* this file except in compliance with the License. You can obtain a copy
|
||||
@@ -934,7 +934,8 @@
|
||||
if (!SSL_build_cert_chain(ssl, 0))
|
||||
return 0;
|
||||
} else if (exc->chain != NULL) {
|
||||
- SSL_set1_chain(ssl, exc->chain);
|
||||
+ if (!SSL_set1_chain(ssl, exc->chain))
|
||||
+ return 0;
|
||||
}
|
||||
}
|
||||
exc = exc->prev;
|
||||
--- crypto/openssl/apps/s_time.c.orig
|
||||
+++ crypto/openssl/apps/s_time.c
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
- * Copyright 1995-2020 The OpenSSL Project Authors. All Rights Reserved.
|
||||
+ * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the OpenSSL license (the "License"). You may not use
|
||||
* this file except in compliance with the License. You can obtain a copy
|
||||
@@ -263,7 +263,8 @@
|
||||
nConn, totalTime, ((double)nConn / totalTime), bytes_read);
|
||||
printf
|
||||
("%d connections in %ld real seconds, %ld bytes read per connection\n",
|
||||
- nConn, (long)time(NULL) - finishtime + maxtime, bytes_read / nConn);
|
||||
+ nConn, (long)time(NULL) - finishtime + maxtime,
|
||||
+ nConn > 0 ? bytes_read / nConn : 0l);
|
||||
|
||||
/*
|
||||
* Now loop and time connections using the same session id over and over
|
||||
--- crypto/openssl/crypto/asn1/asn1_par.c.orig
|
||||
+++ crypto/openssl/crypto/asn1/asn1_par.c
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
- * Copyright 1995-2020 The OpenSSL Project Authors. All Rights Reserved.
|
||||
+ * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the OpenSSL license (the "License"). You may not use
|
||||
* this file except in compliance with the License. You can obtain a copy
|
||||
@@ -325,6 +325,7 @@
|
||||
}
|
||||
if (BIO_puts(bp, "]") <= 0)
|
||||
goto end;
|
||||
+ dump_cont = 0;
|
||||
}
|
||||
|
||||
if (!nl) {
|
||||
--- crypto/openssl/crypto/asn1/bio_ndef.c.orig
|
||||
+++ crypto/openssl/crypto/asn1/bio_ndef.c
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
- * Copyright 2008-2018 The OpenSSL Project Authors. All Rights Reserved.
|
||||
+ * Copyright 2008-2021 The OpenSSL Project Authors. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the OpenSSL license (the "License"). You may not use
|
||||
* this file except in compliance with the License. You can obtain a copy
|
||||
@@ -113,6 +113,8 @@
|
||||
ndef_aux = *(NDEF_SUPPORT **)parg;
|
||||
|
||||
derlen = ASN1_item_ndef_i2d(ndef_aux->val, NULL, ndef_aux->it);
|
||||
+ if (derlen < 0)
|
||||
+ return 0;
|
||||
if ((p = OPENSSL_malloc(derlen)) == NULL) {
|
||||
ASN1err(ASN1_F_NDEF_PREFIX, ERR_R_MALLOC_FAILURE);
|
||||
return 0;
|
||||
--- crypto/openssl/crypto/engine/eng_devcrypto.c.orig
|
||||
+++ crypto/openssl/crypto/engine/eng_devcrypto.c
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
- * Copyright 2017-2019 The OpenSSL Project Authors. All Rights Reserved.
|
||||
+ * Copyright 2017-2021 The OpenSSL Project Authors. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the OpenSSL license (the "License"). You may not use
|
||||
* this file except in compliance with the License. You can obtain a copy
|
||||
@@ -758,8 +758,9 @@
|
||||
void engine_load_devcrypto_int()
|
||||
{
|
||||
ENGINE *e = NULL;
|
||||
+ int fd;
|
||||
|
||||
- if ((cfd = open("/dev/crypto", O_RDWR, 0)) < 0) {
|
||||
+ if ((fd = open("/dev/crypto", O_RDWR, 0)) < 0) {
|
||||
#ifndef ENGINE_DEVCRYPTO_DEBUG
|
||||
if (errno != ENOENT)
|
||||
#endif
|
||||
@@ -767,6 +768,18 @@
|
||||
return;
|
||||
}
|
||||
|
||||
+#ifdef CRIOGET
|
||||
+ if (ioctl(fd, CRIOGET, &cfd) < 0) {
|
||||
+ fprintf(stderr, "Could not create crypto fd: %s\n", strerror(errno));
|
||||
+ close(fd);
|
||||
+ cfd = -1;
|
||||
+ return;
|
||||
+ }
|
||||
+ close(fd);
|
||||
+#else
|
||||
+ cfd = fd;
|
||||
+#endif
|
||||
+
|
||||
if ((e = ENGINE_new()) == NULL
|
||||
|| !ENGINE_set_destroy_function(e, devcrypto_unload)) {
|
||||
ENGINE_free(e);
|
||||
--- crypto/openssl/crypto/evp/evp_enc.c.orig
|
||||
+++ crypto/openssl/crypto/evp/evp_enc.c
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
- * Copyright 1995-2018 The OpenSSL Project Authors. All Rights Reserved.
|
||||
+ * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the OpenSSL license (the "License"). You may not use
|
||||
* this file except in compliance with the License. You can obtain a copy
|
||||
--- crypto/openssl/crypto/modes/cbc128.c.orig
|
||||
+++ crypto/openssl/crypto/modes/cbc128.c
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
- * Copyright 2008-2020 The OpenSSL Project Authors. All Rights Reserved.
|
||||
+ * Copyright 2008-2021 The OpenSSL Project Authors. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the OpenSSL license (the "License"). You may not use
|
||||
* this file except in compliance with the License. You can obtain a copy
|
||||
@@ -69,7 +69,8 @@
|
||||
in += 16;
|
||||
out += 16;
|
||||
}
|
||||
- memcpy(ivec, iv, 16);
|
||||
+ if (ivec != iv)
|
||||
+ memcpy(ivec, iv, 16);
|
||||
}
|
||||
|
||||
void CRYPTO_cbc128_decrypt(const unsigned char *in, unsigned char *out,
|
||||
@@ -114,7 +115,8 @@
|
||||
out += 16;
|
||||
}
|
||||
}
|
||||
- memcpy(ivec, iv, 16);
|
||||
+ if (ivec != iv)
|
||||
+ memcpy(ivec, iv, 16);
|
||||
} else {
|
||||
if (STRICT_ALIGNMENT &&
|
||||
((size_t)in | (size_t)out | (size_t)ivec) % sizeof(size_t) != 0) {
|
||||
--- crypto/openssl/crypto/modes/gcm128.c.orig
|
||||
+++ crypto/openssl/crypto/modes/gcm128.c
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
- * Copyright 2010-2020 The OpenSSL Project Authors. All Rights Reserved.
|
||||
+ * Copyright 2010-2021 The OpenSSL Project Authors. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the OpenSSL license (the "License"). You may not use
|
||||
* this file except in compliance with the License. You can obtain a copy
|
||||
@@ -1385,8 +1385,8 @@
|
||||
else
|
||||
ctx->Yi.d[3] = ctr;
|
||||
for (i = 0; i < 16 / sizeof(size_t); ++i) {
|
||||
- size_t c = in[i];
|
||||
- out[i] = c ^ ctx->EKi.t[i];
|
||||
+ size_t c = in_t[i];
|
||||
+ out_t[i] = c ^ ctx->EKi.t[i];
|
||||
ctx->Xi.t[i] ^= c;
|
||||
}
|
||||
GCM_MUL(ctx);
|
||||
--- crypto/openssl/crypto/o_time.c.orig
|
||||
+++ crypto/openssl/crypto/o_time.c
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
- * Copyright 2001-2020 The OpenSSL Project Authors. All Rights Reserved.
|
||||
+ * Copyright 2001-2021 The OpenSSL Project Authors. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the OpenSSL license (the "License"). You may not use
|
||||
* this file except in compliance with the License. You can obtain a copy
|
||||
@@ -133,8 +133,8 @@
|
||||
static int julian_adj(const struct tm *tm, int off_day, long offset_sec,
|
||||
long *pday, int *psec)
|
||||
{
|
||||
- int offset_hms, offset_day;
|
||||
- long time_jd;
|
||||
+ int offset_hms;
|
||||
+ long offset_day, time_jd;
|
||||
int time_year, time_month, time_day;
|
||||
/* split offset into days and day seconds */
|
||||
offset_day = offset_sec / SECS_PER_DAY;
|
||||
--- crypto/openssl/crypto/rand/rand_lib.c.orig
|
||||
+++ crypto/openssl/crypto/rand/rand_lib.c
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
- * Copyright 1995-2020 The OpenSSL Project Authors. All Rights Reserved.
|
||||
+ * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the OpenSSL license (the "License"). You may not use
|
||||
* this file except in compliance with the License. You can obtain a copy
|
||||
@@ -432,9 +432,13 @@
|
||||
RAND_POOL *rand_pool_new(int entropy_requested, int secure,
|
||||
size_t min_len, size_t max_len)
|
||||
{
|
||||
- RAND_POOL *pool = OPENSSL_zalloc(sizeof(*pool));
|
||||
+ RAND_POOL *pool;
|
||||
size_t min_alloc_size = RAND_POOL_MIN_ALLOCATION(secure);
|
||||
|
||||
+ if (!RUN_ONCE(&rand_init, do_rand_init))
|
||||
+ return NULL;
|
||||
+
|
||||
+ pool = OPENSSL_zalloc(sizeof(*pool));
|
||||
if (pool == NULL) {
|
||||
RANDerr(RAND_F_RAND_POOL_NEW, ERR_R_MALLOC_FAILURE);
|
||||
return NULL;
|
||||
--- crypto/openssl/crypto/rsa/rsa_ssl.c.orig
|
||||
+++ crypto/openssl/crypto/rsa/rsa_ssl.c
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
- * Copyright 1995-2019 The OpenSSL Project Authors. All Rights Reserved.
|
||||
+ * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the OpenSSL license (the "License"). You may not use
|
||||
* this file except in compliance with the License. You can obtain a copy
|
||||
--- crypto/openssl/crypto/x509/x509_vfy.c.orig
|
||||
+++ crypto/openssl/crypto/x509/x509_vfy.c
|
||||
@@ -524,15 +524,19 @@
|
||||
ret = 1;
|
||||
break;
|
||||
}
|
||||
- if ((ctx->param->flags & X509_V_FLAG_X509_STRICT) && num > 1) {
|
||||
+ if (ret > 0
|
||||
+ && (ctx->param->flags & X509_V_FLAG_X509_STRICT) && num > 1) {
|
||||
/* Check for presence of explicit elliptic curve parameters */
|
||||
ret = check_curve(x);
|
||||
- if (ret < 0)
|
||||
+ if (ret < 0) {
|
||||
ctx->error = X509_V_ERR_UNSPECIFIED;
|
||||
- else if (ret == 0)
|
||||
+ ret = 0;
|
||||
+ } else if (ret == 0) {
|
||||
ctx->error = X509_V_ERR_EC_KEY_EXPLICIT_PARAMS;
|
||||
+ }
|
||||
}
|
||||
- if ((x->ex_flags & EXFLAG_CA) == 0
|
||||
+ if (ret > 0
|
||||
+ && (x->ex_flags & EXFLAG_CA) == 0
|
||||
&& x->ex_pathlen != -1
|
||||
&& (ctx->param->flags & X509_V_FLAG_X509_STRICT)) {
|
||||
ctx->error = X509_V_ERR_INVALID_EXTENSION;
|
||||
--- crypto/openssl/include/openssl/opensslv.h.orig
|
||||
+++ crypto/openssl/include/openssl/opensslv.h
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
- * Copyright 1999-2020 The OpenSSL Project Authors. All Rights Reserved.
|
||||
+ * Copyright 1999-2021 The OpenSSL Project Authors. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the OpenSSL license (the "License"). You may not use
|
||||
* this file except in compliance with the License. You can obtain a copy
|
||||
@@ -39,8 +39,8 @@
|
||||
* (Prior to 0.9.5a beta1, a different scheme was used: MMNNFFRBB for
|
||||
* major minor fix final patch/beta)
|
||||
*/
|
||||
-# define OPENSSL_VERSION_NUMBER 0x101010afL
|
||||
-# define OPENSSL_VERSION_TEXT "OpenSSL 1.1.1j-freebsd 16 Feb 2021"
|
||||
+# define OPENSSL_VERSION_NUMBER 0x101010bfL
|
||||
+# define OPENSSL_VERSION_TEXT "OpenSSL 1.1.1k-freebsd 25 Mar 2021"
|
||||
|
||||
/*-
|
||||
* The macros below are to be used for shared library (.so, .dll, ...)
|
||||
--- crypto/openssl/ssl/s3_lib.c.orig
|
||||
+++ crypto/openssl/ssl/s3_lib.c
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
- * Copyright 1995-2020 The OpenSSL Project Authors. All Rights Reserved.
|
||||
+ * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved.
|
||||
* Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved
|
||||
* Copyright 2005 Nokia. All rights reserved.
|
||||
*
|
||||
@@ -4629,6 +4629,7 @@
|
||||
|
||||
OPENSSL_clear_free(s->s3->tmp.psk, psklen);
|
||||
s->s3->tmp.psk = NULL;
|
||||
+ s->s3->tmp.psklen = 0;
|
||||
if (!s->method->ssl3_enc->generate_master_secret(s,
|
||||
s->session->master_key, pskpms, pskpmslen,
|
||||
&s->session->master_key_length)) {
|
||||
@@ -4658,8 +4659,10 @@
|
||||
else
|
||||
OPENSSL_cleanse(pms, pmslen);
|
||||
}
|
||||
- if (s->server == 0)
|
||||
+ if (s->server == 0) {
|
||||
s->s3->tmp.pms = NULL;
|
||||
+ s->s3->tmp.pmslen = 0;
|
||||
+ }
|
||||
return ret;
|
||||
}
|
||||
|
||||
--- crypto/openssl/ssl/ssl_lib.c.orig
|
||||
+++ crypto/openssl/ssl/ssl_lib.c
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
- * Copyright 1995-2020 The OpenSSL Project Authors. All Rights Reserved.
|
||||
+ * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved.
|
||||
* Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved
|
||||
* Copyright 2005 Nokia. All rights reserved.
|
||||
*
|
||||
@@ -781,8 +781,10 @@
|
||||
s->ext.ecpointformats =
|
||||
OPENSSL_memdup(ctx->ext.ecpointformats,
|
||||
ctx->ext.ecpointformats_len);
|
||||
- if (!s->ext.ecpointformats)
|
||||
+ if (!s->ext.ecpointformats) {
|
||||
+ s->ext.ecpointformats_len = 0;
|
||||
goto err;
|
||||
+ }
|
||||
s->ext.ecpointformats_len =
|
||||
ctx->ext.ecpointformats_len;
|
||||
}
|
||||
@@ -791,8 +793,10 @@
|
||||
OPENSSL_memdup(ctx->ext.supportedgroups,
|
||||
ctx->ext.supportedgroups_len
|
||||
* sizeof(*ctx->ext.supportedgroups));
|
||||
- if (!s->ext.supportedgroups)
|
||||
+ if (!s->ext.supportedgroups) {
|
||||
+ s->ext.supportedgroups_len = 0;
|
||||
goto err;
|
||||
+ }
|
||||
s->ext.supportedgroups_len = ctx->ext.supportedgroups_len;
|
||||
}
|
||||
#endif
|
||||
@@ -802,8 +806,10 @@
|
||||
|
||||
if (s->ctx->ext.alpn) {
|
||||
s->ext.alpn = OPENSSL_malloc(s->ctx->ext.alpn_len);
|
||||
- if (s->ext.alpn == NULL)
|
||||
+ if (s->ext.alpn == NULL) {
|
||||
+ s->ext.alpn_len = 0;
|
||||
goto err;
|
||||
+ }
|
||||
memcpy(s->ext.alpn, s->ctx->ext.alpn, s->ctx->ext.alpn_len);
|
||||
s->ext.alpn_len = s->ctx->ext.alpn_len;
|
||||
}
|
||||
@@ -2923,6 +2929,7 @@
|
||||
OPENSSL_free(ctx->ext.alpn);
|
||||
ctx->ext.alpn = OPENSSL_memdup(protos, protos_len);
|
||||
if (ctx->ext.alpn == NULL) {
|
||||
+ ctx->ext.alpn_len = 0;
|
||||
SSLerr(SSL_F_SSL_CTX_SET_ALPN_PROTOS, ERR_R_MALLOC_FAILURE);
|
||||
return 1;
|
||||
}
|
||||
@@ -2942,6 +2949,7 @@
|
||||
OPENSSL_free(ssl->ext.alpn);
|
||||
ssl->ext.alpn = OPENSSL_memdup(protos, protos_len);
|
||||
if (ssl->ext.alpn == NULL) {
|
||||
+ ssl->ext.alpn_len = 0;
|
||||
SSLerr(SSL_F_SSL_SET_ALPN_PROTOS, ERR_R_MALLOC_FAILURE);
|
||||
return 1;
|
||||
}
|
||||
--- crypto/openssl/ssl/statem/extensions.c.orig
|
||||
+++ crypto/openssl/ssl/statem/extensions.c
|
||||
@@ -336,6 +336,8 @@
|
||||
tls_construct_stoc_key_share, tls_construct_ctos_key_share,
|
||||
final_key_share
|
||||
},
|
||||
+#else
|
||||
+ INVALID_EXTENSION,
|
||||
#endif
|
||||
{
|
||||
/* Must be after key_share */
|
||||
@@ -1137,6 +1139,7 @@
|
||||
/* Clear any signature algorithms extension received */
|
||||
OPENSSL_free(s->s3->tmp.peer_sigalgs);
|
||||
s->s3->tmp.peer_sigalgs = NULL;
|
||||
+ s->s3->tmp.peer_sigalgslen = 0;
|
||||
|
||||
return 1;
|
||||
}
|
||||
@@ -1146,6 +1149,7 @@
|
||||
/* Clear any signature algorithms extension received */
|
||||
OPENSSL_free(s->s3->tmp.peer_cert_sigalgs);
|
||||
s->s3->tmp.peer_cert_sigalgs = NULL;
|
||||
+ s->s3->tmp.peer_cert_sigalgslen = 0;
|
||||
|
||||
return 1;
|
||||
}
|
||||
--- crypto/openssl/ssl/statem/extensions_clnt.c.orig
|
||||
+++ crypto/openssl/ssl/statem/extensions_clnt.c
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
- * Copyright 2016-2019 The OpenSSL Project Authors. All Rights Reserved.
|
||||
+ * Copyright 2016-2021 The OpenSSL Project Authors. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the OpenSSL license (the "License"). You may not use
|
||||
* this file except in compliance with the License. You can obtain a copy
|
||||
@@ -816,6 +816,7 @@
|
||||
OPENSSL_free(s->psksession_id);
|
||||
s->psksession_id = OPENSSL_memdup(id, idlen);
|
||||
if (s->psksession_id == NULL) {
|
||||
+ s->psksession_id_len = 0;
|
||||
SSLfatal(s, SSL_AD_INTERNAL_ERROR,
|
||||
SSL_F_TLS_CONSTRUCT_CTOS_EARLY_DATA, ERR_R_INTERNAL_ERROR);
|
||||
return EXT_RETURN_FAIL;
|
||||
@@ -1375,6 +1376,7 @@
|
||||
OPENSSL_free(s->ext.peer_ecpointformats);
|
||||
s->ext.peer_ecpointformats = OPENSSL_malloc(ecpointformats_len);
|
||||
if (s->ext.peer_ecpointformats == NULL) {
|
||||
+ s->ext.peer_ecpointformats_len = 0;
|
||||
SSLfatal(s, SSL_AD_INTERNAL_ERROR,
|
||||
SSL_F_TLS_PARSE_STOC_EC_PT_FORMATS, ERR_R_INTERNAL_ERROR);
|
||||
return 0;
|
||||
@@ -1492,8 +1494,13 @@
|
||||
s->ext.scts_len = (uint16_t)size;
|
||||
if (size > 0) {
|
||||
s->ext.scts = OPENSSL_malloc(size);
|
||||
- if (s->ext.scts == NULL
|
||||
- || !PACKET_copy_bytes(pkt, s->ext.scts, size)) {
|
||||
+ if (s->ext.scts == NULL) {
|
||||
+ s->ext.scts_len = 0;
|
||||
+ SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PARSE_STOC_SCT,
|
||||
+ ERR_R_MALLOC_FAILURE);
|
||||
+ return 0;
|
||||
+ }
|
||||
+ if (!PACKET_copy_bytes(pkt, s->ext.scts, size)) {
|
||||
SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PARSE_STOC_SCT,
|
||||
ERR_R_INTERNAL_ERROR);
|
||||
return 0;
|
||||
@@ -1592,6 +1599,7 @@
|
||||
OPENSSL_free(s->ext.npn);
|
||||
s->ext.npn = OPENSSL_malloc(selected_len);
|
||||
if (s->ext.npn == NULL) {
|
||||
+ s->ext.npn_len = 0;
|
||||
SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PARSE_STOC_NPN,
|
||||
ERR_R_INTERNAL_ERROR);
|
||||
return 0;
|
||||
@@ -1632,6 +1640,7 @@
|
||||
OPENSSL_free(s->s3->alpn_selected);
|
||||
s->s3->alpn_selected = OPENSSL_malloc(len);
|
||||
if (s->s3->alpn_selected == NULL) {
|
||||
+ s->s3->alpn_selected_len = 0;
|
||||
SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PARSE_STOC_ALPN,
|
||||
ERR_R_INTERNAL_ERROR);
|
||||
return 0;
|
||||
@@ -1663,6 +1672,7 @@
|
||||
s->session->ext.alpn_selected =
|
||||
OPENSSL_memdup(s->s3->alpn_selected, s->s3->alpn_selected_len);
|
||||
if (s->session->ext.alpn_selected == NULL) {
|
||||
+ s->session->ext.alpn_selected_len = 0;
|
||||
SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PARSE_STOC_ALPN,
|
||||
ERR_R_INTERNAL_ERROR);
|
||||
return 0;
|
||||
--- crypto/openssl/ssl/statem/statem_clnt.c.orig
|
||||
+++ crypto/openssl/ssl/statem/statem_clnt.c
|
||||
@@ -2462,6 +2462,7 @@
|
||||
s->s3->tmp.ctype_len = 0;
|
||||
OPENSSL_free(s->pha_context);
|
||||
s->pha_context = NULL;
|
||||
+ s->pha_context_len = 0;
|
||||
|
||||
if (!PACKET_get_length_prefixed_1(pkt, &reqctx) ||
|
||||
!PACKET_memdup(&reqctx, &s->pha_context, &s->pha_context_len)) {
|
||||
@@ -2771,16 +2772,17 @@
|
||||
}
|
||||
s->ext.ocsp.resp = OPENSSL_malloc(resplen);
|
||||
if (s->ext.ocsp.resp == NULL) {
|
||||
+ s->ext.ocsp.resp_len = 0;
|
||||
SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_CERT_STATUS_BODY,
|
||||
ERR_R_MALLOC_FAILURE);
|
||||
return 0;
|
||||
}
|
||||
+ s->ext.ocsp.resp_len = resplen;
|
||||
if (!PACKET_copy_bytes(pkt, s->ext.ocsp.resp, resplen)) {
|
||||
SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_CERT_STATUS_BODY,
|
||||
SSL_R_LENGTH_MISMATCH);
|
||||
return 0;
|
||||
}
|
||||
- s->ext.ocsp.resp_len = resplen;
|
||||
|
||||
return 1;
|
||||
}
|
||||
@@ -2905,6 +2907,7 @@
|
||||
if (psklen > PSK_MAX_PSK_LEN) {
|
||||
SSLfatal(s, SSL_AD_HANDSHAKE_FAILURE,
|
||||
SSL_F_TLS_CONSTRUCT_CKE_PSK_PREAMBLE, ERR_R_INTERNAL_ERROR);
|
||||
+ psklen = PSK_MAX_PSK_LEN; /* Avoid overrunning the array on cleanse */
|
||||
goto err;
|
||||
} else if (psklen == 0) {
|
||||
SSLfatal(s, SSL_AD_HANDSHAKE_FAILURE,
|
||||
@@ -3350,9 +3353,11 @@
|
||||
err:
|
||||
OPENSSL_clear_free(s->s3->tmp.pms, s->s3->tmp.pmslen);
|
||||
s->s3->tmp.pms = NULL;
|
||||
+ s->s3->tmp.pmslen = 0;
|
||||
#ifndef OPENSSL_NO_PSK
|
||||
OPENSSL_clear_free(s->s3->tmp.psk, s->s3->tmp.psklen);
|
||||
s->s3->tmp.psk = NULL;
|
||||
+ s->s3->tmp.psklen = 0;
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
@@ -3427,6 +3432,7 @@
|
||||
err:
|
||||
OPENSSL_clear_free(pms, pmslen);
|
||||
s->s3->tmp.pms = NULL;
|
||||
+ s->s3->tmp.pmslen = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
--- crypto/openssl/ssl/statem/statem_srvr.c.orig
|
||||
+++ crypto/openssl/ssl/statem/statem_srvr.c
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
- * Copyright 1995-2020 The OpenSSL Project Authors. All Rights Reserved.
|
||||
+ * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved.
|
||||
* Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved
|
||||
* Copyright 2005 Nokia. All rights reserved.
|
||||
*
|
||||
@@ -2178,6 +2178,7 @@
|
||||
OPENSSL_free(s->s3->alpn_selected);
|
||||
s->s3->alpn_selected = OPENSSL_memdup(selected, selected_len);
|
||||
if (s->s3->alpn_selected == NULL) {
|
||||
+ s->s3->alpn_selected_len = 0;
|
||||
SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_HANDLE_ALPN,
|
||||
ERR_R_INTERNAL_ERROR);
|
||||
return 0;
|
||||
@@ -2853,9 +2854,16 @@
|
||||
if (s->post_handshake_auth == SSL_PHA_REQUEST_PENDING) {
|
||||
OPENSSL_free(s->pha_context);
|
||||
s->pha_context_len = 32;
|
||||
- if ((s->pha_context = OPENSSL_malloc(s->pha_context_len)) == NULL
|
||||
- || RAND_bytes(s->pha_context, s->pha_context_len) <= 0
|
||||
- || !WPACKET_sub_memcpy_u8(pkt, s->pha_context, s->pha_context_len)) {
|
||||
+ if ((s->pha_context = OPENSSL_malloc(s->pha_context_len)) == NULL) {
|
||||
+ s->pha_context_len = 0;
|
||||
+ SSLfatal(s, SSL_AD_INTERNAL_ERROR,
|
||||
+ SSL_F_TLS_CONSTRUCT_CERTIFICATE_REQUEST,
|
||||
+ ERR_R_INTERNAL_ERROR);
|
||||
+ return 0;
|
||||
+ }
|
||||
+ if (RAND_bytes(s->pha_context, s->pha_context_len) <= 0
|
||||
+ || !WPACKET_sub_memcpy_u8(pkt, s->pha_context,
|
||||
+ s->pha_context_len)) {
|
||||
SSLfatal(s, SSL_AD_INTERNAL_ERROR,
|
||||
SSL_F_TLS_CONSTRUCT_CERTIFICATE_REQUEST,
|
||||
ERR_R_INTERNAL_ERROR);
|
||||
@@ -2969,6 +2977,7 @@
|
||||
OPENSSL_cleanse(psk, psklen);
|
||||
|
||||
if (s->s3->tmp.psk == NULL) {
|
||||
+ s->s3->tmp.psklen = 0;
|
||||
SSLfatal(s, SSL_AD_INTERNAL_ERROR,
|
||||
SSL_F_TLS_PROCESS_CKE_PSK_PREAMBLE, ERR_R_MALLOC_FAILURE);
|
||||
return 0;
|
||||
@@ -3508,6 +3517,7 @@
|
||||
#ifndef OPENSSL_NO_PSK
|
||||
OPENSSL_clear_free(s->s3->tmp.psk, s->s3->tmp.psklen);
|
||||
s->s3->tmp.psk = NULL;
|
||||
+ s->s3->tmp.psklen = 0;
|
||||
#endif
|
||||
return MSG_PROCESS_ERROR;
|
||||
}
|
||||
@@ -4117,6 +4127,7 @@
|
||||
s->session->ext.alpn_selected =
|
||||
OPENSSL_memdup(s->s3->alpn_selected, s->s3->alpn_selected_len);
|
||||
if (s->session->ext.alpn_selected == NULL) {
|
||||
+ s->session->ext.alpn_selected_len = 0;
|
||||
SSLfatal(s, SSL_AD_INTERNAL_ERROR,
|
||||
SSL_F_TLS_CONSTRUCT_NEW_SESSION_TICKET,
|
||||
ERR_R_MALLOC_FAILURE);
|
|
@ -0,0 +1,16 @@
|
|||
-----BEGIN PGP SIGNATURE-----
|
||||
|
||||
iQIzBAABCgAdFiEE/A6HiuWv54gCjWNV05eS9J6n5cIFAmBdIjQACgkQ05eS9J6n
|
||||
5cK1ghAAkEhuwv38idhbRm3CHygeGjBp8N9Mc5Miej25FqGSp1fQsX1zbO+Lo/o5
|
||||
tY9Z68imac98EGZI43I+S+Xjc0dRywG2XPOWYZigq5dNhoMG2t4/GYSAwO+PPDVx
|
||||
WieDH1KiSAZ/eUawCWGsFttd5ds0xoH+E/HVxnMPbRJiibQPm8uidPVcZ5HteVaB
|
||||
3slhGPt2Jxoqs5HeeJlwhqk1i9n/TEYYq4BebZ8i7TWkp+rpSIM3DORoOQa9gn5t
|
||||
+ghp1e1gwoLEB9tHiuiEPpBPHxKAmbAh7QG0OA1Q+nRntKPhiqh9ecQOx8CmCvqN
|
||||
8WBcN7rDMBwGB8cuZCW/zmsOE3a/eLPo4MxPs7EZ2IhfvwbbOLV5cECeF05iQg35
|
||||
gva6uLEZNDySxBZ1j6Jxx/2qz8IVzaQhBxbw1PeygWuX1Vz0Jwo/ZRpBRfHN5dlE
|
||||
NtKgTKDrtCJeCFChwDAFjAbVNRFx6G89+ScP689XY83kaxmZnDfPvhthwE56x17D
|
||||
LFE4nBvbz18OuyeN0B1Ba+rOzNhGYyEjVighdt5AjqcW79/K3icVkxl2ibt6y29f
|
||||
yRVkd9edX2Njmq8kJD9Zl9P5elRyJXv+2HuN0e8Yi1do59wJnF93cILroii21Y7r
|
||||
S+YnSGb9pKDQzGowsQct3qCNDvORtjzHBtCYJ5o/VrXOnL9Za6c=
|
||||
=sx6Q
|
||||
-----END PGP SIGNATURE-----
|
Loading…
Reference in a new issue