Received: by 2002:a25:d7c1:0:0:0:0:0 with SMTP id o184csp236009ybg; Thu, 17 Oct 2019 22:07:33 -0700 (PDT) X-Google-Smtp-Source: APXvYqxbCXZYOTRxmRmrB7U3+IMbsjizCbjNvZE+7L50zZ0NgtjqZa6cUuYiR5XG2cPcE52DU9uS X-Received: by 2002:a05:6402:120c:: with SMTP id c12mr7631278edw.119.1571375253860; Thu, 17 Oct 2019 22:07:33 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1571375253; cv=none; d=google.com; s=arc-20160816; b=FnZ3uaXuD9FEZvZmMYCmb3TyuUqW9YiTiDb24v3NB1fFUSq3kZMN9T1Hdo3imYuv+h 1vyAgm98vqniqEE7DHoGYHUdJjdZ3R30b6B/ksPtcIPJ/pauoq3pczd+SVYaDmkrM9JP vdjbU6pze02CwArR0VYm8pkdgj9PPbFipAPpRFjXl+rfoMM6y1fA3/WWlFxAGYFjUihS 0jc5chFwc92JUeMEL/DGrivUhpoHMmdXb+Y+YtCAkyAn96+3Nlj2Xs5o8pq7ihUfjHpo kYMOxIV+p0bKvO9dl2ewXYiGNPozxn3nr6bdmauuL5tnc9QQ0PJTfnX6+AyzGLnXb32Z A2Bw== 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=dvi3apbjrZ0SEn1Q/idztw1K4gm6YRqFQ2NJBGFslrk=; b=J9WC4D1zleZKdhIqCYZ0HE2QLNINl0FW+vAzE307sAMRHHrVYG8vv3fSwdx/oaXFe+ xm01WQslRsijRMHu4OTdHIZ2vJDVdVJbC2x8/1ENLewhEgfEfuXDH6VEW8loR0VYmT5b jt6Rk1sMSXpAIrOX8ZwOgivXtriW84/37vTyNR99aLNuN6QYv27wXF7ht28lp3Lqow7F va6sSND13LKuVfDn57fIq3BcQmmDH50/e0y195Bn+lRircg847MG/YtyvHvrhaQYBiAH wPXFzkZDZOUT4hCIIBZYmSLu/vCdUGlplfJmklI368JzGiWckd7jZYVbwjzOzifd5QB9 +yVg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b="TUNe/wgx"; 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 v5si3259160edm.313.2019.10.17.22.07.10; Thu, 17 Oct 2019 22:07:33 -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="TUNe/wgx"; 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 S2407665AbfJPWW6 (ORCPT + 99 others); Wed, 16 Oct 2019 18:22:58 -0400 Received: from mail.kernel.org ([198.145.29.99]:41678 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2394818AbfJPVxF (ORCPT ); Wed, 16 Oct 2019 17:53:05 -0400 Received: from localhost (unknown [192.55.54.58]) (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 39EFA20872; Wed, 16 Oct 2019 21:53:05 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1571262785; bh=z7e3b64ZxZUuiZOLYpXZAucDMCG1LD6KLGmUQ5zSqqs=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=TUNe/wgxdst/LLoscWWLkAAs56Zj+erdjHSIoxKpsTwV50v28U6xFM3mT8mu/lv9q +iYSQlEL38teYFRV3Nu+uaPKCcmvg7DHex0wD9ZNq2AcdqnAP1oElNlVuU/QUL/3tp iZtDA6nXFPe2A2vRhGN4KmQU2Mopm7QeydhdYXdk= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Johannes Berg Subject: [PATCH 4.4 26/79] nl80211: validate beacon head Date: Wed, 16 Oct 2019 14:50:01 -0700 Message-Id: <20191016214754.046642225@linuxfoundation.org> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20191016214729.758892904@linuxfoundation.org> References: <20191016214729.758892904@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: Johannes Berg commit f88eb7c0d002a67ef31aeb7850b42ff69abc46dc upstream. We currently don't validate the beacon head, i.e. the header, fixed part and elements that are to go in front of the TIM element. This means that the variable elements there can be malformed, e.g. have a length exceeding the buffer size, but most downstream code from this assumes that this has already been checked. Add the necessary checks to the netlink policy. Cc: stable@vger.kernel.org Fixes: ed1b6cc7f80f ("cfg80211/nl80211: add beacon settings") Link: https://lore.kernel.org/r/1569009255-I7ac7fbe9436e9d8733439eab8acbbd35e55c74ef@changeid Signed-off-by: Johannes Berg Signed-off-by: Greg Kroah-Hartman --- net/wireless/nl80211.c | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) --- a/net/wireless/nl80211.c +++ b/net/wireless/nl80211.c @@ -210,6 +210,36 @@ cfg80211_get_dev_from_info(struct net *n return __cfg80211_rdev_from_attrs(netns, info->attrs); } +static int validate_beacon_head(const struct nlattr *attr) +{ + const u8 *data = nla_data(attr); + unsigned int len = nla_len(attr); + const struct element *elem; + const struct ieee80211_mgmt *mgmt = (void *)data; + unsigned int fixedlen = offsetof(struct ieee80211_mgmt, + u.beacon.variable); + + if (len < fixedlen) + goto err; + + if (ieee80211_hdrlen(mgmt->frame_control) != + offsetof(struct ieee80211_mgmt, u.beacon)) + goto err; + + data += fixedlen; + len -= fixedlen; + + for_each_element(elem, data, len) { + /* nothing */ + } + + if (for_each_element_completed(elem, data, len)) + return 0; + +err: + return -EINVAL; +} + /* policy for the attributes */ static const struct nla_policy nl80211_policy[NUM_NL80211_ATTR] = { [NL80211_ATTR_WIPHY] = { .type = NLA_U32 }, @@ -3214,6 +3244,11 @@ static int nl80211_parse_beacon(struct n memset(bcn, 0, sizeof(*bcn)); if (attrs[NL80211_ATTR_BEACON_HEAD]) { + int ret = validate_beacon_head(attrs[NL80211_ATTR_BEACON_HEAD]); + + if (ret) + return ret; + bcn->head = nla_data(attrs[NL80211_ATTR_BEACON_HEAD]); bcn->head_len = nla_len(attrs[NL80211_ATTR_BEACON_HEAD]); if (!bcn->head_len)