Blame SOURCES/rh1495527-0008-FT-Do-not-allow-multiple-Reassociation-Response-fram.patch

41389a
From b372ab0b7daea719749194dc554b26e6367603f2 Mon Sep 17 00:00:00 2001
41389a
From: Jouni Malinen <j@w1.fi>
41389a
Date: Fri, 22 Sep 2017 12:06:37 +0300
41389a
Subject: [PATCH 8/8] FT: Do not allow multiple Reassociation Response frames
41389a
41389a
The driver is expected to not report a second association event without
41389a
the station having explicitly request a new association. As such, this
41389a
case should not be reachable. However, since reconfiguring the same
41389a
pairwise or group keys to the driver could result in nonce reuse issues,
41389a
be extra careful here and do an additional state check to avoid this
41389a
even if the local driver ends up somehow accepting an unexpected
41389a
Reassociation Response frame.
41389a
41389a
Signed-off-by: Jouni Malinen <j@w1.fi>
41389a
---
41389a
 src/rsn_supp/wpa.c    | 3 +++
41389a
 src/rsn_supp/wpa_ft.c | 8 ++++++++
41389a
 src/rsn_supp/wpa_i.h  | 1 +
41389a
 3 files changed, 12 insertions(+)
41389a
41389a
diff --git a/src/rsn_supp/wpa.c b/src/rsn_supp/wpa.c
41389a
index 0550a41..2a53c6f 100644
41389a
--- a/src/rsn_supp/wpa.c
41389a
+++ b/src/rsn_supp/wpa.c
41389a
@@ -2440,6 +2440,9 @@ void wpa_sm_notify_disassoc(struct wpa_sm *sm)
41389a
 #ifdef CONFIG_TDLS
41389a
 	wpa_tdls_disassoc(sm);
41389a
 #endif /* CONFIG_TDLS */
41389a
+#ifdef CONFIG_IEEE80211R
41389a
+	sm->ft_reassoc_completed = 0;
41389a
+#endif /* CONFIG_IEEE80211R */
41389a
 
41389a
 	/* Keys are not needed in the WPA state machine anymore */
41389a
 	wpa_sm_drop_sa(sm);
41389a
diff --git a/src/rsn_supp/wpa_ft.c b/src/rsn_supp/wpa_ft.c
41389a
index 205793e..d45bb45 100644
41389a
--- a/src/rsn_supp/wpa_ft.c
41389a
+++ b/src/rsn_supp/wpa_ft.c
41389a
@@ -153,6 +153,7 @@ static u8 * wpa_ft_gen_req_ies(struct wpa_sm *sm, size_t *len,
41389a
 	u16 capab;
41389a
 
41389a
 	sm->ft_completed = 0;
41389a
+	sm->ft_reassoc_completed = 0;
41389a
 
41389a
 	buf_len = 2 + sizeof(struct rsn_mdie) + 2 + sizeof(struct rsn_ftie) +
41389a
 		2 + sm->r0kh_id_len + ric_ies_len + 100;
41389a
@@ -681,6 +682,11 @@ int wpa_ft_validate_reassoc_resp(struct wpa_sm *sm, const u8 *ies,
41389a
 		return -1;
41389a
 	}
41389a
 
41389a
+	if (sm->ft_reassoc_completed) {
41389a
+		wpa_printf(MSG_DEBUG, "FT: Reassociation has already been completed for this FT protocol instance - ignore unexpected retransmission");
41389a
+		return 0;
41389a
+	}
41389a
+
41389a
 	if (wpa_ft_parse_ies(ies, ies_len, &parse) < 0) {
41389a
 		wpa_printf(MSG_DEBUG, "FT: Failed to parse IEs");
41389a
 		return -1;
41389a
@@ -781,6 +787,8 @@ int wpa_ft_validate_reassoc_resp(struct wpa_sm *sm, const u8 *ies,
41389a
 		return -1;
41389a
 	}
41389a
 
41389a
+	sm->ft_reassoc_completed = 1;
41389a
+
41389a
 	if (wpa_ft_process_gtk_subelem(sm, parse.gtk, parse.gtk_len) < 0)
41389a
 		return -1;
41389a
 
41389a
diff --git a/src/rsn_supp/wpa_i.h b/src/rsn_supp/wpa_i.h
41389a
index 41f371f..56f88dc 100644
41389a
--- a/src/rsn_supp/wpa_i.h
41389a
+++ b/src/rsn_supp/wpa_i.h
41389a
@@ -128,6 +128,7 @@ struct wpa_sm {
41389a
 	size_t r0kh_id_len;
41389a
 	u8 r1kh_id[FT_R1KH_ID_LEN];
41389a
 	int ft_completed;
41389a
+	int ft_reassoc_completed;
41389a
 	int over_the_ds_in_progress;
41389a
 	u8 target_ap[ETH_ALEN]; /* over-the-DS target AP */
41389a
 	int set_ptk_after_assoc;
41389a
-- 
41389a
2.7.4
41389a