Received: by 2002:a25:b323:0:0:0:0:0 with SMTP id l35csp1363886ybj; Fri, 20 Sep 2019 09:16:26 -0700 (PDT) X-Google-Smtp-Source: APXvYqzudOT7ncnVHvuYuDAmz1vGhNb8ClB27+vvDo1v9GfliB8t6HNOMKzw9cAXEmIdaPetLeV1 X-Received: by 2002:a05:6402:1a45:: with SMTP id bf5mr22295480edb.275.1568996186383; Fri, 20 Sep 2019 09:16:26 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1568996186; cv=none; d=google.com; s=arc-20160816; b=kBvTfaMh5G140gWGz4P4rLgdops6wztf/oTgyJAVG5H9jyYUYTlEsxiFk9Ks2DQ7Xp pwddbRosDZu/RACj1yaSmuOC8QVZn3L7ywnto9BBbjCVyhQwYXsFhg/olmsdmScjai9R t3PsRWCnJckkS/+MFPJEmSXaMlWdrX2Zid43hVHQz8zmdMsQlF/vLYpRGb1+70AmC2ea FnunPPI/aOeaJTufvYmVc9fEJEceWWIhdjWk/BLLeBWCZ6RbRKzMuMdOUB2WGZS7/8Bo 5ad3eIBLc9UXZUoS/6VxBJGqu73lLB70LKhZBnSfBGPwKfwz9tOOlReBhCA2bVhXnN76 vdcQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=AYJ8WMdRgqpkQr3m1vh4w+jqiD4VkQ/k+y3Mp4fYFaA=; b=DYYhmbouNeW0OZhywOScqmhSWMJQ+K4cfBqcZuNDKabcVI7NXMXlw4P7rNzTG5gSt4 5VbfAdyHhF3d26C/2jPoSLs2Q8krEbvTswS8/yjIX4wiqswStMtlAbB24fhw8XTaxt4g db8ZHZw448jR3a8wB6gvVAYSLPtMFCbgkPTu7s3x4feWfxTpuBRUbQyHeigoNAffogHr rRoA4e69vYnGV/GV7R0xaC9Gymkg1ySj3tzrAJE2Y0dRMOfMKEu/gNTuYprDcrrGWTkA cYG13Ao/JbWtlLVU/1qFlcGL4adeOvfOw7tVJsKVCCZj1aQ0d5eMVnGdsIxCHeHhrv+u UfYg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=JpFzz1ux; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id b27si1516281ede.233.2019.09.20.09.16.02; Fri, 20 Sep 2019 09:16:26 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=JpFzz1ux; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2406868AbfISWdG (ORCPT + 99 others); Thu, 19 Sep 2019 18:33:06 -0400 Received: from mail.kernel.org ([198.145.29.99]:51136 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2405952AbfISWMS (ORCPT ); Thu, 19 Sep 2019 18:12:18 -0400 Received: from localhost (83-86-89-107.cable.dynamic.v4.ziggo.nl [83.86.89.107]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 5CB9321920; Thu, 19 Sep 2019 22:12:17 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1568931137; bh=hFYo/74gVn52eg42PNmX0qBZBecS71x9smF8rN55b5I=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=JpFzz1uxt2N2mQv/Ux8+jlr4+pi5fTqM8yWptNlXcSrH1PG0Fp6t0D0V1rZ24SNjv PuqWUbhpIpBPQKJdoQA3/3kkoT985KDKoUOM2i4tC5+QK8qCHtzt8iWhIqYNrLL/1H oyfQ7q3pXEvnl8leRjJYGz9ZdVPt1O8tR9S7dpPA= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Wen Huang , Ganapathi Bhat , Kalle Valo Subject: [PATCH 4.19 17/79] mwifiex: Fix three heap overflow at parsing element in cfg80211_ap_settings Date: Fri, 20 Sep 2019 00:03:02 +0200 Message-Id: <20190919214809.317382787@linuxfoundation.org> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20190919214807.612593061@linuxfoundation.org> References: <20190919214807.612593061@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Wen Huang commit 7caac62ed598a196d6ddf8d9c121e12e082cac3a upstream. mwifiex_update_vs_ie(),mwifiex_set_uap_rates() and mwifiex_set_wmm_params() call memcpy() without checking the destination size.Since the source is given from user-space, this may trigger a heap buffer overflow. Fix them by putting the length check before performing memcpy(). This fix addresses CVE-2019-14814,CVE-2019-14815,CVE-2019-14816. Signed-off-by: Wen Huang Acked-by: Ganapathi Bhat Signed-off-by: Kalle Valo Signed-off-by: Greg Kroah-Hartman --- drivers/net/wireless/marvell/mwifiex/ie.c | 3 +++ drivers/net/wireless/marvell/mwifiex/uap_cmd.c | 9 ++++++++- 2 files changed, 11 insertions(+), 1 deletion(-) --- a/drivers/net/wireless/marvell/mwifiex/ie.c +++ b/drivers/net/wireless/marvell/mwifiex/ie.c @@ -241,6 +241,9 @@ static int mwifiex_update_vs_ie(const u8 } vs_ie = (struct ieee_types_header *)vendor_ie; + if (le16_to_cpu(ie->ie_length) + vs_ie->len + 2 > + IEEE_MAX_IE_SIZE) + return -EINVAL; memcpy(ie->ie_buffer + le16_to_cpu(ie->ie_length), vs_ie, vs_ie->len + 2); le16_unaligned_add_cpu(&ie->ie_length, vs_ie->len + 2); --- a/drivers/net/wireless/marvell/mwifiex/uap_cmd.c +++ b/drivers/net/wireless/marvell/mwifiex/uap_cmd.c @@ -265,6 +265,8 @@ mwifiex_set_uap_rates(struct mwifiex_uap rate_ie = (void *)cfg80211_find_ie(WLAN_EID_SUPP_RATES, var_pos, len); if (rate_ie) { + if (rate_ie->len > MWIFIEX_SUPPORTED_RATES) + return; memcpy(bss_cfg->rates, rate_ie + 1, rate_ie->len); rate_len = rate_ie->len; } @@ -272,8 +274,11 @@ mwifiex_set_uap_rates(struct mwifiex_uap rate_ie = (void *)cfg80211_find_ie(WLAN_EID_EXT_SUPP_RATES, params->beacon.tail, params->beacon.tail_len); - if (rate_ie) + if (rate_ie) { + if (rate_ie->len > MWIFIEX_SUPPORTED_RATES - rate_len) + return; memcpy(bss_cfg->rates + rate_len, rate_ie + 1, rate_ie->len); + } return; } @@ -391,6 +396,8 @@ mwifiex_set_wmm_params(struct mwifiex_pr params->beacon.tail_len); if (vendor_ie) { wmm_ie = vendor_ie; + if (*(wmm_ie + 1) > sizeof(struct mwifiex_types_wmm_info)) + return; memcpy(&bss_cfg->wmm_info, wmm_ie + sizeof(struct ieee_types_header), *(wmm_ie + 1)); priv->wmm_enabled = 1;