提交 eea5b91d 编写于 作者: W Wen Huang 提交者: Yang Yingliang

libertas: Fix two buffer overflows at parsing bss descriptor

commit e5e884b42639c74b5b57dc277909915c0aefc8bb upstream.

add_ie_rates() copys rates without checking the length
in bss descriptor from remote AP.when victim connects to
remote attacker, this may trigger buffer overflow.
lbs_ibss_join_existing() copys rates without checking the length
in bss descriptor from remote IBSS node.when victim connects to
remote attacker, this may trigger buffer overflow.
Fix them by putting the length check before performing copy.

This fix addresses CVE-2019-14896 and CVE-2019-14897.
This also fix build warning of mixed declarations and code.
Reported-by: Nkbuild test robot <lkp@intel.com>
Signed-off-by: NWen Huang <huangwenabc@gmail.com>
Signed-off-by: NKalle Valo <kvalo@codeaurora.org>
Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: NYang Yingliang <yangyingliang@huawei.com>
上级 42baf1f2
...@@ -273,6 +273,10 @@ add_ie_rates(u8 *tlv, const u8 *ie, int *nrates) ...@@ -273,6 +273,10 @@ add_ie_rates(u8 *tlv, const u8 *ie, int *nrates)
int hw, ap, ap_max = ie[1]; int hw, ap, ap_max = ie[1];
u8 hw_rate; u8 hw_rate;
if (ap_max > MAX_RATES) {
lbs_deb_assoc("invalid rates\n");
return tlv;
}
/* Advance past IE header */ /* Advance past IE header */
ie += 2; ie += 2;
...@@ -1717,6 +1721,9 @@ static int lbs_ibss_join_existing(struct lbs_private *priv, ...@@ -1717,6 +1721,9 @@ static int lbs_ibss_join_existing(struct lbs_private *priv,
struct cmd_ds_802_11_ad_hoc_join cmd; struct cmd_ds_802_11_ad_hoc_join cmd;
u8 preamble = RADIO_PREAMBLE_SHORT; u8 preamble = RADIO_PREAMBLE_SHORT;
int ret = 0; int ret = 0;
int hw, i;
u8 rates_max;
u8 *rates;
/* TODO: set preamble based on scan result */ /* TODO: set preamble based on scan result */
ret = lbs_set_radio(priv, preamble, 1); ret = lbs_set_radio(priv, preamble, 1);
...@@ -1775,9 +1782,12 @@ static int lbs_ibss_join_existing(struct lbs_private *priv, ...@@ -1775,9 +1782,12 @@ static int lbs_ibss_join_existing(struct lbs_private *priv,
if (!rates_eid) { if (!rates_eid) {
lbs_add_rates(cmd.bss.rates); lbs_add_rates(cmd.bss.rates);
} else { } else {
int hw, i; rates_max = rates_eid[1];
u8 rates_max = rates_eid[1]; if (rates_max > MAX_RATES) {
u8 *rates = cmd.bss.rates; lbs_deb_join("invalid rates");
goto out;
}
rates = cmd.bss.rates;
for (hw = 0; hw < ARRAY_SIZE(lbs_rates); hw++) { for (hw = 0; hw < ARRAY_SIZE(lbs_rates); hw++) {
u8 hw_rate = lbs_rates[hw].bitrate / 5; u8 hw_rate = lbs_rates[hw].bitrate / 5;
for (i = 0; i < rates_max; i++) { for (i = 0; i < rates_max; i++) {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册