[Pkg-openssl-devel] openssl wheezy update
Emilio Pozuelo Monfort
pochu at debian.org
Tue Jan 31 22:13:55 UTC 2017
Hi Kurt,
I have prepared an update of openssl for wheezy based on 1.0.1t-1+deb8u6. I have
done some smoke testing on it and it seems fine, but I haven't been able to
verify the three fixes as I can't find exploits for them (there is mention of
one for CVE-2016-8610 in [1] but I can't find the actual file).
Do you have any suggestion for how to verify / test the update?
Do you want to upload this or should I take care of it?
Test packages at https://people.debian.org/~pochu/lts/openssl/ in case someone
can give them a try.
Thanks,
Emilio
[1] http://www.openwall.com/lists/oss-security/2016/10/24/3
-------------- next part --------------
diff -Nru openssl-1.0.1t/debian/changelog openssl-1.0.1t/debian/changelog
--- openssl-1.0.1t/debian/changelog 2016-09-25 11:19:14.000000000 +0200
+++ openssl-1.0.1t/debian/changelog 2017-01-31 22:04:44.000000000 +0100
@@ -1,3 +1,13 @@
+openssl (1.0.1t-1+deb7u2) wheezy-security; urgency=medium
+
+ * Non-maintainer upload by the LTS team.
+ * Backport changes from 1.0.1t-1+deb8u6:
+ * Fix CVE-2016-8610
+ * Fix CVE-2017-3731
+ * Fix CVE-2016-7056
+
+ -- Emilio Pozuelo Monfort <pochu at debian.org> Tue, 31 Jan 2017 22:04:44 +0100
+
openssl (1.0.1t-1+deb7u1) wheezy-security; urgency=medium
* New upstream version, based on the version in jessie.
diff -Nru openssl-1.0.1t/debian/patches/CVE-2016-7056.patch openssl-1.0.1t/debian/patches/CVE-2016-7056.patch
--- openssl-1.0.1t/debian/patches/CVE-2016-7056.patch 1970-01-01 01:00:00.000000000 +0100
+++ openssl-1.0.1t/debian/patches/CVE-2016-7056.patch 2017-01-31 22:03:37.000000000 +0100
@@ -0,0 +1,12 @@
+--- a/crypto/ecdsa/ecs_ossl.c
++++ b/crypto/ecdsa/ecs_ossl.c
+@@ -147,6 +147,8 @@ static int ecdsa_sign_setup(EC_KEY *eckey, BN_CTX *ctx_in, BIGNUM **kinvp,
+ if (!BN_add(k, k, order))
+ goto err;
+
++ BN_set_flags(k, BN_FLG_CONSTTIME);
++
+ /* compute r the x-coordinate of generator * k */
+ if (!EC_POINT_mul(group, tmp_point, k, NULL, NULL, ctx)) {
+ ECDSAerr(ECDSA_F_ECDSA_SIGN_SETUP, ERR_R_EC_LIB);
+
diff -Nru openssl-1.0.1t/debian/patches/CVE-2016-8610.patch openssl-1.0.1t/debian/patches/CVE-2016-8610.patch
--- openssl-1.0.1t/debian/patches/CVE-2016-8610.patch 1970-01-01 01:00:00.000000000 +0100
+++ openssl-1.0.1t/debian/patches/CVE-2016-8610.patch 2017-01-31 22:03:37.000000000 +0100
@@ -0,0 +1,128 @@
+Subject: CVE-2016-8610
+
+This is a combination of commit 22646a075e75991b4e8f5d67171e45a6aead5b48 and
+f1185392189641014dca94f3fe7834bccb5f4c16
+
+index 7e3a7b480e..cb74d467bb 100644
+Index: openssl-1.0.1t/ssl/s3_pkt.c
+===================================================================
+--- openssl-1.0.1t.orig/ssl/s3_pkt.c
++++ openssl-1.0.1t/ssl/s3_pkt.c
+@@ -1057,6 +1057,13 @@ int ssl3_read_bytes(SSL *s, int type, un
+ return (ret);
+ }
+
++ /*
++ * Reset the count of consecutive warning alerts if we've got a non-empty
++ * record that isn't an alert.
++ */
++ if (rr->type != SSL3_RT_ALERT && rr->length != 0)
++ s->cert->alert_count = 0;
++
+ /* we now have a packet which can be read and processed */
+
+ if (s->s3->change_cipher_spec /* set when we receive ChangeCipherSpec,
+@@ -1271,6 +1278,14 @@ int ssl3_read_bytes(SSL *s, int type, un
+
+ if (alert_level == SSL3_AL_WARNING) {
+ s->s3->warn_alert = alert_descr;
++
++ s->cert->alert_count++;
++ if (s->cert->alert_count == MAX_WARN_ALERT_COUNT) {
++ al = SSL_AD_UNEXPECTED_MESSAGE;
++ SSLerr(SSL_F_SSL3_READ_BYTES, SSL_R_TOO_MANY_WARN_ALERTS);
++ goto f_err;
++ }
++
+ if (alert_descr == SSL_AD_CLOSE_NOTIFY) {
+ s->shutdown |= SSL_RECEIVED_SHUTDOWN;
+ return (0);
+@@ -1406,16 +1421,13 @@ int ssl3_read_bytes(SSL *s, int type, un
+
+ switch (rr->type) {
+ default:
+-#ifndef OPENSSL_NO_TLS
+ /*
+- * TLS up to v1.1 just ignores unknown message types: TLS v1.2 give
+- * an unexpected message alert.
++ * TLS 1.0 and 1.1 say you SHOULD ignore unrecognised record types, but
++ * TLS 1.2 says you MUST send an unexpected message alert. We use the
++ * TLS 1.2 behaviour for all protocol versions to prevent issues where
++ * no progress is being made and the peer continually sends unrecognised
++ * record types, using up resources processing them.
+ */
+- if (s->version >= TLS1_VERSION && s->version <= TLS1_1_VERSION) {
+- rr->length = 0;
+- goto start;
+- }
+-#endif
+ al = SSL_AD_UNEXPECTED_MESSAGE;
+ SSLerr(SSL_F_SSL3_READ_BYTES, SSL_R_UNEXPECTED_RECORD);
+ goto f_err;
+Index: openssl-1.0.1t/ssl/d1_pkt.c
+===================================================================
+--- openssl-1.0.1t.orig/ssl/d1_pkt.c
++++ openssl-1.0.1t/ssl/d1_pkt.c
+@@ -924,6 +924,13 @@ int dtls1_read_bytes(SSL *s, int type, u
+ goto start;
+ }
+
++ /*
++ * Reset the count of consecutive warning alerts if we've got a non-empty
++ * record that isn't an alert.
++ */
++ if (rr->type != SSL3_RT_ALERT && rr->length != 0)
++ s->cert->alert_count = 0;
++
+ /* we now have a packet which can be read and processed */
+
+ if (s->s3->change_cipher_spec /* set when we receive ChangeCipherSpec,
+@@ -1190,6 +1197,14 @@ int dtls1_read_bytes(SSL *s, int type, u
+
+ if (alert_level == SSL3_AL_WARNING) {
+ s->s3->warn_alert = alert_descr;
++
++ s->cert->alert_count++;
++ if (s->cert->alert_count == MAX_WARN_ALERT_COUNT) {
++ al = SSL_AD_UNEXPECTED_MESSAGE;
++ SSLerr(SSL_F_DTLS1_READ_BYTES, SSL_R_TOO_MANY_WARN_ALERTS);
++ goto f_err;
++ }
++
+ if (alert_descr == SSL_AD_CLOSE_NOTIFY) {
+ #ifndef OPENSSL_NO_SCTP
+ /*
+Index: openssl-1.0.1t/ssl/ssl.h
+===================================================================
+--- openssl-1.0.1t.orig/ssl/ssl.h
++++ openssl-1.0.1t/ssl/ssl.h
+@@ -2719,6 +2719,7 @@ void ERR_load_SSL_strings(void);
+ # define SSL_R_TLS_INVALID_ECPOINTFORMAT_LIST 157
+ # define SSL_R_TLS_PEER_DID_NOT_RESPOND_WITH_CERTIFICATE_LIST 233
+ # define SSL_R_TLS_RSA_ENCRYPTED_VALUE_LENGTH_IS_WRONG 234
++# define SSL_R_TOO_MANY_WARN_ALERTS 409
+ # define SSL_R_TRIED_TO_USE_UNSUPPORTED_CIPHER 235
+ # define SSL_R_UNABLE_TO_DECODE_DH_CERTS 236
+ # define SSL_R_UNABLE_TO_DECODE_ECDH_CERTS 313
+Index: openssl-1.0.1t/ssl/ssl_locl.h
+===================================================================
+--- openssl-1.0.1t.orig/ssl/ssl_locl.h
++++ openssl-1.0.1t/ssl/ssl_locl.h
+@@ -492,6 +492,8 @@
+ #define CERT_PRIVATE_KEY 2
+ */
+
++# define MAX_WARN_ALERT_COUNT 5
++
+ # ifndef OPENSSL_NO_EC
+ /*
+ * From ECC-TLS draft, used in encoding the curve type in ECParameters
+@@ -540,6 +542,8 @@ typedef struct cert_st {
+ # endif
+ CERT_PKEY pkeys[SSL_PKEY_NUM];
+ int references; /* >1 only if SSL_copy_session_id is used */
++ /* Count of the number of consecutive warning alerts received */
++ unsigned int alert_count;
+ } CERT;
+
+ typedef struct sess_cert_st {
diff -Nru openssl-1.0.1t/debian/patches/CVE-2017-3731.patch openssl-1.0.1t/debian/patches/CVE-2017-3731.patch
--- openssl-1.0.1t/debian/patches/CVE-2017-3731.patch 1970-01-01 01:00:00.000000000 +0100
+++ openssl-1.0.1t/debian/patches/CVE-2017-3731.patch 2017-01-31 22:03:37.000000000 +0100
@@ -0,0 +1,40 @@
+From 51d009043670a627d6abe66894126851cf3690e9 Mon Sep 17 00:00:00 2001
+From: Andy Polyakov <appro at openssl.org>
+Date: Thu, 19 Jan 2017 00:17:30 +0100
+Subject: [PATCH] crypto/evp: harden RC4_MD5 cipher.
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Originally a crash in 32-bit build was reported CHACHA20-POLY1305
+cipher. The crash is triggered by truncated packet and is result
+of excessive hashing to the edge of accessible memory (or bogus
+MAC value is produced if x86 MD5 assembly module is involved). Since
+hash operation is read-only it is not considered to be exploitable
+beyond a DoS condition.
+
+Thanks to Robert Święcki for report.
+
+CVE-2017-3731
+
+Reviewed-by: Rich Salz <rsalz at openssl.org>
+---
+ crypto/evp/e_rc4_hmac_md5.c | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/crypto/evp/e_rc4_hmac_md5.c b/crypto/evp/e_rc4_hmac_md5.c
+index 5e92855dfd..93cfe3f107 100644
+--- a/crypto/evp/e_rc4_hmac_md5.c
++++ b/crypto/evp/e_rc4_hmac_md5.c
+@@ -269,6 +269,8 @@ static int rc4_hmac_md5_ctrl(EVP_CIPHER_CTX *ctx, int type, int arg,
+ len = p[arg - 2] << 8 | p[arg - 1];
+
+ if (!ctx->encrypt) {
++ if (len < MD5_DIGEST_LENGTH)
++ return -1;
+ len -= MD5_DIGEST_LENGTH;
+ p[arg - 2] = len >> 8;
+ p[arg - 1] = len;
+--
+2.11.0
+
diff -Nru openssl-1.0.1t/debian/patches/series openssl-1.0.1t/debian/patches/series
--- openssl-1.0.1t/debian/patches/series 2016-09-25 11:47:03.000000000 +0200
+++ openssl-1.0.1t/debian/patches/series 2017-01-31 22:03:37.000000000 +0100
@@ -31,3 +31,6 @@
CVE-2016-6303.patch
CVE-2016-6304.patch
CVE-2016-6306.patch
+CVE-2016-8610.patch
+CVE-2017-3731.patch
+CVE-2016-7056.patch
More information about the Pkg-openssl-devel
mailing list