|
Takashi Iwai |
1b4bc0 |
From 965a7d72e798eb7af0aa67210e37cf7ecd1c9cad Mon Sep 17 00:00:00 2001
|
|
Takashi Iwai |
1b4bc0 |
From: Mathy Vanhoef <Mathy.Vanhoef@kuleuven.be>
|
|
Takashi Iwai |
1b4bc0 |
Date: Tue, 11 May 2021 20:02:42 +0200
|
|
Takashi Iwai |
1b4bc0 |
Subject: [PATCH] mac80211: assure all fragments are encrypted
|
|
Takashi Iwai |
1b4bc0 |
Git-commit: 965a7d72e798eb7af0aa67210e37cf7ecd1c9cad
|
|
Takashi Iwai |
1b4bc0 |
Git-repo: git://git.kernel.org/pub/scm/linux/kernel/git/jberg/mac80211-next.git
|
|
Takashi Iwai |
1b4bc0 |
Patch-mainline: Queued in subsystem maintainer repo
|
|
Takashi Iwai |
1b4bc0 |
References: CVE-2020-26147 bsc#1185863 bsc#1185859
|
|
Takashi Iwai |
1b4bc0 |
|
|
Takashi Iwai |
1b4bc0 |
Do not mix plaintext and encrypted fragments in protected Wi-Fi
|
|
Takashi Iwai |
1b4bc0 |
networks. This fixes CVE-2020-26147.
|
|
Takashi Iwai |
1b4bc0 |
|
|
Takashi Iwai |
1b4bc0 |
Previously, an attacker was able to first forward a legitimate encrypted
|
|
Takashi Iwai |
1b4bc0 |
fragment towards a victim, followed by a plaintext fragment. The
|
|
Takashi Iwai |
1b4bc0 |
encrypted and plaintext fragment would then be reassembled. For further
|
|
Takashi Iwai |
1b4bc0 |
details see Section 6.3 and Appendix D in the paper "Fragment and Forge:
|
|
Takashi Iwai |
1b4bc0 |
Breaking Wi-Fi Through Frame Aggregation and Fragmentation".
|
|
Takashi Iwai |
1b4bc0 |
|
|
Takashi Iwai |
1b4bc0 |
Because of this change there are now two equivalent conditions in the
|
|
Takashi Iwai |
1b4bc0 |
code to determine if a received fragment requires sequential PNs, so we
|
|
Takashi Iwai |
1b4bc0 |
also move this test to a separate function to make the code easier to
|
|
Takashi Iwai |
1b4bc0 |
maintain.
|
|
Takashi Iwai |
1b4bc0 |
|
|
Takashi Iwai |
1b4bc0 |
Cc: stable@vger.kernel.org
|
|
Takashi Iwai |
1b4bc0 |
Signed-off-by: Mathy Vanhoef <Mathy.Vanhoef@kuleuven.be>
|
|
Takashi Iwai |
1b4bc0 |
Link: https://lore.kernel.org/r/20210511200110.30c4394bb835.I5acfdb552cc1d20c339c262315950b3eac491397@changeid
|
|
Takashi Iwai |
1b4bc0 |
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
|
Takashi Iwai |
1b4bc0 |
Acked-by: Takashi Iwai <tiwai@suse.de>
|
|
Takashi Iwai |
1b4bc0 |
|
|
Takashi Iwai |
1b4bc0 |
---
|
|
Takashi Iwai |
1b4bc0 |
net/mac80211/rx.c | 23 ++++++++++++-----------
|
|
Takashi Iwai |
1b4bc0 |
1 file changed, 12 insertions(+), 11 deletions(-)
|
|
Takashi Iwai |
1b4bc0 |
|
|
Takashi Iwai |
1b4bc0 |
diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c
|
|
Takashi Iwai |
1b4bc0 |
index 62047e93e217..65fc674e27cc 100644
|
|
Takashi Iwai |
1b4bc0 |
--- a/net/mac80211/rx.c
|
|
Takashi Iwai |
1b4bc0 |
+++ b/net/mac80211/rx.c
|
|
Takashi Iwai |
1b4bc0 |
@@ -2194,6 +2194,16 @@ ieee80211_reassemble_find(struct ieee80211_sub_if_data *sdata,
|
|
Takashi Iwai |
1b4bc0 |
return NULL;
|
|
Takashi Iwai |
1b4bc0 |
}
|
|
Takashi Iwai |
1b4bc0 |
|
|
Takashi Iwai |
1b4bc0 |
+static bool requires_sequential_pn(struct ieee80211_rx_data *rx, __le16 fc)
|
|
Takashi Iwai |
1b4bc0 |
+{
|
|
Takashi Iwai |
1b4bc0 |
+ return rx->key &&
|
|
Takashi Iwai |
1b4bc0 |
+ (rx->key->conf.cipher == WLAN_CIPHER_SUITE_CCMP ||
|
|
Takashi Iwai |
1b4bc0 |
+ rx->key->conf.cipher == WLAN_CIPHER_SUITE_CCMP_256 ||
|
|
Takashi Iwai |
1b4bc0 |
+ rx->key->conf.cipher == WLAN_CIPHER_SUITE_GCMP ||
|
|
Takashi Iwai |
1b4bc0 |
+ rx->key->conf.cipher == WLAN_CIPHER_SUITE_GCMP_256) &&
|
|
Takashi Iwai |
1b4bc0 |
+ ieee80211_has_protected(fc);
|
|
Takashi Iwai |
1b4bc0 |
+}
|
|
Takashi Iwai |
1b4bc0 |
+
|
|
Takashi Iwai |
1b4bc0 |
static ieee80211_rx_result debug_noinline
|
|
Takashi Iwai |
1b4bc0 |
ieee80211_rx_h_defragment(struct ieee80211_rx_data *rx)
|
|
Takashi Iwai |
1b4bc0 |
{
|
|
Takashi Iwai |
1b4bc0 |
@@ -2238,12 +2248,7 @@ ieee80211_rx_h_defragment(struct ieee80211_rx_data *rx)
|
|
Takashi Iwai |
1b4bc0 |
/* This is the first fragment of a new frame. */
|
|
Takashi Iwai |
1b4bc0 |
entry = ieee80211_reassemble_add(rx->sdata, frag, seq,
|
|
Takashi Iwai |
1b4bc0 |
rx->seqno_idx, &(rx->skb));
|
|
Takashi Iwai |
1b4bc0 |
- if (rx->key &&
|
|
Takashi Iwai |
1b4bc0 |
- (rx->key->conf.cipher == WLAN_CIPHER_SUITE_CCMP ||
|
|
Takashi Iwai |
1b4bc0 |
- rx->key->conf.cipher == WLAN_CIPHER_SUITE_CCMP_256 ||
|
|
Takashi Iwai |
1b4bc0 |
- rx->key->conf.cipher == WLAN_CIPHER_SUITE_GCMP ||
|
|
Takashi Iwai |
1b4bc0 |
- rx->key->conf.cipher == WLAN_CIPHER_SUITE_GCMP_256) &&
|
|
Takashi Iwai |
1b4bc0 |
- ieee80211_has_protected(fc)) {
|
|
Takashi Iwai |
1b4bc0 |
+ if (requires_sequential_pn(rx, fc)) {
|
|
Takashi Iwai |
1b4bc0 |
int queue = rx->security_idx;
|
|
Takashi Iwai |
1b4bc0 |
|
|
Takashi Iwai |
1b4bc0 |
/* Store CCMP/GCMP PN so that we can verify that the
|
|
Takashi Iwai |
1b4bc0 |
@@ -2285,11 +2290,7 @@ ieee80211_rx_h_defragment(struct ieee80211_rx_data *rx)
|
|
Takashi Iwai |
1b4bc0 |
u8 pn[IEEE80211_CCMP_PN_LEN], *rpn;
|
|
Takashi Iwai |
1b4bc0 |
int queue;
|
|
Takashi Iwai |
1b4bc0 |
|
|
Takashi Iwai |
1b4bc0 |
- if (!rx->key ||
|
|
Takashi Iwai |
1b4bc0 |
- (rx->key->conf.cipher != WLAN_CIPHER_SUITE_CCMP &&
|
|
Takashi Iwai |
1b4bc0 |
- rx->key->conf.cipher != WLAN_CIPHER_SUITE_CCMP_256 &&
|
|
Takashi Iwai |
1b4bc0 |
- rx->key->conf.cipher != WLAN_CIPHER_SUITE_GCMP &&
|
|
Takashi Iwai |
1b4bc0 |
- rx->key->conf.cipher != WLAN_CIPHER_SUITE_GCMP_256))
|
|
Takashi Iwai |
1b4bc0 |
+ if (!requires_sequential_pn(rx, fc))
|
|
Takashi Iwai |
1b4bc0 |
return RX_DROP_UNUSABLE;
|
|
Takashi Iwai |
1b4bc0 |
memcpy(pn, entry->last_pn, IEEE80211_CCMP_PN_LEN);
|
|
Takashi Iwai |
1b4bc0 |
for (i = IEEE80211_CCMP_PN_LEN - 1; i >= 0; i--) {
|
|
Takashi Iwai |
1b4bc0 |
--
|
|
Takashi Iwai |
1b4bc0 |
2.26.2
|
|
Takashi Iwai |
1b4bc0 |
|