From patchwork Wed Nov 7 11:17:50 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Matthew Bobrowski X-Patchwork-Id: 10672197 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 2BD3C14D6 for ; Wed, 7 Nov 2018 11:17:59 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 1908F2ACB6 for ; Wed, 7 Nov 2018 11:17:59 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 0BB482ACCA; Wed, 7 Nov 2018 11:17:59 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-7.9 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 601172AC94 for ; Wed, 7 Nov 2018 11:17:58 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728431AbeKGUrw (ORCPT ); Wed, 7 Nov 2018 15:47:52 -0500 Received: from mail-pf1-f195.google.com ([209.85.210.195]:41858 "EHLO mail-pf1-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726395AbeKGUrw (ORCPT ); Wed, 7 Nov 2018 15:47:52 -0500 Received: by mail-pf1-f195.google.com with SMTP id e22-v6so7574669pfn.8 for ; Wed, 07 Nov 2018 03:17:56 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=mbobrowski-org.20150623.gappssmtp.com; s=20150623; h=date:from:to:cc:subject:message-id:references:mime-version :content-disposition:in-reply-to:user-agent; bh=DO0ACi8fPwOn7Wo+Vq4QS6YJo6pRN++70pecsPnHqDE=; b=UzsF6GqIKljFqJRaTjNurqX45WUznZuoo++fTeEPtS7Mei5ysQVPmJa9ANIq67mBMl hNf+igmW8qVz4VI7YHv5NPSW5pDfDVm5e3aK3ELVEs3ZvHQYz7yt/OSdXhqayE/COCgw cadzqWOF7Cgas9BDxFgeGe85d+tpVeYEeXL715JtcIfkwBLYtjVoi+t3OBktLRESYuBv o2Rlp8lTZoWqKBSWU/06vMMkrvLa8V4Vj/ApMv3rZlzyQEG+u1PStQTQK4tw8pHldV3v 1EIZoVJTWorvRQhG2N7+eolX2XWxes3q/ihRRhe1T2VozsfXPFY4z8wrnmjPrRn0EWLq nAbA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:in-reply-to:user-agent; bh=DO0ACi8fPwOn7Wo+Vq4QS6YJo6pRN++70pecsPnHqDE=; b=cc2LWJulCrpi8S/FgFUwcDdhe9HTjCWvKitbmhzP6mQHv8yGDpsMjXpDg94Mx5EatP KJKRbH7RjO47pG+07LZxIAkcIC/pBQdbYD8F9CRX/88Q56FhEyD/OtJkX/xOpCSKbgJo CMJzFavjlgJI9eRhwI2oWZpyKJiy7Cq2BrtX746tuAfo30/DYo+k5SlN8zFz3HDM7OSJ WyVZpB5Wt43EIr9lWrNBV2cFpFAKzGo32nDGpWtjci+qHyRDQNQXBDzo3l34K3p19DjB d/XbhkQtbeHlWFxBvJwRYnaUix+0vBtuivKNT6RPffnT8l3GNYwOZmfvwL1z0Wqkf3bP bRQw== X-Gm-Message-State: AGRZ1gLOw4sTlLvgAb4Fai7ZrIeoVfC8J7DSf8iDx9T5reBqVWUWHpXY cDO+uxd6u4pdtymH7TDQrqIE X-Google-Smtp-Source: AJdET5fDyagkyIa0F/K6pMZaMbgqC5+XXgwgZ1TYGTk3rafpVxDim70hlvh+pI4xlv05PHW+mMYpQA== X-Received: by 2002:a63:eb0e:: with SMTP id t14mr1175374pgh.445.1541589476049; Wed, 07 Nov 2018 03:17:56 -0800 (PST) Received: from workstation.internal.lab (n114-74-18-206.sbr2.nsw.optusnet.com.au. [114.74.18.206]) by smtp.gmail.com with ESMTPSA id m12-v6sm396119pff.173.2018.11.07.03.17.53 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Wed, 07 Nov 2018 03:17:55 -0800 (PST) Date: Wed, 7 Nov 2018 22:17:50 +1100 From: Matthew Bobrowski To: jack@suse.cz Cc: amir73il@gmail.com, linux-api@vger.kernel.org, sgrubb@redhat.com, linux-fsdevel@vger.kernel.org Subject: [PATCH v6 3/4] fanotify: introduce new event mask FAN_OPEN_EXEC_PERM Message-ID: References: MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.10.1 (2018-07-13) Sender: linux-fsdevel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-fsdevel@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP A new event mask FAN_OPEN_EXEC_PERM has been defined. This allows users to receive events and grant acccess to files that are intending to be opened for execution. Events of FAN_OPEN_EXEC_PERM type will be generated when a file has been opened by using either execve(), execveat() or uselib() system calls. This acts in the same manner as previous permission event types, meaning that an access response is required from the application to permit any further operations on the file. This feature is implemented within the fsnotify_perm() hook by setting the FAN_OPEN_EXEC_PERM event type if __FMODE_EXEC is set within file->f_flags. Signed-off-by: Matthew Bobrowski --- fs/notify/fanotify/fanotify.c | 3 ++- fs/notify/fsnotify.c | 2 +- include/linux/fanotify.h | 3 ++- include/linux/fsnotify.h | 12 +++++++----- include/linux/fsnotify_backend.h | 10 ++++++---- include/uapi/linux/fanotify.h | 1 + 6 files changed, 19 insertions(+), 12 deletions(-) diff --git a/fs/notify/fanotify/fanotify.c b/fs/notify/fanotify/fanotify.c index e30f3a1d9699..d9aa505591eb 100644 --- a/fs/notify/fanotify/fanotify.c +++ b/fs/notify/fanotify/fanotify.c @@ -210,8 +210,9 @@ static int fanotify_handle_event(struct fsnotify_group *group, BUILD_BUG_ON(FAN_ACCESS_PERM != FS_ACCESS_PERM); BUILD_BUG_ON(FAN_ONDIR != FS_ISDIR); BUILD_BUG_ON(FAN_OPEN_EXEC != FS_OPEN_EXEC); + BUILD_BUG_ON(FAN_OPEN_EXEC_PERM != FS_OPEN_EXEC_PERM); - BUILD_BUG_ON(HWEIGHT32(ALL_FANOTIFY_EVENT_BITS) != 11); + BUILD_BUG_ON(HWEIGHT32(ALL_FANOTIFY_EVENT_BITS) != 12); mask = fanotify_group_event_mask(iter_info, mask, data, data_type); if (!mask) diff --git a/fs/notify/fsnotify.c b/fs/notify/fsnotify.c index b3f58f36a0ab..ecf09b6243d9 100644 --- a/fs/notify/fsnotify.c +++ b/fs/notify/fsnotify.c @@ -401,7 +401,7 @@ static __init int fsnotify_init(void) { int ret; - BUILD_BUG_ON(HWEIGHT32(ALL_FSNOTIFY_BITS) != 24); + BUILD_BUG_ON(HWEIGHT32(ALL_FSNOTIFY_BITS) != 25); ret = init_srcu_struct(&fsnotify_mark_srcu); if (ret) diff --git a/include/linux/fanotify.h b/include/linux/fanotify.h index c521e4264f2b..9e2142795335 100644 --- a/include/linux/fanotify.h +++ b/include/linux/fanotify.h @@ -40,7 +40,8 @@ FAN_CLOSE | FAN_OPEN | FAN_OPEN_EXEC) /* Events that require a permission response from user */ -#define FANOTIFY_PERM_EVENTS (FAN_OPEN_PERM | FAN_ACCESS_PERM) +#define FANOTIFY_PERM_EVENTS (FAN_OPEN_PERM | FAN_ACCESS_PERM | \ + FAN_OPEN_EXEC_PERM) /* Extra flags that may be reported with event or control handling of events */ #define FANOTIFY_EVENT_FLAGS (FAN_EVENT_ON_CHILD | FAN_ONDIR) diff --git a/include/linux/fsnotify.h b/include/linux/fsnotify.h index 1fe5ac93b252..9c7b594bf540 100644 --- a/include/linux/fsnotify.h +++ b/include/linux/fsnotify.h @@ -26,7 +26,7 @@ static inline int fsnotify_parent(const struct path *path, struct dentry *dentry return __fsnotify_parent(path, dentry, mask); } -/* simple call site for access decisions */ +/* Simple call site for access decisions */ static inline int fsnotify_perm(struct file *file, int mask) { const struct path *path = &file->f_path; @@ -38,12 +38,14 @@ static inline int fsnotify_perm(struct file *file, int mask) return 0; if (!(mask & (MAY_READ | MAY_OPEN))) return 0; - if (mask & MAY_OPEN) + if (mask & MAY_OPEN) { fsnotify_mask = FS_OPEN_PERM; - else if (mask & MAY_READ) + + if (file->f_flags & __FMODE_EXEC) + fsnotify_mask |= FS_OPEN_EXEC_PERM; + } else if (mask & MAY_READ) { fsnotify_mask = FS_ACCESS_PERM; - else - BUG(); + } ret = fsnotify_parent(path, NULL, fsnotify_mask); if (ret) diff --git a/include/linux/fsnotify_backend.h b/include/linux/fsnotify_backend.h index 39d94e62a836..150c0acb2f43 100644 --- a/include/linux/fsnotify_backend.h +++ b/include/linux/fsnotify_backend.h @@ -44,8 +44,9 @@ #define FS_Q_OVERFLOW 0x00004000 /* Event queued overflowed */ #define FS_IN_IGNORED 0x00008000 /* last inotify event here */ -#define FS_OPEN_PERM 0x00010000 /* open event in an permission hook */ +#define FS_OPEN_PERM 0x00010000 /* open event in a permission hook */ #define FS_ACCESS_PERM 0x00020000 /* access event in a permissions hook */ +#define FS_OPEN_EXEC_PERM 0x00040000 /* open/exec event in a permission hook */ #define FS_EXCL_UNLINK 0x04000000 /* do not send events if object is unlinked */ #define FS_ISDIR 0x40000000 /* event occurred against dir */ @@ -64,11 +65,12 @@ FS_CLOSE_WRITE | FS_CLOSE_NOWRITE | FS_OPEN |\ FS_MOVED_FROM | FS_MOVED_TO | FS_CREATE |\ FS_DELETE | FS_OPEN_PERM | FS_ACCESS_PERM | \ - FS_OPEN_EXEC) + FS_OPEN_EXEC | FS_OPEN_EXEC_PERM) #define FS_MOVE (FS_MOVED_FROM | FS_MOVED_TO) -#define ALL_FSNOTIFY_PERM_EVENTS (FS_OPEN_PERM | FS_ACCESS_PERM) +#define ALL_FSNOTIFY_PERM_EVENTS (FS_OPEN_PERM | FS_ACCESS_PERM | \ + FS_OPEN_EXEC_PERM) /* Events that can be reported to backends */ #define ALL_FSNOTIFY_EVENTS (FS_ACCESS | FS_MODIFY | FS_ATTRIB | \ @@ -77,7 +79,7 @@ FS_DELETE | FS_DELETE_SELF | FS_MOVE_SELF | \ FS_UNMOUNT | FS_Q_OVERFLOW | FS_IN_IGNORED | \ FS_OPEN_PERM | FS_ACCESS_PERM | FS_DN_RENAME | \ - FS_OPEN_EXEC) + FS_OPEN_EXEC | FS_OPEN_EXEC_PERM) /* Extra flags that may be reported with event or control handling of events */ #define ALL_FSNOTIFY_FLAGS (FS_EXCL_UNLINK | FS_ISDIR | FS_IN_ONESHOT | \ diff --git a/include/uapi/linux/fanotify.h b/include/uapi/linux/fanotify.h index d9664fbc905b..909c98fcace2 100644 --- a/include/uapi/linux/fanotify.h +++ b/include/uapi/linux/fanotify.h @@ -16,6 +16,7 @@ #define FAN_OPEN_PERM 0x00010000 /* File open in perm check */ #define FAN_ACCESS_PERM 0x00020000 /* File accessed in perm check */ +#define FAN_OPEN_EXEC_PERM 0x00040000 /* File open/exec in perm check */ #define FAN_ONDIR 0x40000000 /* event occurred against dir */