diff options
author | graysky | 2022-10-14 05:13:33 -0400 |
---|---|---|
committer | graysky | 2022-10-14 05:13:33 -0400 |
commit | eac1e41745ffa9f881f99deba886e2da1095dc8b (patch) | |
tree | 8e547aee066d654d63c81bfadeec402f654691e9 /0006-wifi-mac80211-fix-MBSSID-parsing-use-after-free.patch | |
parent | c605c9da9642e684485a2563e6ca5b940171fdc8 (diff) | |
download | aur-eac1e41745ffa9f881f99deba886e2da1095dc8b.tar.gz |
Update to 6.0.1-2
Diffstat (limited to '0006-wifi-mac80211-fix-MBSSID-parsing-use-after-free.patch')
-rw-r--r-- | 0006-wifi-mac80211-fix-MBSSID-parsing-use-after-free.patch | 107 |
1 files changed, 107 insertions, 0 deletions
diff --git a/0006-wifi-mac80211-fix-MBSSID-parsing-use-after-free.patch b/0006-wifi-mac80211-fix-MBSSID-parsing-use-after-free.patch new file mode 100644 index 000000000000..298ab5a7ef95 --- /dev/null +++ b/0006-wifi-mac80211-fix-MBSSID-parsing-use-after-free.patch @@ -0,0 +1,107 @@ +From 384bd01f765209d69225481340a19707553ccf45 Mon Sep 17 00:00:00 2001 +From: Johannes Berg <johannes.berg@intel.com> +Date: Wed, 28 Sep 2022 22:07:15 +0200 +Subject: [PATCH 06/13] wifi: mac80211: fix MBSSID parsing use-after-free + +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 | 30 +++++++++++++++--------------- + 2 files changed, 23 insertions(+), 15 deletions(-) + +diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h +index e192e1ec0261..9583643b7033 100644 +--- a/net/mac80211/ieee80211_i.h ++++ b/net/mac80211/ieee80211_i.h +@@ -1704,6 +1704,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( +diff --git a/net/mac80211/util.c b/net/mac80211/util.c +index 3d097386b2b9..4fc3d545e666 100644 +--- a/net/mac80211/util.c ++++ b/net/mac80211/util.c +@@ -1503,24 +1503,26 @@ ieee802_11_parse_elems_full(struct ieee80211_elems_parse_params *params) + const struct element *non_inherit = NULL; + u8 *nontransmitted_profile; + int nontransmitted_profile_len = 0; ++ size_t scratch_len = params->len; + +- elems = kzalloc(sizeof(*elems), GFP_ATOMIC); ++ elems = kzalloc(sizeof(*elems) + scratch_len, GFP_ATOMIC); + if (!elems) + return NULL; + elems->ie_start = params->start; + elems->total_len = params->len; +- +- nontransmitted_profile = kmalloc(params->len, GFP_ATOMIC); +- if (nontransmitted_profile) { +- nontransmitted_profile_len = +- ieee802_11_find_bssid_profile(params->start, params->len, +- elems, params->bss, +- nontransmitted_profile); +- non_inherit = +- cfg80211_find_ext_elem(WLAN_EID_EXT_NON_INHERITANCE, +- nontransmitted_profile, +- nontransmitted_profile_len); +- } ++ elems->scratch_len = scratch_len; ++ elems->scratch_pos = elems->scratch; ++ ++ nontransmitted_profile = elems->scratch_pos; ++ nontransmitted_profile_len = ++ ieee802_11_find_bssid_profile(params->start, params->len, ++ elems, params->bss, ++ 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); + + elems->crc = _ieee802_11_parse_elems_full(params, elems, non_inherit); + +@@ -1554,8 +1556,6 @@ ieee802_11_parse_elems_full(struct ieee80211_elems_parse_params *params) + offsetofend(struct ieee80211_bssid_index, dtim_count)) + elems->dtim_count = elems->bssid_index->dtim_count; + +- kfree(nontransmitted_profile); +- + return elems; + } + +-- +2.38.0 + |