Received: by 2002:a05:6a10:f3d0:0:0:0:0 with SMTP id a16csp2711357pxv; Sun, 11 Jul 2021 23:29:43 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwh3mWQssFkD5sgNOmaBIJWS5YIt7qiVndcXG7iJDGMAF0JG0182vkpSwHFoxX9F+JZl4um X-Received: by 2002:a05:6402:5cd:: with SMTP id n13mr4385118edx.345.1626071383531; Sun, 11 Jul 2021 23:29:43 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1626071383; cv=none; d=google.com; s=arc-20160816; b=BTb14BXC6CHHMNZg+TVvkMpWeAShErXjhPUFSzgTShOXYkZx28Vrllr+/eaelZdIim cBKfciL6UwnEGihGMiZyvOI0svB2cV/VCy0sIwpb9WT13aGyU8t0zyz6OVgMBJn+G7Gx WH8NGN+nqv8iEkFSZqSWGq1w9GgZwm4NMqAjBNjQtdQSTpuzPbfmEO+6poTMQMNSD5JF 81dW1JycPgBvEdNR4cWLtlZeejshVMKNZDj4GoYxXrhVE06Elkv0awvUXfCV4UREgy4I LatKsnrQyALKuYArbKBIVWTkAlpaNw2PzRJA5VCgbWBbG3JGuOQ5mz2RTw906TDjuq4p SRmQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=t66Isd66u9qe+LMU9kdrvTscqyMe2HmaOlKz/T7a9RU=; b=u4kBUc6fG2v88DtAwWjttwqhRgIlZhe02UozxuUNaQhtA086dOXUNz6X0thG8dVeEp gNW1484yXoTQhFUZGEuCymzSjc4ioI4yt4Dsr19yFJyDGs0gJYFY6nXxs5+Su/SaZFPt t3I01L3MmXpa4NJSPkVXGfR1fiDRutSiftH3iuPE2TWHi35um8ioH2/zfDUFFhcPFuUx JHxVysLwNqcswrL0gDfth0z5PYBdQWibxk2fwFu6sq/IAhBAv4cAi0NRhAHGjPr2B1Ry HFMd5J7UIfc9WmXEb7psL/zpg3/VyjO55jNTA4BKbeAg3eAx+YeIYE8mvSu2AW1QhfNl 7NtQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=b11mIp23; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id hq18si5604411ejc.5.2021.07.11.23.29.20; Sun, 11 Jul 2021 23:29:43 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=b11mIp23; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S237349AbhGLGar (ORCPT + 99 others); Mon, 12 Jul 2021 02:30:47 -0400 Received: from mail.kernel.org ([198.145.29.99]:45894 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235355AbhGLG0e (ORCPT ); Mon, 12 Jul 2021 02:26:34 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id 5E2F061132; Mon, 12 Jul 2021 06:23:35 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1626071015; bh=QOypwI2tdb1XBizQqAP7iQuPeCEQDYS57RqmUcBuQRM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=b11mIp23pFvaJt4YfEA4D0YE641IgHHByKcICAFkFg/wdvw0ZjjaRHWQznlu2KFvI HIRDNf4ozyIOlc2VL7XgN/OZV/pCY9JYvttMlwPdCXrAXkf4a1pnhZJUQ5LD1ARWkX wBdud/9vVVqEGZTkb2rGLXwAIpus+fiY86wGbP60= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Eric Dumazet , Paolo Abeni , Tom Herbert , "David S. Miller" , Sasha Levin Subject: [PATCH 5.4 237/348] ipv6: fix out-of-bound access in ip6_parse_tlv() Date: Mon, 12 Jul 2021 08:10:21 +0200 Message-Id: <20210712060733.938738330@linuxfoundation.org> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20210712060659.886176320@linuxfoundation.org> References: <20210712060659.886176320@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Eric Dumazet [ Upstream commit 624085a31c1ad6a80b1e53f686bf6ee92abbf6e8 ] First problem is that optlen is fetched without checking there is more than one byte to parse. Fix this by taking care of IPV6_TLV_PAD1 before fetching optlen (under appropriate sanity checks against len) Second problem is that IPV6_TLV_PADN checks of zero padding are performed before the check of remaining length. Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2") Fixes: c1412fce7ecc ("net/ipv6/exthdrs.c: Strict PadN option checking") Signed-off-by: Eric Dumazet Cc: Paolo Abeni Cc: Tom Herbert Signed-off-by: David S. Miller Signed-off-by: Sasha Levin --- net/ipv6/exthdrs.c | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/net/ipv6/exthdrs.c b/net/ipv6/exthdrs.c index 413a47ca43e9..69128000bc31 100644 --- a/net/ipv6/exthdrs.c +++ b/net/ipv6/exthdrs.c @@ -134,18 +134,23 @@ static bool ip6_parse_tlv(const struct tlvtype_proc *procs, len -= 2; while (len > 0) { - int optlen = nh[off + 1] + 2; - int i; + int optlen, i; - switch (nh[off]) { - case IPV6_TLV_PAD1: - optlen = 1; + if (nh[off] == IPV6_TLV_PAD1) { padlen++; if (padlen > 7) goto bad; - break; + off++; + len--; + continue; + } + if (len < 2) + goto bad; + optlen = nh[off + 1] + 2; + if (optlen > len) + goto bad; - case IPV6_TLV_PADN: + if (nh[off] == IPV6_TLV_PADN) { /* RFC 2460 states that the purpose of PadN is * to align the containing header to multiples * of 8. 7 is therefore the highest valid value. @@ -162,12 +167,7 @@ static bool ip6_parse_tlv(const struct tlvtype_proc *procs, if (nh[off + i] != 0) goto bad; } - break; - - default: /* Other TLV code so scan list */ - if (optlen > len) - goto bad; - + } else { tlv_count++; if (tlv_count > max_count) goto bad; @@ -187,7 +187,6 @@ static bool ip6_parse_tlv(const struct tlvtype_proc *procs, return false; padlen = 0; - break; } off += optlen; len -= optlen; -- 2.30.2