Received: by 2002:a05:6a10:a0d1:0:0:0:0 with SMTP id j17csp698477pxa; Tue, 11 Aug 2020 12:43:35 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwA/X49V14+4Er5HnMGXJ0VeLOl9uBNfq9ViDC40v4ZD+QaLajPP2Ca9DghfuteVx2lZ0vF X-Received: by 2002:a17:907:40bf:: with SMTP id nu23mr21314031ejb.243.1597175015718; Tue, 11 Aug 2020 12:43:35 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1597175015; cv=none; d=google.com; s=arc-20160816; b=nhxZXyBSu1UoDxZe0l97mYwif1kfZC7JGfFRv7VYPOYDoph0+UEsp5YSAZzhqW8C7I Z33HLBOoAOCkwRE0HqkWuDfwWQsJQXc/9xcR7ApjWsvdwpZB+/pLemNcsFVwqp7Mh0FL 1yEYQJHhsEnRLX3FpkfvGS1a3iTWUkH0UeseTGsO+NngfTcu/RjIEXZP99w08BHAeU2Z ctqNhueE4pvYoVdZevvk0/PN9g7qwfapTQmvdpJJcziy+61NOQLd3aA+Pcmb6NxXYMX1 tqOxrfZtc1sBPCjSp5GuToTZaD0Shy+IRJDhPlYeTfZuuC7o3xKQe/q9LIPkjwwZVhFX NwIA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:subject:content-transfer-encoding :mime-version:user-agent:message-id:in-reply-to:date:references:cc :to:from; bh=zVY+e4YsFDw+08VfKpiFjHy0+IGlg1uuDNGgnEy0SSc=; b=z3833tcOkllq7tiW0oalTHMichHdYPaEQicW4xc0MWvdItonmJkKG6/PCmeOUKNwgB LwdOo7O7gX1XG8/KUhzplkmvVQZ39neqLgHZFKfOS9JTjkKiQVXNChTFG5cFjRU+wfr1 k9pdibmzuQRy9ZyPkdoI8CdeSE7pcCH72UEWUScIz+79+wiwXO5eMfecHeUkcPk5+BmQ pbu8uwuyuGIpHml8mmeeMVutucoKLXv3u+yjhvBPabgmzfQYMxd1j4NP7HbpU0g7seDV ti6bloWl3I45XtUBxEj9emCecdq9djyIvjDKF1VkAnqij0u1dkXKPwNHAJkcq1SYd/km rjQQ== ARC-Authentication-Results: i=1; mx.google.com; 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=fail (p=NONE sp=NONE dis=NONE) header.from=xmission.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id f2si13822173ejr.18.2020.08.11.12.43.11; Tue, 11 Aug 2020 12:43:35 -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; 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=fail (p=NONE sp=NONE dis=NONE) header.from=xmission.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726577AbgHKTkT convert rfc822-to-8bit (ORCPT + 99 others); Tue, 11 Aug 2020 15:40:19 -0400 Received: from out01.mta.xmission.com ([166.70.13.231]:58502 "EHLO out01.mta.xmission.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726068AbgHKTkS (ORCPT ); Tue, 11 Aug 2020 15:40:18 -0400 Received: from in01.mta.xmission.com ([166.70.13.51]) by out01.mta.xmission.com with esmtps (TLS1.2) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.93) (envelope-from ) id 1k5a7y-009jin-2l; Tue, 11 Aug 2020 13:40:06 -0600 Received: from ip68-227-160-95.om.om.cox.net ([68.227.160.95] helo=x220.xmission.com) by in01.mta.xmission.com with esmtpsa (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.87) (envelope-from ) id 1k5a7w-0004Qr-Ti; Tue, 11 Aug 2020 13:40:05 -0600 From: ebiederm@xmission.com (Eric W. Biederman) To: =?utf-8?Q?Micka=C3=ABl_Sala=C3=BCn?= Cc: linux-kernel@vger.kernel.org, Aleksa Sarai , Alexei Starovoitov , Al Viro , Andrew Morton , Andy Lutomirski , Christian Brauner , Christian Heimes , Daniel Borkmann , Deven Bowers , Dmitry Vyukov , Eric Biggers , Eric Chiang , Florian Weimer , James Morris , Jan Kara , Jann Horn , Jonathan Corbet , Kees Cook , Lakshmi Ramasubramanian , Matthew Garrett , Matthew Wilcox , Michael Kerrisk , Mimi Zohar , Philippe =?utf-8?Q?Tr=C3=A9buchet?= , Scott Shell , Sean Christopherson , Shuah Khan , Steve Dower , Steve Grubb , Tetsuo Handa , Thibaut Sautereau , Vincent Strubel , kernel-hardening@lists.openwall.com, linux-api@vger.kernel.org, linux-integrity@vger.kernel.org, linux-security-module@vger.kernel.org, linux-fsdevel@vger.kernel.org References: <20200723171227.446711-1-mic@digikod.net> <20200723171227.446711-4-mic@digikod.net> Date: Tue, 11 Aug 2020 14:36:38 -0500 In-Reply-To: <20200723171227.446711-4-mic@digikod.net> (=?utf-8?Q?=22Micka?= =?utf-8?Q?=C3=ABl_Sala=C3=BCn=22's?= message of "Thu, 23 Jul 2020 19:12:23 +0200") Message-ID: <87a6z1m0u1.fsf@x220.int.ebiederm.org> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/26.1 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8BIT X-XM-SPF: eid=1k5a7w-0004Qr-Ti;;;mid=<87a6z1m0u1.fsf@x220.int.ebiederm.org>;;;hst=in01.mta.xmission.com;;;ip=68.227.160.95;;;frm=ebiederm@xmission.com;;;spf=neutral X-XM-AID: U2FsdGVkX18bRw6Qx631bJvZB6GAyvN2Z5/PhB9504A= X-SA-Exim-Connect-IP: 68.227.160.95 X-SA-Exim-Mail-From: ebiederm@xmission.com X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on sa06.xmission.com X-Spam-Level: * X-Spam-Status: No, score=1.0 required=8.0 tests=ALL_TRUSTED,BAYES_50, DCC_CHECK_NEGATIVE,LotsOfNums_01,T_TM2_M_HEADER_IN_MSG,T_TooManySym_01, T_TooManySym_02,T_TooManySym_03,XM_B_Unicode autolearn=disabled version=3.4.2 X-Spam-Report: * -1.0 ALL_TRUSTED Passed through trusted hosts only via SMTP * 0.8 BAYES_50 BODY: Bayes spam probability is 40 to 60% * [score: 0.4984] * 0.0 T_TM2_M_HEADER_IN_MSG BODY: No description available. * 0.0 XM_B_Unicode BODY: Testing for specific types of unicode * 1.2 LotsOfNums_01 BODY: Lots of long strings of numbers * -0.0 DCC_CHECK_NEGATIVE Not listed in DCC * [sa06 0; Body=1 Fuz1=1 Fuz2=1] * 0.0 T_TooManySym_01 4+ unique symbols in subject * 0.0 T_TooManySym_02 5+ unique symbols in subject * 0.0 T_TooManySym_03 6+ unique symbols in subject X-Spam-DCC: ; sa06 0; Body=1 Fuz1=1 Fuz2=1 X-Spam-Combo: =?ISO-8859-1?Q?*;Micka=c3=abl Sala=c3=bcn ?= X-Spam-Relay-Country: X-Spam-Timing: total 506 ms - load_scoreonly_sql: 0.04 (0.0%), signal_user_changed: 11 (2.2%), b_tie_ro: 10 (1.9%), parse: 1.44 (0.3%), extract_message_metadata: 17 (3.3%), get_uri_detail_list: 2.7 (0.5%), tests_pri_-1000: 10 (2.0%), tests_pri_-950: 1.22 (0.2%), tests_pri_-900: 1.10 (0.2%), tests_pri_-90: 84 (16.6%), check_bayes: 82 (16.3%), b_tokenize: 16 (3.1%), b_tok_get_all: 11 (2.1%), b_comp_prob: 2.9 (0.6%), b_tok_touch_all: 49 (9.7%), b_finish: 1.00 (0.2%), tests_pri_0: 336 (66.4%), check_dkim_signature: 0.62 (0.1%), check_dkim_adsp: 3.2 (0.6%), poll_dns_idle: 26 (5.1%), tests_pri_10: 2.2 (0.4%), tests_pri_500: 38 (7.6%), rewrite_mail: 0.00 (0.0%) Subject: Re: [PATCH v7 3/7] exec: Move path_noexec() check earlier X-Spam-Flag: No X-SA-Exim-Version: 4.2.1 (built Thu, 05 May 2016 13:38:54 -0600) X-SA-Exim-Scanned: Yes (on in01.mta.xmission.com) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Mickaël Salaün writes: > From: Kees Cook > > The path_noexec() check, like the regular file check, was happening too > late, letting LSMs see impossible execve()s. Check it earlier as well > in may_open() and collect the redundant fs/exec.c path_noexec() test > under the same robustness comment as the S_ISREG() check. > > My notes on the call path, and related arguments, checks, etc: A big question arises, that I think someone already asked. Why perform this test in may_open directly instead of moving it into inode_permission. That way the code can be shared with faccessat, and any other code path that wants it? That would look to provide a more maintainable kernel. Eric > do_open_execat() > struct open_flags open_exec_flags = { > .open_flag = O_LARGEFILE | O_RDONLY | __FMODE_EXEC, > .acc_mode = MAY_EXEC, > ... > do_filp_open(dfd, filename, open_flags) > path_openat(nameidata, open_flags, flags) > file = alloc_empty_file(open_flags, current_cred()); > do_open(nameidata, file, open_flags) > may_open(path, acc_mode, open_flag) > /* new location of MAY_EXEC vs path_noexec() test */ > inode_permission(inode, MAY_OPEN | acc_mode) > security_inode_permission(inode, acc_mode) > vfs_open(path, file) > do_dentry_open(file, path->dentry->d_inode, open) > security_file_open(f) > open() > /* old location of path_noexec() test */ > > Signed-off-by: Mickaël Salaün > Signed-off-by: Kees Cook > Link: https://lore.kernel.org/r/20200605160013.3954297-4-keescook@chromium.org > --- > fs/exec.c | 12 ++++-------- > fs/namei.c | 4 ++++ > 2 files changed, 8 insertions(+), 8 deletions(-) > > diff --git a/fs/exec.c b/fs/exec.c > index bdc6a6eb5dce..4eea20c27b01 100644 > --- a/fs/exec.c > +++ b/fs/exec.c > @@ -147,10 +147,8 @@ SYSCALL_DEFINE1(uselib, const char __user *, library) > * and check again at the very end too. > */ > error = -EACCES; > - if (WARN_ON_ONCE(!S_ISREG(file_inode(file)->i_mode))) > - goto exit; > - > - if (path_noexec(&file->f_path)) > + if (WARN_ON_ONCE(!S_ISREG(file_inode(file)->i_mode) || > + path_noexec(&file->f_path))) > goto exit; > > fsnotify_open(file); > @@ -897,10 +895,8 @@ static struct file *do_open_execat(int fd, struct filename *name, int flags) > * and check again at the very end too. > */ > err = -EACCES; > - if (WARN_ON_ONCE(!S_ISREG(file_inode(file)->i_mode))) > - goto exit; > - > - if (path_noexec(&file->f_path)) > + if (WARN_ON_ONCE(!S_ISREG(file_inode(file)->i_mode) || > + path_noexec(&file->f_path))) > goto exit; > > err = deny_write_access(file); > diff --git a/fs/namei.c b/fs/namei.c > index a559ad943970..ddc9b25540fe 100644 > --- a/fs/namei.c > +++ b/fs/namei.c > @@ -2863,6 +2863,10 @@ static int may_open(const struct path *path, int acc_mode, int flag) > return -EACCES; > flag &= ~O_TRUNC; > break; > + case S_IFREG: > + if ((acc_mode & MAY_EXEC) && path_noexec(path)) > + return -EACCES; > + break; > } > > error = inode_permission(inode, MAY_OPEN | acc_mode);