Received: by 2002:a05:6902:102b:0:0:0:0 with SMTP id x11csp973989ybt; Wed, 17 Jun 2020 19:35:10 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyIQ1QO2H/qSYKVEaRYLEtarpC9MiLtliuYNa4948OE7mFQzmpnkMADF+DQFT/vKZplLStj X-Received: by 2002:a50:d790:: with SMTP id w16mr1878091edi.231.1592447710556; Wed, 17 Jun 2020 19:35:10 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1592447710; cv=none; d=google.com; s=arc-20160816; b=KlLwyexAKbtRWfUEDOGF+blSAskf744I0mTKxSr5ME9PG6fvTBW+NSY7u6Myz0gR9c wMtwVfEaFtg47qs/nxyBC14/VgPla373b5j5tpJtnMaLrordNBXCsVVRb7eovqFMerao EkMLm1z8WG9OPsXkVproxN4Vl4pivUDX3Z8Y/KewBiLcVVdfpXBK+oZbVY66eABaHl/h 5dPLJKUIfdms1M8Iv30mFkBsJPc5t17q2WT1TtORcFjfDLc1rJbrdik0EdrIOn+wvhN6 X6nufUuJ7AAP9zME7BXoC7LmU3Ij/frJ1n7UBb0zpf+/wJHjXTuuuxR+i06VNlCQpOji hCMA== 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 :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=z0WFVbSmf7/zOq4fEYTRqT1k8TbmgBfoy7ZGeKRkJk0=; b=bp6zCMgHb9do4XbJSOvlSLXQupv3vAyWmqnjT3W9uVjf0TB04Rj/Jgera/GmX1Plqd iUjHV1KvwO3ELdgXNJ+OaLJJiEHIlfaBQ/LxctJDTDdn04gMyRZfdGJSTqNrRG9uZtjO W1uRd8En1dDbZN8yYRn7gz4G465KkjaUlI0zwh21Tkq1EP9zeK7Prggr/bweeX7hrzAz T2EEcclRl+powYF4MTVLUgNDqG5fzwdavnWKBfxb3WlIh0lCO9IemB8rFyO61yBF9kWM rF1af0z5ZfDzTb5CliG+gTi7xuZv4flj1cnNeM/02j2yfA5NrtIeZJTx+3V0mhQegJ87 7o1w== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=u1uRglkx; 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=kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id z14si1051011ejr.261.2020.06.17.19.34.48; Wed, 17 Jun 2020 19:35:10 -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=@kernel.org header.s=default header.b=u1uRglkx; 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=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2387460AbgFRCdJ (ORCPT + 99 others); Wed, 17 Jun 2020 22:33:09 -0400 Received: from mail.kernel.org ([198.145.29.99]:44828 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729417AbgFRBO6 (ORCPT ); Wed, 17 Jun 2020 21:14:58 -0400 Received: from sasha-vm.mshome.net (c-73-47-72-35.hsd1.nh.comcast.net [73.47.72.35]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 64BCE20EDD; Thu, 18 Jun 2020 01:14:57 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1592442898; bh=c6VpuJJmM3SJJVJBzIjuWts789Ks6N5gnyM90yPAznw=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=u1uRglkxkPMK6P0Yk/6hNQGOwysiEeon0XYYuBSX4VTTgcDbFfMTFKhl0a8N1KM4e XhtQZjiom3jXDXzl5xPaLDBGNoa0/IInXvAsCyUiExBAopXMP1jnuIGHoFGht1DMlD pZLEwuivfp3jRxIKiMTxteGKUwhGss1OVh3IKNb8= From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Miklos Szeredi , Sasha Levin , linux-unionfs@vger.kernel.org Subject: [PATCH AUTOSEL 5.7 319/388] ovl: verify permissions in ovl_path_open() Date: Wed, 17 Jun 2020 21:06:56 -0400 Message-Id: <20200618010805.600873-319-sashal@kernel.org> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200618010805.600873-1-sashal@kernel.org> References: <20200618010805.600873-1-sashal@kernel.org> MIME-Version: 1.0 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Miklos Szeredi [ Upstream commit 56230d956739b9cb1cbde439d76227d77979a04d ] Check permission before opening a real file. ovl_path_open() is used by readdir and copy-up routines. ovl_permission() theoretically already checked copy up permissions, but it doesn't hurt to re-do these checks during the actual copy-up. For directory reading ovl_permission() only checks access to topmost underlying layer. Readdir on a merged directory accesses layers below the topmost one as well. Permission wasn't checked for these layers. Note: modifying ovl_permission() to perform this check would be far more complex and hence more bug prone. The result is less precise permissions returned in access(2). If this turns out to be an issue, we can revisit this bug. Signed-off-by: Miklos Szeredi Signed-off-by: Sasha Levin --- fs/overlayfs/util.c | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/fs/overlayfs/util.c b/fs/overlayfs/util.c index 36b60788ee47..a0878039332a 100644 --- a/fs/overlayfs/util.c +++ b/fs/overlayfs/util.c @@ -459,7 +459,32 @@ bool ovl_is_whiteout(struct dentry *dentry) struct file *ovl_path_open(struct path *path, int flags) { - return dentry_open(path, flags | O_NOATIME, current_cred()); + struct inode *inode = d_inode(path->dentry); + int err, acc_mode; + + if (flags & ~(O_ACCMODE | O_LARGEFILE)) + BUG(); + + switch (flags & O_ACCMODE) { + case O_RDONLY: + acc_mode = MAY_READ; + break; + case O_WRONLY: + acc_mode = MAY_WRITE; + break; + default: + BUG(); + } + + err = inode_permission(inode, acc_mode | MAY_OPEN); + if (err) + return ERR_PTR(err); + + /* O_NOATIME is an optimization, don't fail if not permitted */ + if (inode_owner_or_capable(inode)) + flags |= O_NOATIME; + + return dentry_open(path, flags, current_cred()); } /* Caller should hold ovl_inode->lock */ -- 2.25.1