git: 98ec8b7512 - main - Add FreeBSD-SA-21:07.openssl.

Gordon Tetlow <[email protected]>
Newsgroups gmane.os.freebsd.devel.cvs.doc
Message-ID <[email protected]>
The branch main has been updated by gordon (src committer):

URL: https://cgit.FreeBSD.org/doc/commit/?id=98ec8b7512c644be2229f079208e6698bdb09af6

commit 98ec8b7512c644be2229f079208e6698bdb09af6
Author:     Gordon Tetlow <[email protected]>
AuthorDate: 2021-03-25 23:55:47 +0000
Commit:     Gordon Tetlow <[email protected]>
CommitDate: 2021-03-25 23:56:03 +0000

    Add FreeBSD-SA-21:07.openssl.
    
    Approved by:    so
---
 website/data/security/advisories.toml              |   4 +
 .../advisories/FreeBSD-SA-21:07.openssl.asc        | 170 ++++++
 .../security/patches/SA-21:07/openssl-12.patch     | 281 +++++++++
 .../security/patches/SA-21:07/openssl-12.patch.asc |  16 +
 .../security/patches/SA-21:07/openssl-13.patch     | 651 +++++++++++++++++++++
 .../security/patches/SA-21:07/openssl-13.patch.asc |  16 +
 6 files changed, 1138 insertions(+)

diff --git a/website/data/security/advisories.toml b/website/data/security/advisories.toml
index 10229d9ce6..08e22e3be7 100644
--- a/website/data/security/advisories.toml
+++ b/website/data/security/advisories.toml
@@ -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"
diff --git a/website/static/security/advisories/FreeBSD-SA-21:07.openssl.asc b/website/static/security/advisories/FreeBSD-SA-21:07.openssl.asc
new file mode 100644
index 0000000000..af47414066
--- /dev/null
+++ b/website/static/security/advisories/FreeBSD-SA-21:07.openssl.asc
@@ -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-----
diff --git a/website/static/security/patches/SA-21:07/openssl-12.patch b/website/static/security/patches/SA-21:07/openssl-12.patch
new file mode 100644
index 0000000000..70ee0e6250
--- /dev/null
+++ b/website/static/security/patches/SA-21:07/openssl-12.patch
@@ -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);
diff --git a/website/static/security/patches/SA-21:07/openssl-12.patch.asc b/website/static/security/patches/SA-21:07/openssl-12.patch.asc
new file mode 100644
index 0000000000..a37ae98422
--- /dev/null
+++ b/website/static/security/patches/SA-21:07/openssl-12.patch.asc
@@ -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-----
diff --git a/website/static/security/patches/SA-21:07/openssl-13.patch b/website/static/security/patches/SA-21:07/openssl-13.patch
new file mode 100644
index 0000000000..07fdf17450
--- /dev/null
+++ b/website/static/security/patches/SA-21:07/openssl-13.patch
@@ -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;
*** 214 LINES SKIPPED ***
_______________________________________________
[email protected] mailing list
https://lists.freebsd.org/mailman/listinfo/dev-commits-doc-all
To unsubscribe, send any mail to "[email protected]"
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.