gurligebis    15/05/08 18:14:59

  Added:               
                        
0005-EAP-pwd-peer-Fix-asymmetric-fragmentation-behavior.patch
                        
0001-EAP-pwd-peer-Fix-payload-length-validation-for-Commi.patch
                        
0002-EAP-pwd-server-Fix-payload-length-validation-for-Com.patch
                        
0004-EAP-pwd-server-Fix-Total-Length-parsing-for-fragment.patch
                        
0003-EAP-pwd-peer-Fix-Total-Length-parsing-for-fragment-r.patch
  Log:
  Removing old version and fixing bug #548744
  
  (Portage version: 2.2.18/cvs/Linux x86_64, signed Manifest commit with key 
15AE484C)

Revision  Changes    Path
1.1                  
net-wireless/hostapd/files/2015-4/0005-EAP-pwd-peer-Fix-asymmetric-fragmentation-behavior.patch

file : 
http://sources.gentoo.org/viewvc.cgi/gentoo-x86/net-wireless/hostapd/files/2015-4/0005-EAP-pwd-peer-Fix-asymmetric-fragmentation-behavior.patch?rev=1.1&view=markup
plain: 
http://sources.gentoo.org/viewvc.cgi/gentoo-x86/net-wireless/hostapd/files/2015-4/0005-EAP-pwd-peer-Fix-asymmetric-fragmentation-behavior.patch?rev=1.1&content-type=text/plain

Index: 0005-EAP-pwd-peer-Fix-asymmetric-fragmentation-behavior.patch
===================================================================
>From 28a069a545b06b99eb55ad53f63f2c99e65a98f6 Mon Sep 17 00:00:00 2001
From: Jouni Malinen <j...@w1.fi>
Date: Sat, 2 May 2015 19:26:28 +0300
Subject: [PATCH 5/5] EAP-pwd peer: Fix asymmetric fragmentation behavior

The L (Length) and M (More) flags needs to be cleared before deciding
whether the locally generated response requires fragmentation. This
fixes an issue where these flags from the server could have been invalid
for the following message. In some cases, this could have resulted in
triggering the wpabuf security check that would terminate the process
due to invalid buffer allocation.

Signed-off-by: Jouni Malinen <j...@w1.fi>
---
 src/eap_peer/eap_pwd.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/src/eap_peer/eap_pwd.c b/src/eap_peer/eap_pwd.c
index 1d2079b..e58b13a 100644
--- a/src/eap_peer/eap_pwd.c
+++ b/src/eap_peer/eap_pwd.c
@@ -968,6 +968,7 @@ eap_pwd_process(struct eap_sm *sm, void *priv, struct 
eap_method_ret *ret,
        /*
         * we have output! Do we need to fragment it?
         */
+       lm_exch = EAP_PWD_GET_EXCHANGE(lm_exch);
        len = wpabuf_len(data->outbuf);
        if ((len + EAP_PWD_HDR_SIZE) > data->mtu) {
                resp = eap_msg_alloc(EAP_VENDOR_IETF, EAP_TYPE_PWD, data->mtu,
-- 
1.9.1




1.1                  
net-wireless/hostapd/files/2015-4/0001-EAP-pwd-peer-Fix-payload-length-validation-for-Commi.patch

file : 
http://sources.gentoo.org/viewvc.cgi/gentoo-x86/net-wireless/hostapd/files/2015-4/0001-EAP-pwd-peer-Fix-payload-length-validation-for-Commi.patch?rev=1.1&view=markup
plain: 
http://sources.gentoo.org/viewvc.cgi/gentoo-x86/net-wireless/hostapd/files/2015-4/0001-EAP-pwd-peer-Fix-payload-length-validation-for-Commi.patch?rev=1.1&content-type=text/plain

Index: 0001-EAP-pwd-peer-Fix-payload-length-validation-for-Commi.patch
===================================================================
>From dd2f043c9c43d156494e33d7ce22db96e6ef42c7 Mon Sep 17 00:00:00 2001
From: Jouni Malinen <j...@w1.fi>
Date: Fri, 1 May 2015 16:37:45 +0300
Subject: [PATCH 1/5] EAP-pwd peer: Fix payload length validation for Commit
 and Confirm

The length of the received Commit and Confirm message payloads was not
checked before reading them. This could result in a buffer read
overflow when processing an invalid message.

Fix this by verifying that the payload is of expected length before
processing it. In addition, enforce correct state transition sequence to
make sure there is no unexpected behavior if receiving a Commit/Confirm
message before the previous exchanges have been completed.

Thanks to Kostya Kortchinsky of Google security team for discovering and
reporting this issue.

Signed-off-by: Jouni Malinen <j...@w1.fi>
---
 src/eap_peer/eap_pwd.c | 29 +++++++++++++++++++++++++++++
 1 file changed, 29 insertions(+)

diff --git a/src/eap_peer/eap_pwd.c b/src/eap_peer/eap_pwd.c
index f2b0926..a629437 100644
--- a/src/eap_peer/eap_pwd.c
+++ b/src/eap_peer/eap_pwd.c
@@ -355,6 +355,23 @@ eap_pwd_perform_commit_exchange(struct eap_sm *sm, struct 
eap_pwd_data *data,
        BIGNUM *mask = NULL, *x = NULL, *y = NULL, *cofactor = NULL;
        u16 offset;
        u8 *ptr, *scalar = NULL, *element = NULL;
+       size_t prime_len, order_len;
+
+       if (data->state != PWD_Commit_Req) {
+               ret->ignore = TRUE;
+               goto fin;
+       }
+
+       prime_len = BN_num_bytes(data->grp->prime);
+       order_len = BN_num_bytes(data->grp->order);
+
+       if (payload_len != 2 * prime_len + order_len) {
+               wpa_printf(MSG_INFO,
+                          "EAP-pwd: Unexpected Commit payload length %u 
(expected %u)",
+                          (unsigned int) payload_len,
+                          (unsigned int) (2 * prime_len + order_len));
+               goto fin;
+       }
 
        if (((data->private_value = BN_new()) == NULL) ||
            ((data->my_element = EC_POINT_new(data->grp->group)) == NULL) ||
@@ -554,6 +571,18 @@ eap_pwd_perform_confirm_exchange(struct eap_sm *sm, struct 
eap_pwd_data *data,
        u8 conf[SHA256_MAC_LEN], *cruft = NULL, *ptr;
        int offset;
 
+       if (data->state != PWD_Confirm_Req) {
+               ret->ignore = TRUE;
+               goto fin;
+       }
+
+       if (payload_len != SHA256_MAC_LEN) {
+               wpa_printf(MSG_INFO,
+                          "EAP-pwd: Unexpected Confirm payload length %u 
(expected %u)",
+                          (unsigned int) payload_len, SHA256_MAC_LEN);
+               goto fin;
+       }
+
        /*
         * first build up the ciphersuite which is group | random_function |
         *      prf
-- 
1.9.1




1.1                  
net-wireless/hostapd/files/2015-4/0002-EAP-pwd-server-Fix-payload-length-validation-for-Com.patch

file : 
http://sources.gentoo.org/viewvc.cgi/gentoo-x86/net-wireless/hostapd/files/2015-4/0002-EAP-pwd-server-Fix-payload-length-validation-for-Com.patch?rev=1.1&view=markup
plain: 
http://sources.gentoo.org/viewvc.cgi/gentoo-x86/net-wireless/hostapd/files/2015-4/0002-EAP-pwd-server-Fix-payload-length-validation-for-Com.patch?rev=1.1&content-type=text/plain

Index: 0002-EAP-pwd-server-Fix-payload-length-validation-for-Com.patch
===================================================================
>From e28a58be26184c2a23f80b410e0997ef1bd5d578 Mon Sep 17 00:00:00 2001
From: Jouni Malinen <j...@w1.fi>
Date: Fri, 1 May 2015 16:40:44 +0300
Subject: [PATCH 2/5] EAP-pwd server: Fix payload length validation for Commit
 and Confirm

The length of the received Commit and Confirm message payloads was not
checked before reading them. This could result in a buffer read
overflow when processing an invalid message.

Fix this by verifying that the payload is of expected length before
processing it. In addition, enforce correct state transition sequence to
make sure there is no unexpected behavior if receiving a Commit/Confirm
message before the previous exchanges have been completed.

Thanks to Kostya Kortchinsky of Google security team for discovering and
reporting this issue.

Signed-off-by: Jouni Malinen <j...@w1.fi>
---
 src/eap_server/eap_server_pwd.c | 19 +++++++++++++++++++
 1 file changed, 19 insertions(+)

diff --git a/src/eap_server/eap_server_pwd.c b/src/eap_server/eap_server_pwd.c
index 66bd5d2..3189105 100644
--- a/src/eap_server/eap_server_pwd.c
+++ b/src/eap_server/eap_server_pwd.c
@@ -656,9 +656,21 @@ eap_pwd_process_commit_resp(struct eap_sm *sm, struct 
eap_pwd_data *data,
        BIGNUM *x = NULL, *y = NULL, *cofactor = NULL;
        EC_POINT *K = NULL, *point = NULL;
        int res = 0;
+       size_t prime_len, order_len;
 
        wpa_printf(MSG_DEBUG, "EAP-pwd: Received commit response");
 
+       prime_len = BN_num_bytes(data->grp->prime);
+       order_len = BN_num_bytes(data->grp->order);
+
+       if (payload_len != 2 * prime_len + order_len) {
+               wpa_printf(MSG_INFO,
+                          "EAP-pwd: Unexpected Commit payload length %u 
(expected %u)",
+                          (unsigned int) payload_len,
+                          (unsigned int) (2 * prime_len + order_len));
+               goto fin;
+       }
+
        if (((data->peer_scalar = BN_new()) == NULL) ||
            ((data->k = BN_new()) == NULL) ||
            ((cofactor = BN_new()) == NULL) ||
@@ -774,6 +786,13 @@ eap_pwd_process_confirm_resp(struct eap_sm *sm, struct 
eap_pwd_data *data,
        u8 conf[SHA256_MAC_LEN], *cruft = NULL, *ptr;
        int offset;
 
+       if (payload_len != SHA256_MAC_LEN) {
+               wpa_printf(MSG_INFO,
+                          "EAP-pwd: Unexpected Confirm payload length %u 
(expected %u)",
+                          (unsigned int) payload_len, SHA256_MAC_LEN);
+               goto fin;
+       }
+
        /* build up the ciphersuite: group | random_function | prf */
        grp = htons(data->group_num);
        ptr = (u8 *) &cs;
-- 
1.9.1




1.1                  
net-wireless/hostapd/files/2015-4/0004-EAP-pwd-server-Fix-Total-Length-parsing-for-fragment.patch

file : 
http://sources.gentoo.org/viewvc.cgi/gentoo-x86/net-wireless/hostapd/files/2015-4/0004-EAP-pwd-server-Fix-Total-Length-parsing-for-fragment.patch?rev=1.1&view=markup
plain: 
http://sources.gentoo.org/viewvc.cgi/gentoo-x86/net-wireless/hostapd/files/2015-4/0004-EAP-pwd-server-Fix-Total-Length-parsing-for-fragment.patch?rev=1.1&content-type=text/plain

Index: 0004-EAP-pwd-server-Fix-Total-Length-parsing-for-fragment.patch
===================================================================
>From 3035cc2894e08319b905bd6561e8bddc8c2db9fa Mon Sep 17 00:00:00 2001
From: Jouni Malinen <j...@w1.fi>
Date: Sat, 2 May 2015 19:26:06 +0300
Subject: [PATCH 4/5] EAP-pwd server: Fix Total-Length parsing for fragment
 reassembly

The remaining number of bytes in the message could be smaller than the
Total-Length field size, so the length needs to be explicitly checked
prior to reading the field and decrementing the len variable. This could
have resulted in the remaining length becoming negative and interpreted
as a huge positive integer.

In addition, check that there is no already started fragment in progress
before allocating a new buffer for reassembling fragments. This avoid a
potential memory leak when processing invalid message.

Signed-off-by: Jouni Malinen <j...@w1.fi>
---
 src/eap_server/eap_server_pwd.c | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/src/eap_server/eap_server_pwd.c b/src/eap_server/eap_server_pwd.c
index 3189105..2bfc3c2 100644
--- a/src/eap_server/eap_server_pwd.c
+++ b/src/eap_server/eap_server_pwd.c
@@ -942,11 +942,21 @@ static void eap_pwd_process(struct eap_sm *sm, void *priv,
         * the first fragment has a total length
         */
        if (EAP_PWD_GET_LENGTH_BIT(lm_exch)) {
+               if (len < 2) {
+                       wpa_printf(MSG_DEBUG,
+                                  "EAP-pwd: Frame too short to contain 
Total-Length field");
+                       return;
+               }
                tot_len = WPA_GET_BE16(pos);
                wpa_printf(MSG_DEBUG, "EAP-pwd: Incoming fragments, total "
                           "length = %d", tot_len);
                if (tot_len > 15000)
                        return;
+               if (data->inbuf) {
+                       wpa_printf(MSG_DEBUG,
+                                  "EAP-pwd: Unexpected new fragment start when 
previous fragment is still in use");
+                       return;
+               }
                data->inbuf = wpabuf_alloc(tot_len);
                if (data->inbuf == NULL) {
                        wpa_printf(MSG_INFO, "EAP-pwd: Out of memory to "
-- 
1.9.1




1.1                  
net-wireless/hostapd/files/2015-4/0003-EAP-pwd-peer-Fix-Total-Length-parsing-for-fragment-r.patch

file : 
http://sources.gentoo.org/viewvc.cgi/gentoo-x86/net-wireless/hostapd/files/2015-4/0003-EAP-pwd-peer-Fix-Total-Length-parsing-for-fragment-r.patch?rev=1.1&view=markup
plain: 
http://sources.gentoo.org/viewvc.cgi/gentoo-x86/net-wireless/hostapd/files/2015-4/0003-EAP-pwd-peer-Fix-Total-Length-parsing-for-fragment-r.patch?rev=1.1&content-type=text/plain

Index: 0003-EAP-pwd-peer-Fix-Total-Length-parsing-for-fragment-r.patch
===================================================================
>From 477c74395acd0123340457ba6f15ab345d42016e Mon Sep 17 00:00:00 2001
From: Jouni Malinen <j...@w1.fi>
Date: Sat, 2 May 2015 19:23:04 +0300
Subject: [PATCH 3/5] EAP-pwd peer: Fix Total-Length parsing for fragment
 reassembly

The remaining number of bytes in the message could be smaller than the
Total-Length field size, so the length needs to be explicitly checked
prior to reading the field and decrementing the len variable. This could
have resulted in the remaining length becoming negative and interpreted
as a huge positive integer.

In addition, check that there is no already started fragment in progress
before allocating a new buffer for reassembling fragments. This avoid a
potential memory leak when processing invalid message.

Signed-off-by: Jouni Malinen <j...@w1.fi>
---
 src/eap_peer/eap_pwd.c | 12 ++++++++++++
 1 file changed, 12 insertions(+)

diff --git a/src/eap_peer/eap_pwd.c b/src/eap_peer/eap_pwd.c
index a629437..1d2079b 100644
--- a/src/eap_peer/eap_pwd.c
+++ b/src/eap_peer/eap_pwd.c
@@ -866,11 +866,23 @@ eap_pwd_process(struct eap_sm *sm, void *priv, struct 
eap_method_ret *ret,
         * if it's the first fragment there'll be a length field
         */
        if (EAP_PWD_GET_LENGTH_BIT(lm_exch)) {
+               if (len < 2) {
+                       wpa_printf(MSG_DEBUG,
+                                  "EAP-pwd: Frame too short to contain 
Total-Length field");
+                       ret->ignore = TRUE;
+                       return NULL;
+               }
                tot_len = WPA_GET_BE16(pos);
                wpa_printf(MSG_DEBUG, "EAP-pwd: Incoming fragments whose "
                           "total length = %d", tot_len);
                if (tot_len > 15000)
                        return NULL;
+               if (data->inbuf) {
+                       wpa_printf(MSG_DEBUG,
+                                  "EAP-pwd: Unexpected new fragment start when 
previous fragment is still in use");
+                       ret->ignore = TRUE;
+                       return NULL;
+               }
                data->inbuf = wpabuf_alloc(tot_len);
                if (data->inbuf == NULL) {
                        wpa_printf(MSG_INFO, "Out of memory to buffer "
-- 
1.9.1





Reply via email to