Received: by 2002:a05:6a10:f3d0:0:0:0:0 with SMTP id a16csp2829522pxv; Mon, 12 Jul 2021 02:59:57 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzISJAsTbmaEyq/EZNghD+uzN6pyFLFFGPjY9rS8dYhKcrlzG7Rmo6tU6/WD/KvIlQvZleg X-Received: by 2002:a02:a38f:: with SMTP id y15mr19191410jak.108.1626083996947; Mon, 12 Jul 2021 02:59:56 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1626083996; cv=none; d=google.com; s=arc-20160816; b=kxnYaJgL3sK6KaV6HpC2POJ9Oda0XUZACuvnVCm9R4jKnHbkoiWYP3ybDovtMMnfky u6oM5zEnicFY0O9TT/w5m/UG+tXVa+9qMqluyr7Rjzk5V/htsqW5NOqZ8XJxLlq2c5K5 37DmXLqo7QvpcY1s8YJhW85PTk6MXoKzMJqoSbUF7yb2xKz7SM7v+sot9Na4NvVcRY0m 0NM7LkoXd3qxfWnWR9F5vy5Zb79TsHIKdHtx1nF2IDqkjHiSSqJDgjuzvtx/bwvJ/x7Y cA9wTFqPvX7PUVYTkY6ARdwqOpbtxkhI1Ir92G5lpsjutSpuwPMCJ5bKavZhRE0qI3tX BaNg== 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=7Vd0f4wK58uwl7MGNLIyORWtUZQ1Wp2JGrzZZ2988eE=; b=K6tDSYK+u6CIAyEyOWyvd5aaqepmBW0TEpOHRfMYKsSTp5muFajyTyFXYxozONsdJl urQdy7/z+UneWZzweYZ1Nsjz+ntzTmT/ZPM2si8icfIJ7y15lEk4gKH7sUQNAAKkMpTP m0eSYnMSwUb1h/pKOHq0OXPTj7DydtxOcPZbExOfb7bbWvwrz03TOO6dgLHuwyholU39 ut9XEQRWMqzogI8qJJLZD9Nw9fUseneA1FUfjddXAAwWbsKklx1JvcDYBjmtThPimdR7 MrsMQbw4QKPovAdBCDlUUXew07tHv4Y8+scN9uDRAXf2Rqyolgnzc8Pl6rPY1d/4yiig +fgA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=09Su2qaY; 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 d6si17438018ilv.2.2021.07.12.02.59.43; Mon, 12 Jul 2021 02:59:56 -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=09Su2qaY; 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 S242819AbhGLHG6 (ORCPT + 99 others); Mon, 12 Jul 2021 03:06:58 -0400 Received: from mail.kernel.org ([198.145.29.99]:42444 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S236692AbhGLGrl (ORCPT ); Mon, 12 Jul 2021 02:47:41 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id D1FB5611CC; Mon, 12 Jul 2021 06:43:41 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1626072222; bh=CHa9FJSGkbGGKMI1u2TuMSfKAUXIddxcye+fd2miGj8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=09Su2qaYsLnMXAWgUQzQncO5F1d6/eNCxFH+zaVaiesOSBiLjgz3+ZaeTfVw7lOZt 1f20eCQyFScdjFLzM3oD7FdgRD9PHKEEuVSgkK32n6xZKZ7OsTb0Ky3YHvLOarpKeM Kzt3yNrX3RIDM8v3mR6wph+nTUG5OcEwgYUpMazU= 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.10 406/593] ipv6: fix out-of-bound access in ip6_parse_tlv() Date: Mon, 12 Jul 2021 08:09:26 +0200 Message-Id: <20210712060932.424981437@linuxfoundation.org> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20210712060843.180606720@linuxfoundation.org> References: <20210712060843.180606720@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 15223451cd7f..4932dea9820b 100644 --- a/net/ipv6/exthdrs.c +++ b/net/ipv6/exthdrs.c @@ -135,18 +135,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. @@ -163,12 +168,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; @@ -188,7 +188,6 @@ static bool ip6_parse_tlv(const struct tlvtype_proc *procs, return false; padlen = 0; - break; } off += optlen; len -= optlen; -- 2.30.2