Linux: wifi: mac80211: avoid WARN in set_bitrate_mask when sdata not in driver
What fixes it
- 4ba86c44b2fcb1c3175caa2456b6d58f483446abLinuxCVE List
- 4095b66acae9893dd13deb39a4331651cb2f822bLinuxCVE List
- 0d1700394e9f5d0bd9bebad8d5a50edf983f52fdLinuxCVE List
- 7978dda63d2b109ea9c3f7a096cd1aac6542cd54LinuxCVE List
- 432c8532d5ccc2af77da43ed6ef1c80495a4efe8LinuxCVE List
A fixed version on one release line is not the upgrade target for every line. Check your exact version and any vendor backports.
Description
In the Linux kernel, the following vulnerability has been resolved:
wifi: mac80211: avoid WARN in set_bitrate_mask when sdata not in driver
ieee80211_set_bitrate_mask() checks if the interface is running via ieee80211_sdata_running(), but it does not check if the interface is still present in the driver.
When sdata is running but IEEE80211_SDATA_IN_DRIVER is not set, the call reaches drv_set_bitrate_mask() in driver-ops.h which hits
wlan1: Failed check-sdata-in-driver check, flags: 0x0 WARNING: net/mac80211/driver-ops.h:884 at drv_set_bitrate_mask
Syzkaller triggers this via wext SIOCSIWRATE ioctl. The Call Trace shows wext_ioctl_dispatch() in wext-core.c dispatching the ioctl, calling ioctl_standard_call() for SIOCSIWRATE, which calls cfg80211_wext_siwrate() in wext-compat.c. That builds a bitrate mask and calls rdev_set_bitrate_mask() which ends up in ieee80211_set_bitrate_mask() in cfg.c. The interface is marked running via SDATA_STATE_RUNNING but flags is 0, so check_sdata_in_driver() fails.
When the interface is being torn down, or when wext ioctl is issued during interface bringup before drv_add_interface() sets IN_DRIVER, the running check passes while IN_DRIVER is clear.
Check IEEE80211_SDATA_IN_DRIVER in ieee80211_set_bitrate_mask() before calling the driver, returning -ENETDOWN. This avoids the WARN_ONCE in driver-ops.h and matches other cfg.c operations that bail early when not in driver.
This change should be safe because wiphy mutex is held in cfg80211_wext_siwrate() via guard(wiphy), and IN_DRIVER is set/cleared under RTNL and wiphy paths in drv_add_interface() and drv_remove_interface() in driver-ops.c, so the check is race-free against driver add/remove. Returning -ENETDOWN is the same error other not-running paths use and does not introduce new locking.
[also add second syzbot report]
Text from CVE List
Affected versions 18
- Linuxaffected: 554a43d5e77e8256aa9685ffd19ad555e6f77979 before 4ba86c44b2fcb1c3175caa2456b6d58f483446abCVE List
- Linuxaffected: 554a43d5e77e8256aa9685ffd19ad555e6f77979 before 4095b66acae9893dd13deb39a4331651cb2f822bCVE List
- Linuxaffected: 554a43d5e77e8256aa9685ffd19ad555e6f77979 before c2cd9c44777cf97be3e35c10b7c2d8f59ebb9306CVE List
- Linuxaffected: 554a43d5e77e8256aa9685ffd19ad555e6f77979 before 0d1700394e9f5d0bd9bebad8d5a50edf983f52fdCVE List
- Linuxaffected: 554a43d5e77e8256aa9685ffd19ad555e6f77979 before 7978dda63d2b109ea9c3f7a096cd1aac6542cd54CVE List
- Linuxaffected: 554a43d5e77e8256aa9685ffd19ad555e6f77979 before 432c8532d5ccc2af77da43ed6ef1c80495a4efe8CVE List
- Linuxaffected: 554a43d5e77e8256aa9685ffd19ad555e6f77979 before c4ee5685af444024e6222ce29f6ed36adc44ffc3CVE List
- Linuxaffected: 554a43d5e77e8256aa9685ffd19ad555e6f77979 before da2ca406f45a6e21760243152ed8d2e8e72915c2CVE List
- Linuxaffected: 3.5CVE List
- Linuxunaffected: all versions before 3.5CVE List
- Linuxunaffected: 5.10.271 through 5.10.*CVE List
- Linuxunaffected: 5.15.222 through 5.15.*CVE List
- Linuxunaffected: 6.1.189 through 6.1.*CVE List
- Linuxunaffected: 6.6.158 through 6.6.*CVE List
- Linuxunaffected: 6.12.112 through 6.12.*CVE List
- Linuxunaffected: 6.18.54 through 6.18.*CVE List
- Linuxunaffected: 7.2.8 through 7.2.*CVE List
- Linuxunaffected: 7.3CVE List
References 8
- git.kernel.org/stable/c/4ba86c44b2fcb1c3175caa2456b6d58f483446abReferencevia CVE List
- git.kernel.org/stable/c/4095b66acae9893dd13deb39a4331651cb2f822bReferencevia CVE List
- git.kernel.org/stable/c/c2cd9c44777cf97be3e35c10b7c2d8f59ebb9306Referencevia CVE List
- git.kernel.org/stable/c/0d1700394e9f5d0bd9bebad8d5a50edf983f52fdReferencevia CVE List
- git.kernel.org/stable/c/7978dda63d2b109ea9c3f7a096cd1aac6542cd54Referencevia CVE List
- git.kernel.org/stable/c/432c8532d5ccc2af77da43ed6ef1c80495a4efe8Referencevia CVE List
- git.kernel.org/stable/c/c4ee5685af444024e6222ce29f6ed36adc44ffc3Referencevia CVE List
- git.kernel.org/stable/c/da2ca406f45a6e21760243152ed8d2e8e72915c2Referencevia CVE List