Received: by 2002:a05:6a10:f3d0:0:0:0:0 with SMTP id a16csp2859839pxv; Mon, 12 Jul 2021 03:47:55 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxr1hBc4VM2myGEKgxCo2a2H508WTLDoStIx0lHQk+RVjXCX6HPzmAiFWs0QD1SdlNbRq6q X-Received: by 2002:a92:d80c:: with SMTP id y12mr16584180ilm.30.1626086875681; Mon, 12 Jul 2021 03:47:55 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1626086875; cv=none; d=google.com; s=arc-20160816; b=cb96853yvhchFoaK95Q7rJHwlYcx20LF2zUhlwoElyoKQgwsKXZbOOSW4352rV60Ry Rff+zFMw9ZaCgldMXTlOXbpwAwfX64dFR4ZgGsZuyr2mPXzIxeKyN4de5QX9xqLjr4xE dt/Pw+pFOzgmAvKcEzz8XaNvap1W2sLp9bYe60u/uyjgIEtVcZcwH52LjZuw9eT2J9yX W64BcHA/R3t7i1LAsX6PxKwBZ2awoBCPFHat7VMMV6gv49zRyF9ne9lFWPjbP8Yl1yi7 7JbbGYA2OdF9Cf9F29/hWZQlVhHAhcB9MA8ZnqbIaxvmm0WmjIfVsVz4yxKYhLjfxvJX oqmA== 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=/vZ828vZUJw/pQ/JKBw9ILI6vFQ/wPDwVuOySrRPVXk=; b=rLWEFQ8kpAusAycwdea/y6SAsPW8UBg7RVPa6/K9R4QqtA0T0iTn8/gQmEkOvOP5PU IRvYgSWUXbzIQU5FAKuWpaVyYMApYmLl9PtuXQ23y7VKLbgtlcrQRoQRIY31e0MaxHW8 0Ed824BsbSvf1qox4Q2ZlJn+eW+0dvNiPyFbpYeHb83oFnXBVOn2grlym3cDV0E7S92b Vh7ox6u4JySo9BkkHoLARwY2R2lZgz/lXP9ZClmBlX1ap3ZHdEARmnFnvprbrl996/v1 K8qFRvmYeZDWz3aUXvSv48mnP61QJscXBG6QRd7ljMdTZULv0dm4tXLEk/gPg+t4Fs3D HGFA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=2Mlu+E9m; 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 n3si19141856ioh.98.2021.07.12.03.47.44; Mon, 12 Jul 2021 03:47:55 -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=2Mlu+E9m; 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 S1352482AbhGLHyz (ORCPT + 99 others); Mon, 12 Jul 2021 03:54:55 -0400 Received: from mail.kernel.org ([198.145.29.99]:59176 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S239124AbhGLHVL (ORCPT ); Mon, 12 Jul 2021 03:21:11 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id CD52961153; Mon, 12 Jul 2021 07:18:21 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1626074302; bh=6lGjeoekTz6ys6sJqsXFEGnZmJ/mgkagM0GBlo5Gag4=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=2Mlu+E9mnyZMYlvYOAD/+D1xmuXAKc5SWTxO7ys/xztt2Cfjxhh3JXcXMjrCU0eLE BbD6MAkWZLEvx9s5Oc575vtSz38/UkpSy1lqy8wPT6+8KZQhiS7FvNKMUVsOQk353H 3ucYjcgED86ckxN+kYrQWzyFO4wGnfhtd8WfKt0I= 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.12 491/700] ipv6: fix out-of-bound access in ip6_parse_tlv() Date: Mon, 12 Jul 2021 08:09:34 +0200 Message-Id: <20210712061028.777846500@linuxfoundation.org> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20210712060924.797321836@linuxfoundation.org> References: <20210712060924.797321836@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 a9e1d7918d14..6ffa05298cc0 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