Received: by 2002:a25:1506:0:0:0:0:0 with SMTP id 6csp6210931ybv; Tue, 18 Feb 2020 12:06:23 -0800 (PST) X-Google-Smtp-Source: APXvYqwdzwn8HBwqF1QLBysznMDHCCwxZAs6NiMaJikafwZ80ys8YjkwvsrukRkULbETngMxepDZ X-Received: by 2002:a9d:2028:: with SMTP id n37mr17772284ota.127.1582056382916; Tue, 18 Feb 2020 12:06:22 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1582056382; cv=none; d=google.com; s=arc-20160816; b=oiHM2YtTKeimwuYC2WYSkzgOj0+oSkwyNM3LTpCHlzzEH28BgzerFyO8FdojVf/6Ko DoYou1p/A0e6v6mjRoITDpe6JCzbXC/14ARoF7fOHRm320Evr92qsvBxCws9suTiYsx/ EPUDEELG67R3MWWIPeUt1UunkUypQHrmZLuAHpR+ptP2GKrl1YD4gyfZFL8ObL2F+qch o3T48MiuGwHiGSdDKxLMreOX7frIJJr+UtpQ/5TTZd/OU6VgWuVNbQRQ/onqQGeYjvdj uTypCb0cjxkCrCfrMj2cdXX55N574GCBBovmmrdBzZnCohREdAEMbGpMqgIPm5DYWd7H 04hA== 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=MGf0iJob5kB2UI697SKg/2/Qs3vFzgMTNqr9ic3BFf8=; b=v4E6WHXLr4ed/qbUn1zO2bW5qjXmf2UunSj2SRLaTwYF6SR16Oo5htwbH/DO/gYdvs NBUOYgdsYgtDy0QnSuS4kjU3LC8go5aWE0IM3/Wtv7EBDvZaS2aWe2LGNnJqRu461Sst io1UUS7I0Cdx92gJvKfhE6s0t6lIlupUPyx3BhmqC4NRemFdY1GlGja2yTsIo8UBtN6A uxVn7mLXOT0frpIjzsZPecUKT1CgNy7FO2cJ682JKzln6VkbIyMZM8VgpIXD8zTa6bCW u1/LEwKgK4rphFJ6O5iFziA1QOgGnwwQoVJwbJBI9qWNvlr4wijcknDPPSOj8UutrkWE j1QA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=PyFJ7Bc6; 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 p186si8930126oih.172.2020.02.18.12.06.09; Tue, 18 Feb 2020 12:06:22 -0800 (PST) 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=PyFJ7Bc6; 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 S1728946AbgBRUCb (ORCPT + 99 others); Tue, 18 Feb 2020 15:02:31 -0500 Received: from mail.kernel.org ([198.145.29.99]:42862 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728938AbgBRUC3 (ORCPT ); Tue, 18 Feb 2020 15:02:29 -0500 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 556BD24125; Tue, 18 Feb 2020 20:02:28 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1582056148; bh=OjXV5UxT/cv4HzXnOe69nhUM+fCcsFqY4JerfQY6uFc=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=PyFJ7Bc6gL6ylttxSbbDEBXu+/uRXdb1/qd5+ibQ9ucUkyjHl3neK/MXsA3fLsepO +9zocA7IAAWBpTQUCffu88ILFL/ztzAPWpCs6cLJq6p+AtXmkdW5xqHwFt7b4g8CVO q2GcRcrbHbJH00xHS3Kuy0peciYVMtDE5SOzPGLw= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Avihai Horon , Maor Gottlieb , Leon Romanovsky , Jason Gunthorpe Subject: [PATCH 5.5 53/80] RDMA/core: Fix invalid memory access in spec_filter_size Date: Tue, 18 Feb 2020 20:55:14 +0100 Message-Id: <20200218190437.251349085@linuxfoundation.org> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200218190432.043414522@linuxfoundation.org> References: <20200218190432.043414522@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: Avihai Horon commit a72f4ac1d778f7bde93dfee69bfc23377ec3d74f upstream. Add a check that the size specified in the flow spec header doesn't cause an overflow when calculating the filter size, and thus prevent access to invalid memory. The following crash from syzkaller revealed it. kasan: CONFIG_KASAN_INLINE enabled kasan: GPF could be caused by NULL-ptr deref or user memory access general protection fault: 0000 [#1] SMP KASAN PTI CPU: 1 PID: 17834 Comm: syz-executor.3 Not tainted 5.5.0-rc5 #2 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.12.1-0-ga5cab58e9a3f-prebuilt.qemu.org 04/01/2014 RIP: 0010:memchr_inv+0xd3/0x330 Code: 89 f9 89 f5 83 e1 07 0f 85 f9 00 00 00 49 89 d5 49 c1 ed 03 45 85 ed 74 6f 48 89 d9 48 b8 00 00 00 00 00 fc ff df 48 c1 e9 03 <80> 3c 01 00 0f 85 0d 02 00 00 44 0f b6 e5 48 b8 01 01 01 01 01 01 RSP: 0018:ffffc9000a13fa50 EFLAGS: 00010202 RAX: dffffc0000000000 RBX: 7fff88810de9d820 RCX: 0ffff11021bd3b04 RDX: 000000000000fff8 RSI: 0000000000000000 RDI: 7fff88810de9d820 RBP: 0000000000000000 R08: ffff888110d69018 R09: 0000000000000009 R10: 0000000000000001 R11: ffffed10236267cc R12: 0000000000000004 R13: 0000000000001fff R14: ffff88810de9d820 R15: 0000000000000040 FS: 00007f9ee0e51700(0000) GS:ffff88811b100000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 0000000000000000 CR3: 0000000115ea0006 CR4: 0000000000360ee0 DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 Call Trace: spec_filter_size.part.16+0x34/0x50 ib_uverbs_kern_spec_to_ib_spec_filter+0x691/0x770 ib_uverbs_ex_create_flow+0x9ea/0x1b40 ib_uverbs_write+0xaa5/0xdf0 __vfs_write+0x7c/0x100 vfs_write+0x168/0x4a0 ksys_write+0xc8/0x200 do_syscall_64+0x9c/0x390 entry_SYSCALL_64_after_hwframe+0x44/0xa9 RIP: 0033:0x465b49 Code: f7 d8 64 89 02 b8 ff ff ff ff c3 66 0f 1f 44 00 00 48 89 f8 48 89 f7 48 89 d6 48 89 ca 4d 89 c2 4d 89 c8 4c 8b 4c 24 08 0f 05 <48> 3d 01 f0 ff ff 73 01 c3 48 c7 c1 bc ff ff ff f7 d8 64 89 01 48 RSP: 002b:00007f9ee0e50c58 EFLAGS: 00000246 ORIG_RAX: 0000000000000001 RAX: ffffffffffffffda RBX: 000000000073bf00 RCX: 0000000000465b49 RDX: 00000000000003a0 RSI: 00000000200007c0 RDI: 0000000000000004 RBP: 0000000000000003 R08: 0000000000000000 R09: 0000000000000000 R10: 0000000000000000 R11: 0000000000000246 R12: 00007f9ee0e516bc R13: 00000000004ca2da R14: 000000000070deb8 R15: 00000000ffffffff Modules linked in: Dumping ftrace buffer: (ftrace buffer empty) Fixes: 94e03f11ad1f ("IB/uverbs: Add support for flow tag") Link: https://lore.kernel.org/r/20200126171500.4623-1-leon@kernel.org Signed-off-by: Avihai Horon Reviewed-by: Maor Gottlieb Signed-off-by: Leon Romanovsky Signed-off-by: Jason Gunthorpe Signed-off-by: Greg Kroah-Hartman --- drivers/infiniband/core/uverbs_cmd.c | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) --- a/drivers/infiniband/core/uverbs_cmd.c +++ b/drivers/infiniband/core/uverbs_cmd.c @@ -2720,12 +2720,6 @@ static int kern_spec_to_ib_spec_action(s return 0; } -static size_t kern_spec_filter_sz(const struct ib_uverbs_flow_spec_hdr *spec) -{ - /* Returns user space filter size, includes padding */ - return (spec->size - sizeof(struct ib_uverbs_flow_spec_hdr)) / 2; -} - static ssize_t spec_filter_size(const void *kern_spec_filter, u16 kern_filter_size, u16 ib_real_filter_sz) { @@ -2869,11 +2863,16 @@ int ib_uverbs_kern_spec_to_ib_spec_filte static int kern_spec_to_ib_spec_filter(struct ib_uverbs_flow_spec *kern_spec, union ib_flow_spec *ib_spec) { - ssize_t kern_filter_sz; + size_t kern_filter_sz; void *kern_spec_mask; void *kern_spec_val; - kern_filter_sz = kern_spec_filter_sz(&kern_spec->hdr); + if (check_sub_overflow((size_t)kern_spec->hdr.size, + sizeof(struct ib_uverbs_flow_spec_hdr), + &kern_filter_sz)) + return -EINVAL; + + kern_filter_sz /= 2; kern_spec_val = (void *)kern_spec + sizeof(struct ib_uverbs_flow_spec_hdr);