Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753370AbcD0IEA (ORCPT ); Wed, 27 Apr 2016 04:04:00 -0400 Received: from aserp1040.oracle.com ([141.146.126.69]:39198 "EHLO aserp1040.oracle.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753225AbcD0IDw (ORCPT ); Wed, 27 Apr 2016 04:03:52 -0400 Date: Wed, 27 Apr 2016 11:02:43 +0300 From: Dan Carpenter To: Julia Lawall Cc: Kees Cook , Pengfei Wang , "security@kernel.org" , LKML Subject: Re: Double-Fetch bug in Linux-4.5/drivers/scsi/aacraid/commctrl.c Message-ID: <20160427080105.GI17913@mwanda> References: <0484FFD3-4BAB-43B9-AD56-B4A098C3E8AE@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-Source-IP: aserv0021.oracle.com [141.146.126.233] Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 1339 Lines: 44 On Wed, Apr 27, 2016 at 07:42:04AM +0200, Julia Lawall wrote: > > > On Tue, 26 Apr 2016, Kees Cook wrote: > > > On Mon, Apr 25, 2016 at 7:50 AM, Pengfei Wang wrote: > > > Hello, > > > > > > I found this Double-Fetch bug in Linux-4.5/drivers/scsi/aacraid/commctrl.c > > > when I was examining the source code. > > > > Thanks for these reports! I wrote a coccinelle script to find these, > > but it requires some manual checking. For what it's worth, it found > > your report as well: > > > > ./drivers/scsi/aacraid/commctrl.c:116:5-19: potentially dangerous > > second copy_from_user() > > > > So I should probably get this added to the coccicheck run... Maybe it > > can get some clean up from Julia. :) > > I looked a bit at the results, and didn't see anything obvious. What is > the problem, exactly, and what would be a characteristic of a false > positive? > copy_from_user(dest, src, sizeof(dest)); if (dest.extra > MAX_SIZE) return -EINVAL; copy_from_user(dest, src, sizeof(dest) + dest.extra); for (i = 0; i < dest.extra; i++) { dest.foo[i] = xxx; We get dest.extra from the user, we verify the size, then we copy more data from the user but that over writes dest.extra again. We use dest.extra a second time without checking that it's still <= MAX_SIZE. regards, dan carpenter