[PATCH v5 3/3] staging: rtl8723bs: fix OOB reads in rtw_get_wps_ie()
From: Alexandru Hossu
Date: Mon May 11 2026 - 13:24:47 EST
Three out-of-bounds read paths in rtw_get_wps_ie():
1. rtw_get_wps_ie() reads the IE length byte without a header bounds
check.
The loop only guards on cnt < in_len, so when the buffer ends with
a single element_id byte and no length byte, in_ie[cnt + 1] is read
one byte past the end of the buffer. Add a check that at least
two header bytes remain (cnt + 2 <= in_len) before reading
in_ie[cnt + 1].
2. rtw_get_wps_ie() does not verify the declared IE payload fits within
in_len.
After reading the length byte, the loop does not verify that
in_ie[cnt + 1] + 2 bytes are available starting at cnt. A crafted
length value can cause the subsequent memcmp and memcpy to read past
the end of the buffer. Add a check that the full IE (header plus
payload) fits within in_len.
3. rtw_get_wps_ie() reads 4 bytes from the IE payload via memcmp
without checking that pIE->length >= 4.
The code calls memcmp(&in_ie[cnt + 2], wps_oui, 4) without first
verifying that the IE payload is at least 4 bytes long. Add an
in_ie[cnt + 1] >= 4 guard before the comparison.
Fixes: 554c0a3abf21 ("staging: Add rtl8723bs sdio wifi driver")
Cc: stable@xxxxxxxxxxxxxxx
Signed-off-by: Alexandru Hossu <hossu.alexandru@xxxxxxxxx>
---
Changes in v5:
- No code changes from v4.
Changes in v4:
- Add two IE bounds checks in rtw_get_wps_ie(): break if fewer than two
header bytes remain, and break if the declared payload extends past
in_len; add in_ie[cnt + 1] >= 4 guard before the 4-byte WPS OUI memcmp
(sashiko review of v3).
Changes in v3:
- No code changes from v2.
Changes in v2:
- Add explicit size checks in rtw_cfg80211_set_wpa_ie() before memcpy
to prevent the 256-byte supplicant_ie buffer overflow (now in tree
as 92f3954ca9e9).
drivers/staging/rtl8723bs/core/rtw_ieee80211.c | 9 ++++++++-
1 file changed, 8 insertions(+), 1 deletion(-)
diff --git a/drivers/staging/rtl8723bs/core/rtw_ieee80211.c b/drivers/staging/rtl8723bs/core/rtw_ieee80211.c
index 72b7f731dd47..d6d5f3a8db4c 100644
--- a/drivers/staging/rtl8723bs/core/rtw_ieee80211.c
+++ b/drivers/staging/rtl8723bs/core/rtw_ieee80211.c
@@ -661,7 +661,14 @@ u8 *rtw_get_wps_ie(u8 *in_ie, uint in_len, u8 *wps_ie, uint *wps_ielen)
while (cnt < in_len) {
eid = in_ie[cnt];
- if ((eid == WLAN_EID_VENDOR_SPECIFIC) && (!memcmp(&in_ie[cnt + 2], wps_oui, 4))) {
+ if (cnt + 2 > in_len)
+ break;
+
+ if (in_ie[cnt + 1] + 2 > in_len - cnt)
+ break;
+
+ if ((eid == WLAN_EID_VENDOR_SPECIFIC) && (in_ie[cnt + 1] >= 4) &&
+ (!memcmp(&in_ie[cnt + 2], wps_oui, 4))) {
wpsie_ptr = &in_ie[cnt];
if (wps_ie)
--
2.53.0