wifi: mac80211: check SSID in beacon

Check that the SSID in beacons is correct, if it's not hidden
and beacon protection is enabled (otherwise there's no value).
If it doesn't match, disconnect.

Reviewed-by: Miriam Rachel Korenblit <miriam.rachel.korenblit@intel.com>
Link: https://patch.msgid.link/20240612143809.8b24a3d26a3d.I3e3ef31dbd2ec606be74d502a9d00dd9514c6885@changeid
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:
Johannes Berg 2024-06-12 14:38:10 +02:00
parent 0b2d9d9aec
commit 9cc88678db

View File

@ -6667,6 +6667,29 @@ handle:
}
}
static bool ieee80211_mgd_ssid_mismatch(struct ieee80211_sub_if_data *sdata,
const struct ieee802_11_elems *elems)
{
struct ieee80211_vif_cfg *cfg = &sdata->vif.cfg;
static u8 zero_ssid[IEEE80211_MAX_SSID_LEN];
if (!elems->ssid)
return false;
/* hidden SSID: zero length */
if (elems->ssid_len == 0)
return false;
if (elems->ssid_len != cfg->ssid_len)
return true;
/* hidden SSID: zeroed out */
if (memcmp(elems->ssid, zero_ssid, elems->ssid_len))
return false;
return memcmp(elems->ssid, cfg->ssid, cfg->ssid_len);
}
static void ieee80211_rx_mgmt_beacon(struct ieee80211_link_data *link,
struct ieee80211_hdr *hdr, size_t len,
struct ieee80211_rx_status *rx_status)
@ -6808,6 +6831,15 @@ static void ieee80211_rx_mgmt_beacon(struct ieee80211_link_data *link,
elems = ieee802_11_parse_elems_full(&parse_params);
if (!elems)
return;
if (rx_status->flag & RX_FLAG_DECRYPTED &&
ieee80211_mgd_ssid_mismatch(sdata, elems)) {
sdata_info(sdata, "SSID mismatch for AP %pM, disconnect\n",
sdata->vif.cfg.ap_addr);
__ieee80211_disconnect(sdata);
return;
}
ncrc = elems->crc;
if (ieee80211_hw_check(&local->hw, PS_NULLFUNC_STACK) &&