https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=287883
Bug ID: 287883
Summary: if_mtw.c should check sc->ntxchains
Product: Base System
Version: CURRENT
Hardware: Any
OS: Any
Status: New
Severity: Affects Some People
Priority: ---
Component: wireless
Assignee: [email protected]
Reporter: [email protected]
If a malicious USB device pretending to be a MediaTek MT7601U
(if_mtw.c) claims more than a few (4?) txchains,
ieee80211_init_suphtrates() can overrun rs_rates[], writing junk into
ic->ic_nchans (and maybe other ic variables). One bad result is that a
large ic_nchans can cause ieee80211_dfs_reset() to write off the end
of ic->ic_channels[] and eventually crash.
mtw_read_eeprom():
mtw_srom_read(sc, MTW_EEPROM_ANTENNA, &val);
sc->ntxchains = (val >> 4) & 0xf;
mtw_attach():
ic->ic_txstream = sc->ntxchains;
ieee80211_init_suphtrates():
#define ADDRATE(x) do { \
htrateset->rs_rates[htrateset->rs_nrates] = x; \
htrateset->rs_nrates++; \
} while (0)
struct ieee80211_htrateset *htrateset = &ic->ic_sup_htrates;
for (i = 0; i < ic->ic_txstream * 8; i++)
ADDRATE(i);
struct ieee80211com {
struct ieee80211_htrateset ic_sup_htrates;
int ic_nchans; /* # entries in ic_channels */
#define IEEE80211_HTRATE_MAXSIZE 77
struct ieee80211_htrateset {
uint8_t rs_nrates;
uint8_t rs_rates[IEEE80211_HTRATE_MAXSIZE];
};
ieee80211_dfs_reset(struct ieee80211com *ic):
for (i = 0; i < ic->ic_nchans; i++)
ic->ic_channels[i].ic_state = 0;
This is analogous to this if_run.c PR:
https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=284694
--
You are receiving this mail because:
You are the assignee for the bug.