Blame SOURCES/rh1495527-0004-Prevent-installation-of-an-all-zero-TK.patch

92bdd1
From 8f82bc94e8697a9d47fa8774dfdaaede1084912c Mon Sep 17 00:00:00 2001
92bdd1
From: Mathy Vanhoef <Mathy.Vanhoef@cs.kuleuven.be>
92bdd1
Date: Fri, 29 Sep 2017 04:22:51 +0200
92bdd1
Subject: [PATCH 4/8] Prevent installation of an all-zero TK
92bdd1
92bdd1
Properly track whether a PTK has already been installed to the driver
92bdd1
and the TK part cleared from memory. This prevents an attacker from
92bdd1
trying to trick the client into installing an all-zero TK.
92bdd1
92bdd1
This fixes the earlier fix in commit
92bdd1
ad00d64e7d8827b3cebd665a0ceb08adabf15e1e ('Fix TK configuration to the
92bdd1
driver in EAPOL-Key 3/4 retry case') which did not take into account
92bdd1
possibility of an extra message 1/4 showing up between retries of
92bdd1
message 3/4.
92bdd1
92bdd1
Signed-off-by: Mathy Vanhoef <Mathy.Vanhoef@cs.kuleuven.be>
92bdd1
---
92bdd1
 src/common/wpa_common.h | 1 +
92bdd1
 src/rsn_supp/wpa.c      | 5 ++---
92bdd1
 src/rsn_supp/wpa_i.h    | 1 -
92bdd1
 3 files changed, 3 insertions(+), 4 deletions(-)
92bdd1
92bdd1
diff --git a/src/common/wpa_common.h b/src/common/wpa_common.h
92bdd1
index d200285..1021ccb 100644
92bdd1
--- a/src/common/wpa_common.h
92bdd1
+++ b/src/common/wpa_common.h
92bdd1
@@ -215,6 +215,7 @@ struct wpa_ptk {
92bdd1
 	size_t kck_len;
92bdd1
 	size_t kek_len;
92bdd1
 	size_t tk_len;
92bdd1
+	int installed; /* 1 if key has already been installed to driver */
92bdd1
 };
92bdd1
 
92bdd1
 struct wpa_gtk {
92bdd1
diff --git a/src/rsn_supp/wpa.c b/src/rsn_supp/wpa.c
92bdd1
index 7a2c68d..0550a41 100644
92bdd1
--- a/src/rsn_supp/wpa.c
92bdd1
+++ b/src/rsn_supp/wpa.c
92bdd1
@@ -510,7 +510,6 @@ static void wpa_supplicant_process_1_of_4(struct wpa_sm *sm,
92bdd1
 		os_memset(buf, 0, sizeof(buf));
92bdd1
 	}
92bdd1
 	sm->tptk_set = 1;
92bdd1
-	sm->tk_to_set = 1;
92bdd1
 
92bdd1
 	kde = sm->assoc_wpa_ie;
92bdd1
 	kde_len = sm->assoc_wpa_ie_len;
92bdd1
@@ -615,7 +614,7 @@ static int wpa_supplicant_install_ptk(struct wpa_sm *sm,
92bdd1
 	enum wpa_alg alg;
92bdd1
 	const u8 *key_rsc;
92bdd1
 
92bdd1
-	if (!sm->tk_to_set) {
92bdd1
+	if (sm->ptk.installed) {
92bdd1
 		wpa_dbg(sm->ctx->msg_ctx, MSG_DEBUG,
92bdd1
 			"WPA: Do not re-install same PTK to the driver");
92bdd1
 		return 0;
92bdd1
@@ -659,7 +658,7 @@ static int wpa_supplicant_install_ptk(struct wpa_sm *sm,
92bdd1
 
92bdd1
 	/* TK is not needed anymore in supplicant */
92bdd1
 	os_memset(sm->ptk.tk, 0, WPA_TK_MAX_LEN);
92bdd1
-	sm->tk_to_set = 0;
92bdd1
+	sm->ptk.installed = 1;
92bdd1
 
92bdd1
 	if (sm->wpa_ptk_rekey) {
92bdd1
 		eloop_cancel_timeout(wpa_sm_rekey_ptk, sm, NULL);
92bdd1
diff --git a/src/rsn_supp/wpa_i.h b/src/rsn_supp/wpa_i.h
92bdd1
index 9a54631..41f371f 100644
92bdd1
--- a/src/rsn_supp/wpa_i.h
92bdd1
+++ b/src/rsn_supp/wpa_i.h
92bdd1
@@ -24,7 +24,6 @@ struct wpa_sm {
92bdd1
 	struct wpa_ptk ptk, tptk;
92bdd1
 	int ptk_set, tptk_set;
92bdd1
 	unsigned int msg_3_of_4_ok:1;
92bdd1
-	unsigned int tk_to_set:1;
92bdd1
 	u8 snonce[WPA_NONCE_LEN];
92bdd1
 	u8 anonce[WPA_NONCE_LEN]; /* ANonce from the last 1/4 msg */
92bdd1
 	int renew_snonce;
92bdd1
-- 
92bdd1
2.7.4
92bdd1