In the Linux kernel, the following vulnerability has been resolved:
staging: rtl8723bs: fix OOB read / stack overflow in rtw_get_wps_attr()
rtw_get_wps_attr() walks WPS attributes inside a WPS IE taken from
a wireless management frame. For each candidate attribute it only
checks that the fixed 4-byte attribute header (2-byte ID + 2-byte
length) fits inside the IE:
<pre>
if (attr_ptr + 4 > wps_ie + wps_ielen)
break;
u16 attr_id = get_unaligned_be16(attr_ptr);
u16 attr_data_len = get_unaligned_be16(attr_ptr + 2);
u16 attr_len = attr_data_len + 4;
</pre>
attr_data_len (and therefore attr_len) is read directly from the
wire and is never checked against the remaining bytes in the IE
before being used as the size of:
<pre>
memcpy(buf_attr, attr_ptr, attr_len);
</pre>
Since attr_len is fully attacker controlled (0 to 65535+4), this is
both a heap OOB read of wps_ie, and, more seriously, a stack buffer
overflow at several call sites where buf_attr is a single-byte
stack variable, e.g. rtw_get_wps_attr_content()'s callers passing
WPS_ATTR_SELECTED_REGISTRAR into a stack "u8 sr"/"u8
selected_registrar" (drivers/staging/rtl8723bs/os_dep/ioctl_cfg80211.c,
drivers/staging/rtl8723bs/core/rtw_mlme_ext.c). A crafted WPS IE in a
beacon or probe response processed during scanning can therefore
smash the stack of the parsing thread.
rtw_get_wps_attr_content() itself has no independent length check
and simply trusts the attr_len it gets back from rtw_get_wps_attr(),
so fixing the bound here also fixes that caller.
The "attr_ptr + 4 > wps_ie + wps_ielen" header check above was added
by commit 1463ca3ec6601 ("staging: rtl8723bs: fix OOB reads in
rtw_get_sec_ie(), rtw_get_wapi_ie(), and rtw_get_wps_attr()"), which
bounded the fixed header but never extended the check to cover the
variable-length attribute data that follows it. Add that missing
check before attr_len is used as a memcpy() length or accepted as a
match.
CVSS Vector: CVSS:3.1/AV:A/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
CVSS Score: 8.8
AV:A - A nearby attacker injects a crafted 802.11 beacon or probe response carrying a malformed WPS IE; rtl8723bs receives it over SDIO during scan (OnBeacon/OnProbeRsp → collect_bss_info → rtw_cfg80211_inform_bss → rtw_get_wps_attr), so the attacker must be on the same WiFi radio segment.
AC:L - The attacker fully controls the WPS attribute ID and the 16-bit length field and can reliably hit the parser on any scan; no race, rare config, or other condition outside the attacker’s control is required.
PR:N - Beacons and probe responses are processed before any association or authentication with the attacker-controlled BSS, so no local account, capability, or WiFi credentials on the victim are required.
UI:N - Phones, Atom laptops, and IoT devices with this chip perform background and NetworkManager scans without a per-attack user action; once the interface is scanning, the driver parses received management frames on its own.
S:U - The overflow corrupts kernel stack and adjacent heap inside the rtl8723bs driver; impact stays in the host kernel security authority and does not cross a VM, container, or IOMMU boundary.
C:H - attr_data_len is attacker-controlled (up to 65535) and is used as a memcpy length without bounding to the IE, so the copy reads far past the WPS IE into kernel heap and the resulting stack smash can be leveraged for further disclosure.
I:H - rtw_get_wps_attr_content() memcpy’s the claimed payload into a 1-byte stack variable (u8 sr/selected_registrar) using the unchecked length, producing an attacker-sized stack overflow that can overwrite return addresses and enable kernel code execution.
A:H - A multi-kilobyte (or wrapped near-4GB) stack smash in the scan/BSS-inform path trips stack canaries or corrupts kernel control data and causes an oops, panic, or hang of the victim device.
| Attack Vector |
Adjacent Network |
Scope |
Unchanged |
| Attack Complexity |
Low |
Confidentiality Impact |
High |
| Privileges Required |
None |
Integrity Impact |
High |
| User Interaction |
None |
Availability Impact |
High |
AV:A - A nearby attacker injects a crafted 802.11 beacon or probe response carrying a malformed WPS IE; rtl8723bs receives it over SDIO during scan (OnBeacon/OnProbeRsp → collect_bss_info → rtw_cfg80211_inform_bss → rtw_get_wps_attr), so the attacker must be on the same WiFi radio segment.
AC:L - The attacker fully controls the WPS attribute ID and the 16-bit length field and can reliably hit the parser on any scan; no race, rare config, or other condition outside the attacker’s control is required.
PR:N - Beacons and probe responses are processed before any association or authentication with the attacker-controlled BSS, so no local account, capability, or WiFi credentials on the victim are required.
UI:N - Phones, Atom laptops, and IoT devices with this chip perform background and NetworkManager scans without a per-attack user action; once the interface is scanning, the driver parses received management frames on its own.
S:U - The overflow corrupts kernel stack and adjacent heap inside the rtl8723bs driver; impact stays in the host kernel security authority and does not cross a VM, container, or IOMMU boundary.
C:H - attr_data_len is attacker-controlled (up to 65535) and is used as a memcpy length without bounding to the IE, so the copy reads far past the WPS IE into kernel heap and the resulting stack smash can be leveraged for further disclosure.
I:H - rtw_get_wps_attr_content() memcpy’s the claimed payload into a 1-byte stack variable (u8 sr/selected_registrar) using the unchecked length, producing an attacker-sized stack overflow that can overwrite return addresses and enable kernel code execution.
A:H - A multi-kilobyte (or wrapped near-4GB) stack smash in the scan/BSS-inform path trips stack canaries or corrupts kernel control data and causes an oops, panic, or hang of the victim device.
CVSS 3.1