Received: by 2002:a25:86ce:0:0:0:0:0 with SMTP id y14csp2183776ybm; Thu, 23 May 2019 12:44:36 -0700 (PDT) X-Google-Smtp-Source: APXvYqx4KVzBw9TCArPfy1L+PWo6Jls4DCamKaNurY3YvVWpD+fT8BhnkThtFgXT2jG/0Z/4sKXV X-Received: by 2002:a17:90a:a27:: with SMTP id o36mr3755708pjo.95.1558640676743; Thu, 23 May 2019 12:44:36 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1558640676; cv=none; d=google.com; s=arc-20160816; b=NAsUUiT2NXpJDtMmtHaIXV1jVBkmCf+jkpiN4+x/lfY8GVGrpd2TnUfBrRnhyyYd9l qanzNc+ASG/otBhBsEQeUDaYgXYV/vLPpBQLgTVyzxwnR0DJU9AeXzYzcFHEHFlixUNj TSPFGNJY/djCzS8xtHAIVsHgFnRub12ryTVcA6vaXqvZHENdTxR7aSVrrTA0hKtFxeoC 4N092C+6h1WJh7u8iREgjclEJfDT/HpFGKzQ7jbJZjCBrWBZ6b/w7UO7uzVAvvellOCw CbXCn5M7CHfc9hycp6D71chm4nK/SfB1yrrFciMc8R5k3axX/5dUkw3qA37QvzybNw9R PKYA== 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=NukGhOOD7+A1t732UySUp/FPmu225i0qJN4bVcwM06Y=; b=UrUEzG59ke+prve1BK8Hw6SMQrwVpeXTeDIAU//I4DE6JimBqUfgpn7qZCVwZTFviu CcZ5SZOP5lv7TLKbyowyjndw/QJSw5b3nywbQHVJHfDlf+rmxcNLJgHEyaFoYPLKFhR8 1bQ3ddYFAhV1bktpPk9XOM87eSisL88C9h9Xqg5HTRolb+rt4OVsUgaeysH2h8ci8Y/m 5lsqbmg5LvWp+RTt+GGQxheq5BYX/NnYCLbcWDJYGem7mPg+oszb+u/IHk+Pf2i1BbuD FV5khkpmUYGrkAWtau6A5sTffrlP584eW2uoJYJ9hw2oUw8j9VBIm62qVkwK/rJmfqpN ohXg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=TcRoAxEV; 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 e2si282891pfh.286.2019.05.23.12.44.21; Thu, 23 May 2019 12:44:36 -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=TcRoAxEV; 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 S2389708AbfEWTS4 (ORCPT + 99 others); Thu, 23 May 2019 15:18:56 -0400 Received: from mail.kernel.org ([198.145.29.99]:54564 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2389700AbfEWTSw (ORCPT ); Thu, 23 May 2019 15:18:52 -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 70FEA2133D; Thu, 23 May 2019 19:18:51 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1558639131; bh=Fn75vAqq208ZamoG1r5eXuJPt0CbASeV6eFZIIJezJ0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=TcRoAxEVbRJqSyXpejEb5R/N0iCi8u9ZgTVP2SptTb2B4NLJHAFDZN8cd2d/8Tksy g4aDwwluKLfJEESHmXslQJt8dLZ8HAfuNgA03Ez00r80PT8rW8Bz1DdsYsM8yCa+R6 mF7K6BGEv/NiIIIgUafSxXaeFBJgUSwGgdfXKC4w= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Steffen Klassert , Sasha Levin Subject: [PATCH 4.19 089/114] xfrm4: Fix uninitialized memory read in _decode_session4 Date: Thu, 23 May 2019 21:06:28 +0200 Message-Id: <20190523181739.613288277@linuxfoundation.org> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190523181731.372074275@linuxfoundation.org> References: <20190523181731.372074275@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 [ Upstream commit 8742dc86d0c7a9628117a989c11f04a9b6b898f3 ] We currently don't reload pointers pointing into skb header after doing pskb_may_pull() in _decode_session4(). So in case pskb_may_pull() changed the pointers, we read from random memory. Fix this by putting all the needed infos on the stack, so that we don't need to access the header pointers after doing pskb_may_pull(). Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2") Signed-off-by: Steffen Klassert Signed-off-by: Sasha Levin --- net/ipv4/xfrm4_policy.c | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/net/ipv4/xfrm4_policy.c b/net/ipv4/xfrm4_policy.c index d73a6d6652f60..2b144b92ae46a 100644 --- a/net/ipv4/xfrm4_policy.c +++ b/net/ipv4/xfrm4_policy.c @@ -111,7 +111,8 @@ static void _decode_session4(struct sk_buff *skb, struct flowi *fl, int reverse) { const struct iphdr *iph = ip_hdr(skb); - u8 *xprth = skb_network_header(skb) + iph->ihl * 4; + int ihl = iph->ihl; + u8 *xprth = skb_network_header(skb) + ihl * 4; struct flowi4 *fl4 = &fl->u.ip4; int oif = 0; @@ -122,6 +123,11 @@ _decode_session4(struct sk_buff *skb, struct flowi *fl, int reverse) fl4->flowi4_mark = skb->mark; fl4->flowi4_oif = reverse ? skb->skb_iif : oif; + fl4->flowi4_proto = iph->protocol; + fl4->daddr = reverse ? iph->saddr : iph->daddr; + fl4->saddr = reverse ? iph->daddr : iph->saddr; + fl4->flowi4_tos = iph->tos; + if (!ip_is_fragment(iph)) { switch (iph->protocol) { case IPPROTO_UDP: @@ -133,7 +139,7 @@ _decode_session4(struct sk_buff *skb, struct flowi *fl, int reverse) pskb_may_pull(skb, xprth + 4 - skb->data)) { __be16 *ports; - xprth = skb_network_header(skb) + iph->ihl * 4; + xprth = skb_network_header(skb) + ihl * 4; ports = (__be16 *)xprth; fl4->fl4_sport = ports[!!reverse]; @@ -146,7 +152,7 @@ _decode_session4(struct sk_buff *skb, struct flowi *fl, int reverse) pskb_may_pull(skb, xprth + 2 - skb->data)) { u8 *icmp; - xprth = skb_network_header(skb) + iph->ihl * 4; + xprth = skb_network_header(skb) + ihl * 4; icmp = xprth; fl4->fl4_icmp_type = icmp[0]; @@ -159,7 +165,7 @@ _decode_session4(struct sk_buff *skb, struct flowi *fl, int reverse) pskb_may_pull(skb, xprth + 4 - skb->data)) { __be32 *ehdr; - xprth = skb_network_header(skb) + iph->ihl * 4; + xprth = skb_network_header(skb) + ihl * 4; ehdr = (__be32 *)xprth; fl4->fl4_ipsec_spi = ehdr[0]; @@ -171,7 +177,7 @@ _decode_session4(struct sk_buff *skb, struct flowi *fl, int reverse) pskb_may_pull(skb, xprth + 8 - skb->data)) { __be32 *ah_hdr; - xprth = skb_network_header(skb) + iph->ihl * 4; + xprth = skb_network_header(skb) + ihl * 4; ah_hdr = (__be32 *)xprth; fl4->fl4_ipsec_spi = ah_hdr[1]; @@ -183,7 +189,7 @@ _decode_session4(struct sk_buff *skb, struct flowi *fl, int reverse) pskb_may_pull(skb, xprth + 4 - skb->data)) { __be16 *ipcomp_hdr; - xprth = skb_network_header(skb) + iph->ihl * 4; + xprth = skb_network_header(skb) + ihl * 4; ipcomp_hdr = (__be16 *)xprth; fl4->fl4_ipsec_spi = htonl(ntohs(ipcomp_hdr[1])); @@ -196,7 +202,7 @@ _decode_session4(struct sk_buff *skb, struct flowi *fl, int reverse) __be16 *greflags; __be32 *gre_hdr; - xprth = skb_network_header(skb) + iph->ihl * 4; + xprth = skb_network_header(skb) + ihl * 4; greflags = (__be16 *)xprth; gre_hdr = (__be32 *)xprth; @@ -213,10 +219,6 @@ _decode_session4(struct sk_buff *skb, struct flowi *fl, int reverse) break; } } - fl4->flowi4_proto = iph->protocol; - fl4->daddr = reverse ? iph->saddr : iph->daddr; - fl4->saddr = reverse ? iph->daddr : iph->saddr; - fl4->flowi4_tos = iph->tos; } static void xfrm4_update_pmtu(struct dst_entry *dst, struct sock *sk, -- 2.20.1