mac80211: Reject malformed SSID elements
Subsystems (3)
PATCH 1/2 mac80211: Reject malformed SSID elements
Although this shouldn't occur in practice, it's a good idea to bounds check the length field of the SSID element prior to using it for things like allocations or memcpy operations.
Cc <[email protected]>
Cc Johannes Berg <[email protected]>
Cc Kees Cook <[email protected]>
Reported-by Nicolas Waisman <[email protected]>
Signed-off-by Will Deacon <[email protected]>
--- net/mac80211/mlme.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
net/mac80211/mlme.c +3 -2
@@ -2633,7 +2633,8 @@ struct sk_buff *ieee80211_ap_probereq_get(struct ieee80211_hw *hw,rcu_read_lock (); ssid =ieee80211_bss_get_ie (cbss,WLAN_EID_SSID ); -if (WARN_ON_ONCE (ssid ==NULL )) +if (WARN_ONCE (!ssid || ssid[1 ] >IEEE80211_MAX_SSID_LEN , +"invalid SSID element (len=%d)" , ssid ? ssid[1 ] :-1 )) ssid_len =0 ;else ssid_len = ssid[1 ];
@@ -5233,7 +5234,7 @@ int ieee80211_mgd_assoc(struct ieee80211_sub_if_data *sdata,rcu_read_lock (); ssidie =ieee80211_bss_get_ie (req->bss,WLAN_EID_SSID ); -if (!ssidie) { +if (!ssidie || ssidie[1 ] >sizeof (assoc_data->ssid)) {rcu_read_unlock ();kfree (assoc_data);return -EINVAL ;
Signature · 1 line
2.23.0.581.g78d2f28ef7-goog
PATCH 2/2 cfg80211: wext: Reject malformed SSID elements
Ensure the SSID element is bounds-checked prior to invoking memcpy() with its length field.
Cc <[email protected]>
Cc Johannes Berg <[email protected]>
Cc Kees Cook <[email protected]>
Reported-by Nicolas Waisman <[email protected]>
Signed-off-by Will Deacon <[email protected]>
--- net/wireless/wext-sme.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-)
net/wireless/wext-sme.c +6 -2
@@ -201,6 +201,7 @@ int cfg80211_mgd_wext_giwessid(struct net_device *dev,struct iw_request_info *info, struct iw_point *data, char *ssid) { + int ret = 0;struct wireless_dev *wdev = dev->ieee80211_ptr;/* call only for station! */
@@ -219,7 +220,10 @@ int cfg80211_mgd_wext_giwessid(struct net_device *dev,if (ie) { data->flags =1 ; data->length = ie[1 ]; -memcpy (ssid, ie +2 , data->length); +if (data->length >IW_ESSID_MAX_SIZE ) + ret = -EINVAL ; +else +memcpy (ssid, ie +2 , data->length); }rcu_read_unlock (); }else if (wdev->wext.connect.ssid && wdev->wext.connect.ssid_len) {
@@ -229,7 +233,7 @@ int cfg80211_mgd_wext_giwessid(struct net_device *dev, }wdev_unlock (wdev); -return 0 ; +return ret; } int cfg80211_mgd_wext_siwap(struct net_device *dev,
Signature · 1 line
2.23.0.581.g78d2f28ef7-goog
Re: [PATCH 2/2] cfg80211: wext: Reject malformed SSID elements
Quoted 8 lines · Will Deacon
Ensure the SSID element is bounds-checked prior to invoking
memcpy()with its length field.Cc <[email protected]>Cc Johannes Berg <[email protected]>Cc Kees Cook <[email protected]>Reported-by Nicolas Waisman <[email protected]>Signed-off-by Will Deacon <[email protected]>
Reviewed-by Kees Cook <[email protected]>
-Kees
Quoted 40 lines
--- net/wireless/wext-sme.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-)net/wireless/wext-sme.c +6
-2@@ -201,6 +201,7 @@ int cfg80211_mgd_wext_giwessid(struct net_device *dev,struct iw_request_info *info, struct iw_point *data, char *ssid) { + int ret = 0;struct wireless_dev *wdev = dev->ieee80211_ptr;/* call only for station! */ @@ -219,7 +220,10 @@ int cfg80211_mgd_wext_giwessid(struct net_device *dev,if (ie) { data->flags =1 ; data->length = ie[1 ]; -memcpy (ssid, ie +2 , data->length); +if (data->length >IW_ESSID_MAX_SIZE ) + ret = -EINVAL ; +else +memcpy (ssid, ie +2 , data->length); }rcu_read_unlock (); }else if (wdev->wext.connect.ssid && wdev->wext.connect.ssid_len) {@@ -229,7 +233,7 @@ int cfg80211_mgd_wext_giwessid(struct net_device *dev, }wdev_unlock (wdev); -return 0 ; +return ret; } int cfg80211_mgd_wext_siwap(struct net_device *dev,Signature · 1 line
2.23.0.581.g78d2f28ef7-goog
Signature · 1 line
Kees Cook
Quoted 9 lines · Will Deacon
Although this shouldn't occur in practice, it's a good idea to bounds check the length field of the SSID element prior to using it for things like allocations or memcpy operations.
Cc <[email protected]>Cc Johannes Berg <[email protected]>Cc Kees Cook <[email protected]>Reported-by Nicolas Waisman <[email protected]>Signed-off-by Will Deacon <[email protected]>
Reviewed-by Kees Cook <[email protected]>
-Kees
Quoted 30 lines
--- net/mac80211/mlme.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)net/mac80211/mlme.c +3
-2@@ -2633,7 +2633,8 @@ struct sk_buff *ieee80211_ap_probereq_get(struct ieee80211_hw *hw,rcu_read_lock (); ssid =ieee80211_bss_get_ie (cbss,WLAN_EID_SSID ); -if (WARN_ON_ONCE (ssid ==NULL )) +if (WARN_ONCE (!ssid || ssid[1 ] >IEEE80211_MAX_SSID_LEN , +"invalid SSID element (len=%d)" , ssid ? ssid[1 ] :-1 )) ssid_len =0 ;else ssid_len = ssid[1 ];@@ -5233,7 +5234,7 @@ int ieee80211_mgd_assoc(struct ieee80211_sub_if_data *sdata,rcu_read_lock (); ssidie =ieee80211_bss_get_ie (req->bss,WLAN_EID_SSID ); -if (!ssidie) { +if (!ssidie || ssidie[1 ] >sizeof (assoc_data->ssid)) {rcu_read_unlock ();kfree (assoc_data);return -EINVAL ;Signature · 1 line
2.23.0.581.g78d2f28ef7-goog
Signature · 1 line
Kees Cook