From: Martin Jansa <martin.jansa@gmail.com>
To: openembedded-core@lists.openembedded.org,
Armin Kuster <akuster@mvista.com>
Cc: openembedded-commits@lists.openembedded.org
Subject: Re: [oe-commits] [openembedded-core] 02/20: openssl: Security fix CVE-2016-2177
Date: Thu, 22 Dec 2016 16:21:30 +0100 [thread overview]
Message-ID: <20161222152130.GD3544@jama> (raw)
In-Reply-To: <20160923222225.E2A2A50174@opal.openembedded.org>
[-- Attachment #1: Type: text/plain, Size: 12784 bytes --]
On Fri, Sep 23, 2016 at 10:22:26PM +0000, git@git.openembedded.org wrote:
> rpurdie pushed a commit to branch jethro
> in repository openembedded-core.
This change and CVE-2016-8610.patch seems to be missing in krogoth branch.
OE @ ~/openembedded-core $ git diff origin/jethro origin/krogoth -- meta/recipes-connectivity/openssl/openssl_1.0.2h.bb | grep CVE
- file://CVE-2016-2177.patch \
- file://CVE-2016-2178.patch \
+ file://CVE-2016-2178.patch \
+ file://CVE-2016-2179.patch \
file://CVE-2016-2180.patch \
file://CVE-2016-2181_p1.patch \
file://CVE-2016-2181_p2.patch \
file://CVE-2016-6303.patch \
file://CVE-2016-6304.patch \
file://CVE-2016-6306.patch \
- file://CVE-2016-2179.patch \
- file://CVE-2016-8610.patch \
Is there some pending pull request for krogoth? There is also that tzdata version lower in krogoth than jethro I've reported a while ago:
OE @ ~/openembedded-core $ git diff origin/jethro origin/krogoth -- meta/recipes-extended/tzdata/
diff --git a/meta/recipes-extended/tzdata/tzdata_2016i.bb b/meta/recipes-extended/tzdata/tzdata_2016g.bb
similarity index 94%
rename from meta/recipes-extended/tzdata/tzdata_2016i.bb
rename to meta/recipes-extended/tzdata/tzdata_2016g.bb
> commit 5781eb9a6e6bf8984b090a488d2a326bf9fafcf8
> Author: Armin Kuster <akuster@mvista.com>
> AuthorDate: Sat Jul 16 16:04:11 2016 -0700
>
> openssl: Security fix CVE-2016-2177
>
> Affects openssl <= 1.0.2h
> CVSS v2 Base Score: 7.5 HIGH
>
> Signed-off-by: Armin Kuster <akuster@mvista.com>
> Signed-off-by: Ross Burton <ross.burton@intel.com>
> (cherry picked from commit 2848c7d3e454cbc84cba9183f23ccdf3e9200ec9)
> Signed-off-by: Armin Kuster <akuster808@gmail.com>
> ---
> .../openssl/openssl/CVE-2016-2177.patch | 286 +++++++++++++++++++++
> .../recipes-connectivity/openssl/openssl_1.0.2h.bb | 1 +
> 2 files changed, 287 insertions(+)
>
> diff --git a/meta/recipes-connectivity/openssl/openssl/CVE-2016-2177.patch b/meta/recipes-connectivity/openssl/openssl/CVE-2016-2177.patch
> new file mode 100644
> index 0000000..df36d5f
> --- /dev/null
> +++ b/meta/recipes-connectivity/openssl/openssl/CVE-2016-2177.patch
> @@ -0,0 +1,286 @@
> +From a004e72b95835136d3f1ea90517f706c24c03da7 Mon Sep 17 00:00:00 2001
> +From: Matt Caswell <matt@openssl.org>
> +Date: Thu, 5 May 2016 11:10:26 +0100
> +Subject: [PATCH] Avoid some undefined pointer arithmetic
> +
> +A common idiom in the codebase is:
> +
> +if (p + len > limit)
> +{
> + return; /* Too long */
> +}
> +
> +Where "p" points to some malloc'd data of SIZE bytes and
> +limit == p + SIZE
> +
> +"len" here could be from some externally supplied data (e.g. from a TLS
> +message).
> +
> +The rules of C pointer arithmetic are such that "p + len" is only well
> +defined where len <= SIZE. Therefore the above idiom is actually
> +undefined behaviour.
> +
> +For example this could cause problems if some malloc implementation
> +provides an address for "p" such that "p + len" actually overflows for
> +values of len that are too big and therefore p + len < limit!
> +
> +Issue reported by Guido Vranken.
> +
> +CVE-2016-2177
> +
> +Reviewed-by: Rich Salz <rsalz@openssl.org>
> +
> +Upstream-Status: Backport
> +CVE: CVE-2016-2177
> +
> +Signed-off-by: Armin Kuster <akuster@mvista.com>
> +
> +
> +---
> + ssl/s3_srvr.c | 14 +++++++-------
> + ssl/ssl_sess.c | 2 +-
> + ssl/t1_lib.c | 56 ++++++++++++++++++++++++++++++--------------------------
> + 3 files changed, 38 insertions(+), 34 deletions(-)
> +
> +diff --git a/ssl/s3_srvr.c b/ssl/s3_srvr.c
> +index ab28702..ab7f690 100644
> +--- a/ssl/s3_srvr.c
> ++++ b/ssl/s3_srvr.c
> +@@ -980,7 +980,7 @@ int ssl3_get_client_hello(SSL *s)
> +
> + session_length = *(p + SSL3_RANDOM_SIZE);
> +
> +- if (p + SSL3_RANDOM_SIZE + session_length + 1 >= d + n) {
> ++ if (SSL3_RANDOM_SIZE + session_length + 1 >= (d + n) - p) {
> + al = SSL_AD_DECODE_ERROR;
> + SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO, SSL_R_LENGTH_TOO_SHORT);
> + goto f_err;
> +@@ -998,7 +998,7 @@ int ssl3_get_client_hello(SSL *s)
> + /* get the session-id */
> + j = *(p++);
> +
> +- if (p + j > d + n) {
> ++ if ((d + n) - p < j) {
> + al = SSL_AD_DECODE_ERROR;
> + SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO, SSL_R_LENGTH_TOO_SHORT);
> + goto f_err;
> +@@ -1054,14 +1054,14 @@ int ssl3_get_client_hello(SSL *s)
> +
> + if (SSL_IS_DTLS(s)) {
> + /* cookie stuff */
> +- if (p + 1 > d + n) {
> ++ if ((d + n) - p < 1) {
> + al = SSL_AD_DECODE_ERROR;
> + SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO, SSL_R_LENGTH_TOO_SHORT);
> + goto f_err;
> + }
> + cookie_len = *(p++);
> +
> +- if (p + cookie_len > d + n) {
> ++ if ((d + n ) - p < cookie_len) {
> + al = SSL_AD_DECODE_ERROR;
> + SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO, SSL_R_LENGTH_TOO_SHORT);
> + goto f_err;
> +@@ -1131,7 +1131,7 @@ int ssl3_get_client_hello(SSL *s)
> + }
> + }
> +
> +- if (p + 2 > d + n) {
> ++ if ((d + n ) - p < 2) {
> + al = SSL_AD_DECODE_ERROR;
> + SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO, SSL_R_LENGTH_TOO_SHORT);
> + goto f_err;
> +@@ -1145,7 +1145,7 @@ int ssl3_get_client_hello(SSL *s)
> + }
> +
> + /* i bytes of cipher data + 1 byte for compression length later */
> +- if ((p + i + 1) > (d + n)) {
> ++ if ((d + n) - p < i + 1) {
> + /* not enough data */
> + al = SSL_AD_DECODE_ERROR;
> + SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO, SSL_R_LENGTH_MISMATCH);
> +@@ -1211,7 +1211,7 @@ int ssl3_get_client_hello(SSL *s)
> +
> + /* compression */
> + i = *(p++);
> +- if ((p + i) > (d + n)) {
> ++ if ((d + n) - p < i) {
> + /* not enough data */
> + al = SSL_AD_DECODE_ERROR;
> + SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO, SSL_R_LENGTH_MISMATCH);
> +diff --git a/ssl/ssl_sess.c b/ssl/ssl_sess.c
> +index b182998..54ee783 100644
> +--- a/ssl/ssl_sess.c
> ++++ b/ssl/ssl_sess.c
> +@@ -573,7 +573,7 @@ int ssl_get_prev_session(SSL *s, unsigned char *session_id, int len,
> + int r;
> + #endif
> +
> +- if (session_id + len > limit) {
> ++ if (limit - session_id < len) {
> + fatal = 1;
> + goto err;
> + }
> +diff --git a/ssl/t1_lib.c b/ssl/t1_lib.c
> +index fb64607..cdac011 100644
> +--- a/ssl/t1_lib.c
> ++++ b/ssl/t1_lib.c
> +@@ -1867,11 +1867,11 @@ static void ssl_check_for_safari(SSL *s, const unsigned char *data,
> + 0x02, 0x03, /* SHA-1/ECDSA */
> + };
> +
> +- if (data >= (limit - 2))
> ++ if (limit - data <= 2)
> + return;
> + data += 2;
> +
> +- if (data > (limit - 4))
> ++ if (limit - data < 4)
> + return;
> + n2s(data, type);
> + n2s(data, size);
> +@@ -1879,7 +1879,7 @@ static void ssl_check_for_safari(SSL *s, const unsigned char *data,
> + if (type != TLSEXT_TYPE_server_name)
> + return;
> +
> +- if (data + size > limit)
> ++ if (limit - data < size)
> + return;
> + data += size;
> +
> +@@ -1887,7 +1887,7 @@ static void ssl_check_for_safari(SSL *s, const unsigned char *data,
> + const size_t len1 = sizeof(kSafariExtensionsBlock);
> + const size_t len2 = sizeof(kSafariTLS12ExtensionsBlock);
> +
> +- if (data + len1 + len2 != limit)
> ++ if (limit - data != (int)(len1 + len2))
> + return;
> + if (memcmp(data, kSafariExtensionsBlock, len1) != 0)
> + return;
> +@@ -1896,7 +1896,7 @@ static void ssl_check_for_safari(SSL *s, const unsigned char *data,
> + } else {
> + const size_t len = sizeof(kSafariExtensionsBlock);
> +
> +- if (data + len != limit)
> ++ if (limit - data != (int)(len))
> + return;
> + if (memcmp(data, kSafariExtensionsBlock, len) != 0)
> + return;
> +@@ -2053,19 +2053,19 @@ static int ssl_scan_clienthello_tlsext(SSL *s, unsigned char **p,
> + if (data == limit)
> + goto ri_check;
> +
> +- if (data > (limit - 2))
> ++ if (limit - data < 2)
> + goto err;
> +
> + n2s(data, len);
> +
> +- if (data + len != limit)
> ++ if (limit - data != len)
> + goto err;
> +
> +- while (data <= (limit - 4)) {
> ++ while (limit - data >= 4) {
> + n2s(data, type);
> + n2s(data, size);
> +
> +- if (data + size > (limit))
> ++ if (limit - data < size)
> + goto err;
> + # if 0
> + fprintf(stderr, "Received extension type %d size %d\n", type, size);
> +@@ -2472,18 +2472,18 @@ static int ssl_scan_clienthello_custom_tlsext(SSL *s,
> + if (s->hit || s->cert->srv_ext.meths_count == 0)
> + return 1;
> +
> +- if (data >= limit - 2)
> ++ if (limit - data <= 2)
> + return 1;
> + n2s(data, len);
> +
> +- if (data > limit - len)
> ++ if (limit - data < len)
> + return 1;
> +
> +- while (data <= limit - 4) {
> ++ while (limit - data >= 4) {
> + n2s(data, type);
> + n2s(data, size);
> +
> +- if (data + size > limit)
> ++ if (limit - data < size)
> + return 1;
> + if (custom_ext_parse(s, 1 /* server */ , type, data, size, al) <= 0)
> + return 0;
> +@@ -2569,20 +2569,20 @@ static int ssl_scan_serverhello_tlsext(SSL *s, unsigned char **p,
> + SSL_TLSEXT_HB_DONT_SEND_REQUESTS);
> + # endif
> +
> +- if (data >= (d + n - 2))
> ++ if ((d + n) - data <= 2)
> + goto ri_check;
> +
> + n2s(data, length);
> +- if (data + length != d + n) {
> ++ if ((d + n) - data != length) {
> + *al = SSL_AD_DECODE_ERROR;
> + return 0;
> + }
> +
> +- while (data <= (d + n - 4)) {
> ++ while ((d + n) - data >= 4) {
> + n2s(data, type);
> + n2s(data, size);
> +
> +- if (data + size > (d + n))
> ++ if ((d + n) - data < size)
> + goto ri_check;
> +
> + if (s->tlsext_debug_cb)
> +@@ -3307,29 +3307,33 @@ int tls1_process_ticket(SSL *s, unsigned char *session_id, int len,
> + /* Skip past DTLS cookie */
> + if (SSL_IS_DTLS(s)) {
> + i = *(p++);
> +- p += i;
> +- if (p >= limit)
> ++
> ++ if (limit - p <= i)
> + return -1;
> ++
> ++ p += i;
> + }
> + /* Skip past cipher list */
> + n2s(p, i);
> +- p += i;
> +- if (p >= limit)
> ++ if (limit - p <= i)
> + return -1;
> ++ p += i;
> ++
> + /* Skip past compression algorithm list */
> + i = *(p++);
> +- p += i;
> +- if (p > limit)
> ++ if (limit - p < i)
> + return -1;
> ++ p += i;
> ++
> + /* Now at start of extensions */
> +- if ((p + 2) >= limit)
> ++ if (limit - p <= 2)
> + return 0;
> + n2s(p, i);
> +- while ((p + 4) <= limit) {
> ++ while (limit - p >= 4) {
> + unsigned short type, size;
> + n2s(p, type);
> + n2s(p, size);
> +- if (p + size > limit)
> ++ if (limit - p < size)
> + return 0;
> + if (type == TLSEXT_TYPE_session_ticket) {
> + int r;
> +--
> +2.3.5
> +
> diff --git a/meta/recipes-connectivity/openssl/openssl_1.0.2h.bb b/meta/recipes-connectivity/openssl/openssl_1.0.2h.bb
> index ea40275..4135a31 100644
> --- a/meta/recipes-connectivity/openssl/openssl_1.0.2h.bb
> +++ b/meta/recipes-connectivity/openssl/openssl_1.0.2h.bb
> @@ -38,6 +38,7 @@ SRC_URI += "file://configure-targets.patch \
> file://openssl-1.0.2a-x32-asm.patch \
> file://ptest_makefile_deps.patch \
> file://parallel.patch \
> + file://CVE-2016-2177.patch \
> "
>
> SRC_URI[md5sum] = "9392e65072ce4b614c1392eefc1f23d0"
>
> --
> To stop receiving notification emails like this one, please contact
> the administrator of this repository.
> --
> _______________________________________________
> Openembedded-commits mailing list
> Openembedded-commits@lists.openembedded.org
> http://lists.openembedded.org/mailman/listinfo/openembedded-commits
--
Martin 'JaMa' Jansa jabber: Martin.Jansa@gmail.com
[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 201 bytes --]
next parent reply other threads:[~2016-12-22 15:21 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <20160923222224.3285.13563@opal.openembedded.org>
[not found] ` <20160923222225.E2A2A50174@opal.openembedded.org>
2016-12-22 15:21 ` Martin Jansa [this message]
2017-01-02 17:43 ` [oe-commits] [openembedded-core] 02/20: openssl: Security fix CVE-2016-2177 akuster808
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20161222152130.GD3544@jama \
--to=martin.jansa@gmail.com \
--cc=akuster@mvista.com \
--cc=openembedded-commits@lists.openembedded.org \
--cc=openembedded-core@lists.openembedded.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.