Commit 7e44a0b5 authored by Johannes Berg's avatar Johannes Berg

mac80211: prevent attacks on TKIP/WEP as well

Similar to the issues fixed in previous patches, TKIP and WEP
should be protected even if for TKIP we have the Michael MIC
protecting it, and WEP is broken anyway.

However, this also somewhat protects potential other algorithms
that drivers might implement.

Cc: stable@vger.kernel.org
Link: https://lore.kernel.org/r/20210511200110.430e8c202313.Ia37e4e5b6b3eaab1a5ae050e015f6c92859dbe27@changeidSigned-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
parent bf30ca92
...@@ -2274,6 +2274,7 @@ ieee80211_rx_h_defragment(struct ieee80211_rx_data *rx) ...@@ -2274,6 +2274,7 @@ ieee80211_rx_h_defragment(struct ieee80211_rx_data *rx)
* next fragment has a sequential PN value. * next fragment has a sequential PN value.
*/ */
entry->check_sequential_pn = true; entry->check_sequential_pn = true;
entry->is_protected = true;
entry->key_color = rx->key->color; entry->key_color = rx->key->color;
memcpy(entry->last_pn, memcpy(entry->last_pn,
rx->key->u.ccmp.rx_pn[queue], rx->key->u.ccmp.rx_pn[queue],
...@@ -2286,6 +2287,9 @@ ieee80211_rx_h_defragment(struct ieee80211_rx_data *rx) ...@@ -2286,6 +2287,9 @@ ieee80211_rx_h_defragment(struct ieee80211_rx_data *rx)
sizeof(rx->key->u.gcmp.rx_pn[queue])); sizeof(rx->key->u.gcmp.rx_pn[queue]));
BUILD_BUG_ON(IEEE80211_CCMP_PN_LEN != BUILD_BUG_ON(IEEE80211_CCMP_PN_LEN !=
IEEE80211_GCMP_PN_LEN); IEEE80211_GCMP_PN_LEN);
} else if (rx->key && ieee80211_has_protected(fc)) {
entry->is_protected = true;
entry->key_color = rx->key->color;
} }
return RX_QUEUED; return RX_QUEUED;
} }
...@@ -2327,6 +2331,14 @@ ieee80211_rx_h_defragment(struct ieee80211_rx_data *rx) ...@@ -2327,6 +2331,14 @@ ieee80211_rx_h_defragment(struct ieee80211_rx_data *rx)
if (memcmp(pn, rpn, IEEE80211_CCMP_PN_LEN)) if (memcmp(pn, rpn, IEEE80211_CCMP_PN_LEN))
return RX_DROP_UNUSABLE; return RX_DROP_UNUSABLE;
memcpy(entry->last_pn, pn, IEEE80211_CCMP_PN_LEN); memcpy(entry->last_pn, pn, IEEE80211_CCMP_PN_LEN);
} else if (entry->is_protected &&
(!rx->key || !ieee80211_has_protected(fc) ||
rx->key->color != entry->key_color)) {
/* Drop this as a mixed key or fragment cache attack, even
* if for TKIP Michael MIC should protect us, and WEP is a
* lost cause anyway.
*/
return RX_DROP_UNUSABLE;
} }
skb_pull(rx->skb, ieee80211_hdrlen(fc)); skb_pull(rx->skb, ieee80211_hdrlen(fc));
......
...@@ -455,7 +455,8 @@ struct ieee80211_fragment_entry { ...@@ -455,7 +455,8 @@ struct ieee80211_fragment_entry {
u16 extra_len; u16 extra_len;
u16 last_frag; u16 last_frag;
u8 rx_queue; u8 rx_queue;
bool check_sequential_pn; /* needed for CCMP/GCMP */ u8 check_sequential_pn:1, /* needed for CCMP/GCMP */
is_protected:1;
u8 last_pn[6]; /* PN of the last fragment if CCMP was used */ u8 last_pn[6]; /* PN of the last fragment if CCMP was used */
unsigned int key_color; unsigned int key_color;
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment