wifi: mac80211: Fix UAF in ieee80211_scan_rx()
Subsystems (3)
PATCH v3 1/1 wifi: mac80211: Fix UAF in ieee80211_scan_rx()
ieee80211_scan_rx() tries to access scan_req->flags after a null check, but a UAF is observed when the scan is completed and __ieee80211_scan_completed() executes, which then calls cfg80211_scan_done() leading to the freeing of scan_req.
Since scan_req is rcu_dereference()'d, prevent the racing in __ieee80211_scan_completed() by ensuring that from mac80211's POV it is no longer accessed from an RCU read critical section before we call cfg80211_scan_done().
Bug report: https://syzkaller.appspot.com/bug?extid=f9acff9bf08a845f225d
---
Changes in v3:
Use Johannes Berg's suggestion as-it-is:
https://lore.kernel.org/netdev/[email protected]/
v2 is now obsolete since it was an incorrect way to go about things.
net/mac80211/scan.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-)
net/mac80211/scan.c +7 -4
@@ -469,16 +469,19 @@ static void __ieee80211_scan_completed(struct ieee80211_hw *hw, bool aborted) scan_req =rcu_dereference_protected (local->scan_req,lockdep_is_held (&local->mtx)); -if (scan_req != local->int_scan_req) { - local->scan_info.aborted = aborted; -cfg80211_scan_done (scan_req, &local->scan_info); - }RCU_INIT_POINTER (local->scan_req,NULL );RCU_INIT_POINTER (local->scan_sdata,NULL ); local->scanning =0 ; local->scan_chandef.chan =NULL ; +synchronize_rcu (); + +if (scan_req != local->int_scan_req) { + local->scan_info.aborted = aborted; +cfg80211_scan_done (scan_req, &local->scan_info); + } +/* Set power back to normal operating levels. */ ieee80211_hw_config (local,0 );
Signature · 7 lines
2.35.1 _______________________________________________ Linux-kernel-mentees mailing list [email protected] https://lists.linuxfoundation.org/mailman/listinfo/linux-kernel-mentees