]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
5.19-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 13 Oct 2022 16:57:25 +0000 (18:57 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 13 Oct 2022 16:57:25 +0000 (18:57 +0200)
added patches:
wifi-cfg80211-avoid-nontransmitted-bss-list-corruption.patch
wifi-cfg80211-ensure-length-byte-is-present-before-access.patch
wifi-cfg80211-fix-bss-refcounting-bugs.patch
wifi-cfg80211-fix-u8-overflow-in-cfg80211_update_notlisted_nontrans.patch
wifi-cfg80211-mac80211-reject-bad-mbssid-elements.patch
wifi-cfg80211-update-hidden-bsses-to-avoid-warn_on.patch
wifi-mac80211-fix-crash-in-beacon-protection-for-p2p-device.patch
wifi-mac80211-fix-mbssid-parsing-use-after-free.patch
wifi-mac80211_hwsim-avoid-mac80211-warning-on-bad-rate.patch

queue-5.19/series
queue-5.19/wifi-cfg80211-avoid-nontransmitted-bss-list-corruption.patch [new file with mode: 0644]
queue-5.19/wifi-cfg80211-ensure-length-byte-is-present-before-access.patch [new file with mode: 0644]
queue-5.19/wifi-cfg80211-fix-bss-refcounting-bugs.patch [new file with mode: 0644]
queue-5.19/wifi-cfg80211-fix-u8-overflow-in-cfg80211_update_notlisted_nontrans.patch [new file with mode: 0644]
queue-5.19/wifi-cfg80211-mac80211-reject-bad-mbssid-elements.patch [new file with mode: 0644]
queue-5.19/wifi-cfg80211-update-hidden-bsses-to-avoid-warn_on.patch [new file with mode: 0644]
queue-5.19/wifi-mac80211-fix-crash-in-beacon-protection-for-p2p-device.patch [new file with mode: 0644]
queue-5.19/wifi-mac80211-fix-mbssid-parsing-use-after-free.patch [new file with mode: 0644]
queue-5.19/wifi-mac80211_hwsim-avoid-mac80211-warning-on-bad-rate.patch [new file with mode: 0644]

index 4f5e6b962a675f6f6206ebc893b9dea80d706aee..0dfbf32947c8ecd1cfb467e3bd6f91ea33a8c6c0 100644 (file)
@@ -17,3 +17,12 @@ revert-powerpc-rtas-implement-reentrant-rtas-call.patch
 revert-crypto-qat-reduce-size-of-mapped-region.patch
 random-avoid-reading-two-cache-lines-on-irq-randomness.patch
 random-use-expired-timer-rather-than-wq-for-mixing-fast-pool.patch
+wifi-cfg80211-fix-u8-overflow-in-cfg80211_update_notlisted_nontrans.patch
+wifi-cfg80211-mac80211-reject-bad-mbssid-elements.patch
+wifi-mac80211-fix-mbssid-parsing-use-after-free.patch
+wifi-cfg80211-ensure-length-byte-is-present-before-access.patch
+wifi-cfg80211-fix-bss-refcounting-bugs.patch
+wifi-cfg80211-avoid-nontransmitted-bss-list-corruption.patch
+wifi-mac80211_hwsim-avoid-mac80211-warning-on-bad-rate.patch
+wifi-mac80211-fix-crash-in-beacon-protection-for-p2p-device.patch
+wifi-cfg80211-update-hidden-bsses-to-avoid-warn_on.patch
diff --git a/queue-5.19/wifi-cfg80211-avoid-nontransmitted-bss-list-corruption.patch b/queue-5.19/wifi-cfg80211-avoid-nontransmitted-bss-list-corruption.patch
new file mode 100644 (file)
index 0000000..a024e81
--- /dev/null
@@ -0,0 +1,53 @@
+From bcca852027e5878aec911a347407ecc88d6fff7f Mon Sep 17 00:00:00 2001
+From: Johannes Berg <johannes.berg@intel.com>
+Date: Sat, 1 Oct 2022 00:01:44 +0200
+Subject: wifi: cfg80211: avoid nontransmitted BSS list corruption
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Johannes Berg <johannes.berg@intel.com>
+
+commit bcca852027e5878aec911a347407ecc88d6fff7f upstream.
+
+If a non-transmitted BSS shares enough information (both
+SSID and BSSID!) with another non-transmitted BSS of a
+different AP, then we can find and update it, and then
+try to add it to the non-transmitted BSS list. We do a
+search for it on the transmitted BSS, but if it's not
+there (but belongs to another transmitted BSS), the list
+gets corrupted.
+
+Since this is an erroneous situation, simply fail the
+list insertion in this case and free the non-transmitted
+BSS.
+
+This fixes CVE-2022-42721.
+
+Reported-by: Sönke Huster <shuster@seemoo.tu-darmstadt.de>
+Tested-by: Sönke Huster <shuster@seemoo.tu-darmstadt.de>
+Fixes: 0b8fb8235be8 ("cfg80211: Parsing of Multiple BSSID information in scanning")
+Signed-off-by: Johannes Berg <johannes.berg@intel.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ net/wireless/scan.c |    9 +++++++++
+ 1 file changed, 9 insertions(+)
+
+--- a/net/wireless/scan.c
++++ b/net/wireless/scan.c
+@@ -423,6 +423,15 @@ cfg80211_add_nontrans_list(struct cfg802
+       rcu_read_unlock();
++      /*
++       * This is a bit weird - it's not on the list, but already on another
++       * one! The only way that could happen is if there's some BSSID/SSID
++       * shared by multiple APs in their multi-BSSID profiles, potentially
++       * with hidden SSID mixed in ... ignore it.
++       */
++      if (!list_empty(&nontrans_bss->nontrans_list))
++              return -EINVAL;
++
+       /* add to the list */
+       list_add_tail(&nontrans_bss->nontrans_list, &trans_bss->nontrans_list);
+       return 0;
diff --git a/queue-5.19/wifi-cfg80211-ensure-length-byte-is-present-before-access.patch b/queue-5.19/wifi-cfg80211-ensure-length-byte-is-present-before-access.patch
new file mode 100644 (file)
index 0000000..7f4dc84
--- /dev/null
@@ -0,0 +1,46 @@
+From 567e14e39e8f8c6997a1378bc3be615afca86063 Mon Sep 17 00:00:00 2001
+From: Johannes Berg <johannes.berg@intel.com>
+Date: Thu, 29 Sep 2022 21:50:44 +0200
+Subject: wifi: cfg80211: ensure length byte is present before access
+
+From: Johannes Berg <johannes.berg@intel.com>
+
+commit 567e14e39e8f8c6997a1378bc3be615afca86063 upstream.
+
+When iterating the elements here, ensure the length byte is
+present before checking it to see if the entire element will
+fit into the buffer.
+
+Longer term, we should rewrite this code using the type-safe
+element iteration macros that check all of this.
+
+Fixes: 0b8fb8235be8 ("cfg80211: Parsing of Multiple BSSID information in scanning")
+Reported-by: Soenke Huster <shuster@seemoo.tu-darmstadt.de>
+Signed-off-by: Johannes Berg <johannes.berg@intel.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ net/wireless/scan.c |    6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+--- a/net/wireless/scan.c
++++ b/net/wireless/scan.c
+@@ -304,7 +304,8 @@ static size_t cfg80211_gen_new_ie(const
+       tmp_old = cfg80211_find_ie(WLAN_EID_SSID, ie, ielen);
+       tmp_old = (tmp_old) ? tmp_old + tmp_old[1] + 2 : ie;
+-      while (tmp_old + tmp_old[1] + 2 - ie <= ielen) {
++      while (tmp_old + 2 - ie <= ielen &&
++             tmp_old + tmp_old[1] + 2 - ie <= ielen) {
+               if (tmp_old[0] == 0) {
+                       tmp_old++;
+                       continue;
+@@ -364,7 +365,8 @@ static size_t cfg80211_gen_new_ie(const
+        * copied to new ie, skip ssid, capability, bssid-index ie
+        */
+       tmp_new = sub_copy;
+-      while (tmp_new + tmp_new[1] + 2 - sub_copy <= subie_len) {
++      while (tmp_new + 2 - sub_copy <= subie_len &&
++             tmp_new + tmp_new[1] + 2 - sub_copy <= subie_len) {
+               if (!(tmp_new[0] == WLAN_EID_NON_TX_BSSID_CAP ||
+                     tmp_new[0] == WLAN_EID_SSID)) {
+                       memcpy(pos, tmp_new, tmp_new[1] + 2);
diff --git a/queue-5.19/wifi-cfg80211-fix-bss-refcounting-bugs.patch b/queue-5.19/wifi-cfg80211-fix-bss-refcounting-bugs.patch
new file mode 100644 (file)
index 0000000..8495bb0
--- /dev/null
@@ -0,0 +1,93 @@
+From 0b7808818cb9df6680f98996b8e9a439fa7bcc2f Mon Sep 17 00:00:00 2001
+From: Johannes Berg <johannes.berg@intel.com>
+Date: Fri, 30 Sep 2022 23:44:23 +0200
+Subject: wifi: cfg80211: fix BSS refcounting bugs
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Johannes Berg <johannes.berg@intel.com>
+
+commit 0b7808818cb9df6680f98996b8e9a439fa7bcc2f upstream.
+
+There are multiple refcounting bugs related to multi-BSSID:
+ - In bss_ref_get(), if the BSS has a hidden_beacon_bss, then
+   the bss pointer is overwritten before checking for the
+   transmitted BSS, which is clearly wrong. Fix this by using
+   the bss_from_pub() macro.
+
+ - In cfg80211_bss_update() we copy the transmitted_bss pointer
+   from tmp into new, but then if we release new, we'll unref
+   it erroneously. We already set the pointer and ref it, but
+   need to NULL it since it was copied from the tmp data.
+
+ - In cfg80211_inform_single_bss_data(), if adding to the non-
+   transmitted list fails, we unlink the BSS and yet still we
+   return it, but this results in returning an entry without
+   a reference. We shouldn't return it anyway if it was broken
+   enough to not get added there.
+
+This fixes CVE-2022-42720.
+
+Reported-by: Sönke Huster <shuster@seemoo.tu-darmstadt.de>
+Tested-by: Sönke Huster <shuster@seemoo.tu-darmstadt.de>
+Fixes: a3584f56de1c ("cfg80211: Properly track transmitting and non-transmitting BSS")
+Signed-off-by: Johannes Berg <johannes.berg@intel.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ net/wireless/scan.c |   27 ++++++++++++++-------------
+ 1 file changed, 14 insertions(+), 13 deletions(-)
+
+--- a/net/wireless/scan.c
++++ b/net/wireless/scan.c
+@@ -143,18 +143,12 @@ static inline void bss_ref_get(struct cf
+       lockdep_assert_held(&rdev->bss_lock);
+       bss->refcount++;
+-      if (bss->pub.hidden_beacon_bss) {
+-              bss = container_of(bss->pub.hidden_beacon_bss,
+-                                 struct cfg80211_internal_bss,
+-                                 pub);
+-              bss->refcount++;
+-      }
+-      if (bss->pub.transmitted_bss) {
+-              bss = container_of(bss->pub.transmitted_bss,
+-                                 struct cfg80211_internal_bss,
+-                                 pub);
+-              bss->refcount++;
+-      }
++
++      if (bss->pub.hidden_beacon_bss)
++              bss_from_pub(bss->pub.hidden_beacon_bss)->refcount++;
++
++      if (bss->pub.transmitted_bss)
++              bss_from_pub(bss->pub.transmitted_bss)->refcount++;
+ }
+ static inline void bss_ref_put(struct cfg80211_registered_device *rdev,
+@@ -1741,6 +1735,8 @@ cfg80211_bss_update(struct cfg80211_regi
+               new->refcount = 1;
+               INIT_LIST_HEAD(&new->hidden_list);
+               INIT_LIST_HEAD(&new->pub.nontrans_list);
++              /* we'll set this later if it was non-NULL */
++              new->pub.transmitted_bss = NULL;
+               if (rcu_access_pointer(tmp->pub.proberesp_ies)) {
+                       hidden = rb_find_bss(rdev, tmp, BSS_CMP_HIDE_ZLEN);
+@@ -2023,10 +2019,15 @@ cfg80211_inform_single_bss_data(struct w
+               spin_lock_bh(&rdev->bss_lock);
+               if (cfg80211_add_nontrans_list(non_tx_data->tx_bss,
+                                              &res->pub)) {
+-                      if (__cfg80211_unlink_bss(rdev, res))
++                      if (__cfg80211_unlink_bss(rdev, res)) {
+                               rdev->bss_generation++;
++                              res = NULL;
++                      }
+               }
+               spin_unlock_bh(&rdev->bss_lock);
++
++              if (!res)
++                      return NULL;
+       }
+       trace_cfg80211_return_bss(&res->pub);
diff --git a/queue-5.19/wifi-cfg80211-fix-u8-overflow-in-cfg80211_update_notlisted_nontrans.patch b/queue-5.19/wifi-cfg80211-fix-u8-overflow-in-cfg80211_update_notlisted_nontrans.patch
new file mode 100644 (file)
index 0000000..36b19ab
--- /dev/null
@@ -0,0 +1,46 @@
+From aebe9f4639b13a1f4e9a6b42cdd2e38c617b442d Mon Sep 17 00:00:00 2001
+From: Johannes Berg <johannes.berg@intel.com>
+Date: Wed, 28 Sep 2022 21:56:15 +0200
+Subject: wifi: cfg80211: fix u8 overflow in cfg80211_update_notlisted_nontrans()
+
+From: Johannes Berg <johannes.berg@intel.com>
+
+commit aebe9f4639b13a1f4e9a6b42cdd2e38c617b442d upstream.
+
+In the copy code of the elements, we do the following calculation
+to reach the end of the MBSSID element:
+
+       /* copy the IEs after MBSSID */
+       cpy_len = mbssid[1] + 2;
+
+This looks fine, however, cpy_len is a u8, the same as mbssid[1],
+so the addition of two can overflow. In this case the subsequent
+memcpy() will overflow the allocated buffer, since it copies 256
+bytes too much due to the way the allocation and memcpy() sizes
+are calculated.
+
+Fix this by using size_t for the cpy_len variable.
+
+This fixes CVE-2022-41674.
+
+Reported-by: Soenke Huster <shuster@seemoo.tu-darmstadt.de>
+Tested-by: Soenke Huster <shuster@seemoo.tu-darmstadt.de>
+Fixes: 0b8fb8235be8 ("cfg80211: Parsing of Multiple BSSID information in scanning")
+Reviewed-by: Kees Cook <keescook@chromium.org>
+Signed-off-by: Johannes Berg <johannes.berg@intel.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ net/wireless/scan.c |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/net/wireless/scan.c
++++ b/net/wireless/scan.c
+@@ -2279,7 +2279,7 @@ cfg80211_update_notlisted_nontrans(struc
+       size_t new_ie_len;
+       struct cfg80211_bss_ies *new_ies;
+       const struct cfg80211_bss_ies *old;
+-      u8 cpy_len;
++      size_t cpy_len;
+       lockdep_assert_held(&wiphy_to_rdev(wiphy)->bss_lock);
diff --git a/queue-5.19/wifi-cfg80211-mac80211-reject-bad-mbssid-elements.patch b/queue-5.19/wifi-cfg80211-mac80211-reject-bad-mbssid-elements.patch
new file mode 100644 (file)
index 0000000..62e97bb
--- /dev/null
@@ -0,0 +1,54 @@
+From 8f033d2becc24aa6bfd2a5c104407963560caabc Mon Sep 17 00:00:00 2001
+From: Johannes Berg <johannes.berg@intel.com>
+Date: Wed, 28 Sep 2022 22:01:37 +0200
+Subject: wifi: cfg80211/mac80211: reject bad MBSSID elements
+
+From: Johannes Berg <johannes.berg@intel.com>
+
+commit 8f033d2becc24aa6bfd2a5c104407963560caabc upstream.
+
+Per spec, the maximum value for the MaxBSSID ('n') indicator is 8,
+and the minimum is 1 since a multiple BSSID set with just one BSSID
+doesn't make sense (the # of BSSIDs is limited by 2^n).
+
+Limit this in the parsing in both cfg80211 and mac80211, rejecting
+any elements with an invalid value.
+
+This fixes potentially bad shifts in the processing of these inside
+the cfg80211_gen_new_bssid() function later.
+
+I found this during the investigation of CVE-2022-41674 fixed by the
+previous patch.
+
+Fixes: 0b8fb8235be8 ("cfg80211: Parsing of Multiple BSSID information in scanning")
+Fixes: 78ac51f81532 ("mac80211: support multi-bssid")
+Reviewed-by: Kees Cook <keescook@chromium.org>
+Signed-off-by: Johannes Berg <johannes.berg@intel.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ net/mac80211/util.c |    2 ++
+ net/wireless/scan.c |    2 ++
+ 2 files changed, 4 insertions(+)
+
+--- a/net/mac80211/util.c
++++ b/net/mac80211/util.c
+@@ -1439,6 +1439,8 @@ static size_t ieee802_11_find_bssid_prof
+       for_each_element_id(elem, WLAN_EID_MULTIPLE_BSSID, start, len) {
+               if (elem->datalen < 2)
+                       continue;
++              if (elem->data[0] < 1 || elem->data[0] > 8)
++                      continue;
+               for_each_element(sub, elem->data + 1, elem->datalen - 1) {
+                       u8 new_bssid[ETH_ALEN];
+--- a/net/wireless/scan.c
++++ b/net/wireless/scan.c
+@@ -2143,6 +2143,8 @@ static void cfg80211_parse_mbssid_data(s
+       for_each_element_id(elem, WLAN_EID_MULTIPLE_BSSID, ie, ielen) {
+               if (elem->datalen < 4)
+                       continue;
++              if (elem->data[0] < 1 || (int)elem->data[0] > 8)
++                      continue;
+               for_each_element(sub, elem->data + 1, elem->datalen - 1) {
+                       u8 profile_len;
diff --git a/queue-5.19/wifi-cfg80211-update-hidden-bsses-to-avoid-warn_on.patch b/queue-5.19/wifi-cfg80211-update-hidden-bsses-to-avoid-warn_on.patch
new file mode 100644 (file)
index 0000000..cb4034b
--- /dev/null
@@ -0,0 +1,91 @@
+From c90b93b5b782891ebfda49d4e5da36632fefd5d1 Mon Sep 17 00:00:00 2001
+From: Johannes Berg <johannes.berg@intel.com>
+Date: Wed, 5 Oct 2022 23:11:43 +0200
+Subject: wifi: cfg80211: update hidden BSSes to avoid WARN_ON
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Johannes Berg <johannes.berg@intel.com>
+
+commit c90b93b5b782891ebfda49d4e5da36632fefd5d1 upstream.
+
+When updating beacon elements in a non-transmitted BSS,
+also update the hidden sub-entries to the same beacon
+elements, so that a future update through other paths
+won't trigger a WARN_ON().
+
+The warning is triggered because the beacon elements in
+the hidden BSSes that are children of the BSS should
+always be the same as in the parent.
+
+Reported-by: Sönke Huster <shuster@seemoo.tu-darmstadt.de>
+Tested-by: Sönke Huster <shuster@seemoo.tu-darmstadt.de>
+Fixes: 0b8fb8235be8 ("cfg80211: Parsing of Multiple BSSID information in scanning")
+Signed-off-by: Johannes Berg <johannes.berg@intel.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ net/wireless/scan.c |   31 ++++++++++++++++++++-----------
+ 1 file changed, 20 insertions(+), 11 deletions(-)
+
+--- a/net/wireless/scan.c
++++ b/net/wireless/scan.c
+@@ -1607,6 +1607,23 @@ struct cfg80211_non_tx_bss {
+       u8 bssid_index;
+ };
++static void cfg80211_update_hidden_bsses(struct cfg80211_internal_bss *known,
++                                       const struct cfg80211_bss_ies *new_ies,
++                                       const struct cfg80211_bss_ies *old_ies)
++{
++      struct cfg80211_internal_bss *bss;
++
++      /* Assign beacon IEs to all sub entries */
++      list_for_each_entry(bss, &known->hidden_list, hidden_list) {
++              const struct cfg80211_bss_ies *ies;
++
++              ies = rcu_access_pointer(bss->pub.beacon_ies);
++              WARN_ON(ies != old_ies);
++
++              rcu_assign_pointer(bss->pub.beacon_ies, new_ies);
++      }
++}
++
+ static bool
+ cfg80211_update_known_bss(struct cfg80211_registered_device *rdev,
+                         struct cfg80211_internal_bss *known,
+@@ -1630,7 +1647,6 @@ cfg80211_update_known_bss(struct cfg8021
+                       kfree_rcu((struct cfg80211_bss_ies *)old, rcu_head);
+       } else if (rcu_access_pointer(new->pub.beacon_ies)) {
+               const struct cfg80211_bss_ies *old;
+-              struct cfg80211_internal_bss *bss;
+               if (known->pub.hidden_beacon_bss &&
+                   !list_empty(&known->hidden_list)) {
+@@ -1658,16 +1674,7 @@ cfg80211_update_known_bss(struct cfg8021
+               if (old == rcu_access_pointer(known->pub.ies))
+                       rcu_assign_pointer(known->pub.ies, new->pub.beacon_ies);
+-              /* Assign beacon IEs to all sub entries */
+-              list_for_each_entry(bss, &known->hidden_list, hidden_list) {
+-                      const struct cfg80211_bss_ies *ies;
+-
+-                      ies = rcu_access_pointer(bss->pub.beacon_ies);
+-                      WARN_ON(ies != old);
+-
+-                      rcu_assign_pointer(bss->pub.beacon_ies,
+-                                         new->pub.beacon_ies);
+-              }
++              cfg80211_update_hidden_bsses(known, new->pub.beacon_ies, old);
+               if (old)
+                       kfree_rcu((struct cfg80211_bss_ies *)old, rcu_head);
+@@ -2360,6 +2367,8 @@ cfg80211_update_notlisted_nontrans(struc
+       } else {
+               old = rcu_access_pointer(nontrans_bss->beacon_ies);
+               rcu_assign_pointer(nontrans_bss->beacon_ies, new_ies);
++              cfg80211_update_hidden_bsses(bss_from_pub(nontrans_bss),
++                                           new_ies, old);
+               rcu_assign_pointer(nontrans_bss->ies, new_ies);
+               if (old)
+                       kfree_rcu((struct cfg80211_bss_ies *)old, rcu_head);
diff --git a/queue-5.19/wifi-mac80211-fix-crash-in-beacon-protection-for-p2p-device.patch b/queue-5.19/wifi-mac80211-fix-crash-in-beacon-protection-for-p2p-device.patch
new file mode 100644 (file)
index 0000000..8706ca9
--- /dev/null
@@ -0,0 +1,57 @@
+From b2d03cabe2b2e150ff5a381731ea0355459be09f Mon Sep 17 00:00:00 2001
+From: Johannes Berg <johannes.berg@intel.com>
+Date: Wed, 5 Oct 2022 21:24:10 +0200
+Subject: wifi: mac80211: fix crash in beacon protection for P2P-device
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Johannes Berg <johannes.berg@intel.com>
+
+commit b2d03cabe2b2e150ff5a381731ea0355459be09f upstream.
+
+If beacon protection is active but the beacon cannot be
+decrypted or is otherwise malformed, we call the cfg80211
+API to report this to userspace, but that uses a netdev
+pointer, which isn't present for P2P-Device. Fix this to
+call it only conditionally to ensure cfg80211 won't crash
+in the case of P2P-Device.
+
+This fixes CVE-2022-42722.
+
+Reported-by: Sönke Huster <shuster@seemoo.tu-darmstadt.de>
+Fixes: 9eaf183af741 ("mac80211: Report beacon protection failures to user space")
+Signed-off-by: Johannes Berg <johannes.berg@intel.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ net/mac80211/rx.c |   12 +++++++-----
+ 1 file changed, 7 insertions(+), 5 deletions(-)
+
+--- a/net/mac80211/rx.c
++++ b/net/mac80211/rx.c
+@@ -1988,10 +1988,11 @@ ieee80211_rx_h_decrypt(struct ieee80211_
+               if (mmie_keyidx < NUM_DEFAULT_KEYS + NUM_DEFAULT_MGMT_KEYS ||
+                   mmie_keyidx >= NUM_DEFAULT_KEYS + NUM_DEFAULT_MGMT_KEYS +
+-                  NUM_DEFAULT_BEACON_KEYS) {
+-                      cfg80211_rx_unprot_mlme_mgmt(rx->sdata->dev,
+-                                                   skb->data,
+-                                                   skb->len);
++                                 NUM_DEFAULT_BEACON_KEYS) {
++                      if (rx->sdata->dev)
++                              cfg80211_rx_unprot_mlme_mgmt(rx->sdata->dev,
++                                                           skb->data,
++                                                           skb->len);
+                       return RX_DROP_MONITOR; /* unexpected BIP keyidx */
+               }
+@@ -2139,7 +2140,8 @@ ieee80211_rx_h_decrypt(struct ieee80211_
+       /* either the frame has been decrypted or will be dropped */
+       status->flag |= RX_FLAG_DECRYPTED;
+-      if (unlikely(ieee80211_is_beacon(fc) && result == RX_DROP_UNUSABLE))
++      if (unlikely(ieee80211_is_beacon(fc) && result == RX_DROP_UNUSABLE &&
++                   rx->sdata->dev))
+               cfg80211_rx_unprot_mlme_mgmt(rx->sdata->dev,
+                                            skb->data, skb->len);
diff --git a/queue-5.19/wifi-mac80211-fix-mbssid-parsing-use-after-free.patch b/queue-5.19/wifi-mac80211-fix-mbssid-parsing-use-after-free.patch
new file mode 100644 (file)
index 0000000..1a0c1c4
--- /dev/null
@@ -0,0 +1,104 @@
+From ff05d4b45dd89b922578dac497dcabf57cf771c6 Mon Sep 17 00:00:00 2001
+From: Johannes Berg <johannes.berg@intel.com>
+Date: Wed, 28 Sep 2022 22:07:15 +0200
+Subject: wifi: mac80211: fix MBSSID parsing use-after-free
+
+From: Johannes Berg <johannes.berg@intel.com>
+
+commit ff05d4b45dd89b922578dac497dcabf57cf771c6 upstream.
+
+When we parse a multi-BSSID element, we might point some
+element pointers into the allocated nontransmitted_profile.
+However, we free this before returning, causing UAF when the
+relevant pointers in the parsed elements are accessed.
+
+Fix this by not allocating the scratch buffer separately but
+as part of the returned structure instead, that way, there
+are no lifetime issues with it.
+
+The scratch buffer introduction as part of the returned data
+here is taken from MLO feature work done by Ilan.
+
+This fixes CVE-2022-42719.
+
+Fixes: 5023b14cf4df ("mac80211: support profile split between elements")
+Co-developed-by: Ilan Peer <ilan.peer@intel.com>
+Signed-off-by: Ilan Peer <ilan.peer@intel.com>
+Reviewed-by: Kees Cook <keescook@chromium.org>
+Signed-off-by: Johannes Berg <johannes.berg@intel.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ net/mac80211/ieee80211_i.h |    8 ++++++++
+ net/mac80211/util.c        |   31 ++++++++++++++++---------------
+ 2 files changed, 24 insertions(+), 15 deletions(-)
+
+--- a/net/mac80211/ieee80211_i.h
++++ b/net/mac80211/ieee80211_i.h
+@@ -1640,6 +1640,14 @@ struct ieee802_11_elems {
+       /* whether a parse error occurred while retrieving these elements */
+       bool parse_error;
++
++      /*
++       * scratch buffer that can be used for various element parsing related
++       * tasks, e.g., element de-fragmentation etc.
++       */
++      size_t scratch_len;
++      u8 *scratch_pos;
++      u8 scratch[];
+ };
+ static inline struct ieee80211_local *hw_to_local(
+--- a/net/mac80211/util.c
++++ b/net/mac80211/util.c
+@@ -1503,25 +1503,28 @@ struct ieee802_11_elems *ieee802_11_pars
+       const struct element *non_inherit = NULL;
+       u8 *nontransmitted_profile;
+       int nontransmitted_profile_len = 0;
++      size_t scratch_len = len;
+-      elems = kzalloc(sizeof(*elems), GFP_ATOMIC);
++      elems = kzalloc(sizeof(*elems) + scratch_len, GFP_ATOMIC);
+       if (!elems)
+               return NULL;
+       elems->ie_start = start;
+       elems->total_len = len;
++      elems->scratch_len = scratch_len;
++      elems->scratch_pos = elems->scratch;
+-      nontransmitted_profile = kmalloc(len, GFP_ATOMIC);
+-      if (nontransmitted_profile) {
+-              nontransmitted_profile_len =
+-                      ieee802_11_find_bssid_profile(start, len, elems,
+-                                                    transmitter_bssid,
+-                                                    bss_bssid,
+-                                                    nontransmitted_profile);
+-              non_inherit =
+-                      cfg80211_find_ext_elem(WLAN_EID_EXT_NON_INHERITANCE,
+-                                             nontransmitted_profile,
+-                                             nontransmitted_profile_len);
+-      }
++      nontransmitted_profile = elems->scratch_pos;
++      nontransmitted_profile_len =
++              ieee802_11_find_bssid_profile(start, len, elems,
++                                            transmitter_bssid,
++                                            bss_bssid,
++                                            nontransmitted_profile);
++      elems->scratch_pos += nontransmitted_profile_len;
++      elems->scratch_len -= nontransmitted_profile_len;
++      non_inherit =
++              cfg80211_find_ext_elem(WLAN_EID_EXT_NON_INHERITANCE,
++                                     nontransmitted_profile,
++                                     nontransmitted_profile_len);
+       crc = _ieee802_11_parse_elems_crc(start, len, action, elems, filter,
+                                         crc, non_inherit);
+@@ -1550,8 +1553,6 @@ struct ieee802_11_elems *ieee802_11_pars
+           offsetofend(struct ieee80211_bssid_index, dtim_count))
+               elems->dtim_count = elems->bssid_index->dtim_count;
+-      kfree(nontransmitted_profile);
+-
+       elems->crc = crc;
+       return elems;
diff --git a/queue-5.19/wifi-mac80211_hwsim-avoid-mac80211-warning-on-bad-rate.patch b/queue-5.19/wifi-mac80211_hwsim-avoid-mac80211-warning-on-bad-rate.patch
new file mode 100644 (file)
index 0000000..3434092
--- /dev/null
@@ -0,0 +1,36 @@
+From 1833b6f46d7e2830251a063935ab464256defe22 Mon Sep 17 00:00:00 2001
+From: Johannes Berg <johannes.berg@intel.com>
+Date: Wed, 5 Oct 2022 15:10:09 +0200
+Subject: wifi: mac80211_hwsim: avoid mac80211 warning on bad rate
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Johannes Berg <johannes.berg@intel.com>
+
+commit 1833b6f46d7e2830251a063935ab464256defe22 upstream.
+
+If the tool on the other side (e.g. wmediumd) gets confused
+about the rate, we hit a warning in mac80211. Silence that
+by effectively duplicating the check here and dropping the
+frame silently (in mac80211 it's dropped with the warning).
+
+Reported-by: Sönke Huster <shuster@seemoo.tu-darmstadt.de>
+Tested-by: Sönke Huster <shuster@seemoo.tu-darmstadt.de>
+Signed-off-by: Johannes Berg <johannes.berg@intel.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/net/wireless/mac80211_hwsim.c |    2 ++
+ 1 file changed, 2 insertions(+)
+
+--- a/drivers/net/wireless/mac80211_hwsim.c
++++ b/drivers/net/wireless/mac80211_hwsim.c
+@@ -4251,6 +4251,8 @@ static int hwsim_cloned_frame_received_n
+       rx_status.band = channel->band;
+       rx_status.rate_idx = nla_get_u32(info->attrs[HWSIM_ATTR_RX_RATE]);
++      if (rx_status.rate_idx >= data2->hw->wiphy->bands[rx_status.band]->n_bitrates)
++              goto out;
+       rx_status.signal = nla_get_u32(info->attrs[HWSIM_ATTR_SIGNAL]);
+       hdr = (void *)skb->data;