* Re: [PATCH v6 0/2] Control over userfaultfd kernel-fault handling [not found] <20201120030411.2690816-1-lokeshgidra@google.com> @ 2020-11-20 3:08 ` Lokesh Gidra [not found] ` <20201120030411.2690816-2-lokeshgidra@google.com> [not found] ` <20201120030411.2690816-3-lokeshgidra@google.com> 2 siblings, 0 replies; 5+ messages in thread From: Lokesh Gidra @ 2020-11-20 3:08 UTC (permalink / raw) To: Kees Cook, Jonathan Corbet, Peter Xu, Andrea Arcangeli, Sebastian Andrzej Siewior, Andrew Morton Cc: Alexander Viro, Stephen Smalley, Eric Biggers, Daniel Colascione, Joel Fernandes (Google), Linux FS Devel, linux-kernel, linux-doc, Kalesh Singh, Calin Juravle, Suren Baghdasaryan, Jeffrey Vander Stoep, Cc: Android Kernel, Mike Rapoport, Shaohua Li, Jerome Glisse, Mauro Carvalho Chehab, Johannes Weiner, Mel Gorman, Nitin Gupta, Vlastimil Babka, Iurii Zaikin, Luis Chamberlain, open list:MEMORY MANAGEMENT On Thu, Nov 19, 2020 at 7:04 PM Lokesh Gidra <lokeshgidra@google.com> wrote: > > This patch series is split from [1]. The other series enables SELinux > support for userfaultfd file descriptors so that its creation and > movement can be controlled. > > It has been demonstrated on various occasions that suspending kernel > code execution for an arbitrary amount of time at any access to > userspace memory (copy_from_user()/copy_to_user()/...) can be exploited > to change the intended behavior of the kernel. For instance, handling > page faults in kernel-mode using userfaultfd has been exploited in [2, 3]. > Likewise, FUSE, which is similar to userfaultfd in this respect, has been > exploited in [4, 5] for similar outcome. > > This small patch series adds a new flag to userfaultfd(2) that allows > callers to give up the ability to handle kernel-mode faults with the > resulting UFFD file object. It then adds a 'user-mode only' option to > the unprivileged_userfaultfd sysctl knob to require unprivileged > callers to use this new flag. > > The purpose of this new interface is to decrease the chance of an > unprivileged userfaultfd user taking advantage of userfaultfd to > enhance security vulnerabilities by lengthening the race window in > kernel code. > > [1] https://lore.kernel.org/lkml/20200211225547.235083-1-dancol@google.com/ > [2] https://duasynt.com/blog/linux-kernel-heap-spray > [3] https://duasynt.com/blog/cve-2016-6187-heap-off-by-one-exploit > [4] https://googleprojectzero.blogspot.com/2016/06/exploiting-recursion-in-linux-kernel_20.html > [5] https://bugs.chromium.org/p/project-zero/issues/detail?id=808 > > Changes since v5: > > - Added printk_once when unprivileged_userfaultfd is set to 0 and > userfaultfd syscall is called without UFFD_USER_MODE_ONLY in the > absence of CAP_SYS_PTRACE capability. > > Changes since v4: > > - Added warning when bailing out from handling kernel fault. > > Changes since v3: > > - Modified the meaning of value '0' of unprivileged_userfaultfd > sysctl knob. Setting this knob to '0' now allows unprivileged users > to use userfaultfd, but can handle page faults in user-mode only. > - The default value of unprivileged_userfaultfd sysctl knob is changed > to '0'. > > Changes since v2: > > - Removed 'uffd_flags' and directly used 'UFFD_USER_MODE_ONLY' in > userfaultfd(). > > Changes since v1: > > - Added external references to the threats from allowing unprivileged > users to handle page faults from kernel-mode. > - Removed the new sysctl knob restricting handling of page > faults from kernel-mode, and added an option for the same > in the existing 'unprivileged_userfaultfd' knob. > > Lokesh Gidra (2): > Add UFFD_USER_MODE_ONLY > Add user-mode only option to unprivileged_userfaultfd sysctl knob > > Documentation/admin-guide/sysctl/vm.rst | 15 ++++++++++----- > fs/userfaultfd.c | 20 +++++++++++++++++--- > include/uapi/linux/userfaultfd.h | 9 +++++++++ > 3 files changed, 36 insertions(+), 8 deletions(-) > > -- > 2.29.0.rc1.297.gfa9743e501-goog > Adding linux-mm@kvack.org mailing list. ^ permalink raw reply [flat|nested] 5+ messages in thread
[parent not found: <20201120030411.2690816-2-lokeshgidra@google.com>]
* Re: [PATCH v6 1/2] Add UFFD_USER_MODE_ONLY [not found] ` <20201120030411.2690816-2-lokeshgidra@google.com> @ 2020-11-20 3:09 ` Lokesh Gidra [not found] ` <20201120153337.431dc36c1975507bb1e44596@linux-foundation.org> 1 sibling, 0 replies; 5+ messages in thread From: Lokesh Gidra @ 2020-11-20 3:09 UTC (permalink / raw) To: Kees Cook, Jonathan Corbet, Peter Xu, Andrea Arcangeli, Sebastian Andrzej Siewior, Andrew Morton Cc: Alexander Viro, Stephen Smalley, Eric Biggers, Daniel Colascione, Joel Fernandes (Google), Linux FS Devel, linux-kernel, linux-doc, Kalesh Singh, Calin Juravle, Suren Baghdasaryan, Jeffrey Vander Stoep, Cc: Android Kernel, Mike Rapoport, Shaohua Li, Jerome Glisse, Mauro Carvalho Chehab, Johannes Weiner, Mel Gorman, Nitin Gupta, Vlastimil Babka, Iurii Zaikin, Luis Chamberlain, open list:MEMORY MANAGEMENT On Thu, Nov 19, 2020 at 7:04 PM Lokesh Gidra <lokeshgidra@google.com> wrote: > > userfaultfd handles page faults from both user and kernel code. > Add a new UFFD_USER_MODE_ONLY flag for userfaultfd(2) that makes > the resulting userfaultfd object refuse to handle faults from kernel > mode, treating these faults as if SIGBUS were always raised, causing > the kernel code to fail with EFAULT. > > A future patch adds a knob allowing administrators to give some > processes the ability to create userfaultfd file objects only if they > pass UFFD_USER_MODE_ONLY, reducing the likelihood that these processes > will exploit userfaultfd's ability to delay kernel page faults to open > timing windows for future exploits. > > Signed-off-by: Daniel Colascione <dancol@google.com> > Signed-off-by: Lokesh Gidra <lokeshgidra@google.com> > Reviewed-by: Andrea Arcangeli <aarcange@redhat.com> > --- > fs/userfaultfd.c | 10 +++++++++- > include/uapi/linux/userfaultfd.h | 9 +++++++++ > 2 files changed, 18 insertions(+), 1 deletion(-) > > diff --git a/fs/userfaultfd.c b/fs/userfaultfd.c > index 000b457ad087..605599fde015 100644 > --- a/fs/userfaultfd.c > +++ b/fs/userfaultfd.c > @@ -405,6 +405,13 @@ vm_fault_t handle_userfault(struct vm_fault *vmf, unsigned long reason) > > if (ctx->features & UFFD_FEATURE_SIGBUS) > goto out; > + if ((vmf->flags & FAULT_FLAG_USER) == 0 && > + ctx->flags & UFFD_USER_MODE_ONLY) { > + printk_once(KERN_WARNING "uffd: Set unprivileged_userfaultfd " > + "sysctl knob to 1 if kernel faults must be handled " > + "without obtaining CAP_SYS_PTRACE capability\n"); > + goto out; > + } > > /* > * If it's already released don't get it. This avoids to loop > @@ -1965,10 +1972,11 @@ SYSCALL_DEFINE1(userfaultfd, int, flags) > BUG_ON(!current->mm); > > /* Check the UFFD_* constants for consistency. */ > + BUILD_BUG_ON(UFFD_USER_MODE_ONLY & UFFD_SHARED_FCNTL_FLAGS); > BUILD_BUG_ON(UFFD_CLOEXEC != O_CLOEXEC); > BUILD_BUG_ON(UFFD_NONBLOCK != O_NONBLOCK); > > - if (flags & ~UFFD_SHARED_FCNTL_FLAGS) > + if (flags & ~(UFFD_SHARED_FCNTL_FLAGS | UFFD_USER_MODE_ONLY)) > return -EINVAL; > > ctx = kmem_cache_alloc(userfaultfd_ctx_cachep, GFP_KERNEL); > diff --git a/include/uapi/linux/userfaultfd.h b/include/uapi/linux/userfaultfd.h > index e7e98bde221f..5f2d88212f7c 100644 > --- a/include/uapi/linux/userfaultfd.h > +++ b/include/uapi/linux/userfaultfd.h > @@ -257,4 +257,13 @@ struct uffdio_writeprotect { > __u64 mode; > }; > > +/* > + * Flags for the userfaultfd(2) system call itself. > + */ > + > +/* > + * Create a userfaultfd that can handle page faults only in user mode. > + */ > +#define UFFD_USER_MODE_ONLY 1 > + > #endif /* _LINUX_USERFAULTFD_H */ > -- > 2.29.0.rc1.297.gfa9743e501-goog > Adding linux-mm@kvack.org mailing list ^ permalink raw reply [flat|nested] 5+ messages in thread
[parent not found: <20201120153337.431dc36c1975507bb1e44596@linux-foundation.org>]
* Re: [PATCH v6 1/2] Add UFFD_USER_MODE_ONLY [not found] ` <20201120153337.431dc36c1975507bb1e44596@linux-foundation.org> @ 2020-11-23 19:17 ` Lokesh Gidra 2020-11-23 20:11 ` Andrew Morton 0 siblings, 1 reply; 5+ messages in thread From: Lokesh Gidra @ 2020-11-23 19:17 UTC (permalink / raw) To: Andrew Morton Cc: Kees Cook, Jonathan Corbet, Peter Xu, Andrea Arcangeli, Sebastian Andrzej Siewior, Alexander Viro, Stephen Smalley, Eric Biggers, Daniel Colascione, Joel Fernandes (Google), Linux FS Devel, linux-kernel, linux-doc, Kalesh Singh, Calin Juravle, Suren Baghdasaryan, Jeffrey Vander Stoep, Cc: Android Kernel, Mike Rapoport, Shaohua Li, Jerome Glisse, Mauro Carvalho Chehab, Johannes Weiner, Mel Gorman, Nitin Gupta, Vlastimil Babka, Iurii Zaikin, Luis Chamberlain, linux-mm, Daniel Colascione, open list:MEMORY MANAGEMENT On Fri, Nov 20, 2020 at 3:33 PM Andrew Morton <akpm@linux-foundation.org> wrote: > > On Thu, 19 Nov 2020 19:04:10 -0800 Lokesh Gidra <lokeshgidra@google.com> wrote: > > > userfaultfd handles page faults from both user and kernel code. > > Add a new UFFD_USER_MODE_ONLY flag for userfaultfd(2) that makes > > the resulting userfaultfd object refuse to handle faults from kernel > > mode, treating these faults as if SIGBUS were always raised, causing > > the kernel code to fail with EFAULT. > > > > A future patch adds a knob allowing administrators to give some > > processes the ability to create userfaultfd file objects only if they > > pass UFFD_USER_MODE_ONLY, reducing the likelihood that these processes > > will exploit userfaultfd's ability to delay kernel page faults to open > > timing windows for future exploits. > > Can we assume that an update to the userfaultfd(2) manpage is in the > works? > Yes, I'm working on it. Can the kernel version which will have these patches be known now so that I can mention it in the manpage? > > --- a/fs/userfaultfd.c > > +++ b/fs/userfaultfd.c > > @@ -405,6 +405,13 @@ vm_fault_t handle_userfault(struct vm_fault *vmf, unsigned long reason) > > > > if (ctx->features & UFFD_FEATURE_SIGBUS) > > goto out; > > + if ((vmf->flags & FAULT_FLAG_USER) == 0 && > > + ctx->flags & UFFD_USER_MODE_ONLY) { > > + printk_once(KERN_WARNING "uffd: Set unprivileged_userfaultfd " > > + "sysctl knob to 1 if kernel faults must be handled " > > + "without obtaining CAP_SYS_PTRACE capability\n"); > > + goto out; > > + } > > > > /* > > * If it's already released don't get it. This avoids to loop > > @@ -1965,10 +1972,11 @@ SYSCALL_DEFINE1(userfaultfd, int, flags) > > BUG_ON(!current->mm); > > > > /* Check the UFFD_* constants for consistency. */ > > + BUILD_BUG_ON(UFFD_USER_MODE_ONLY & UFFD_SHARED_FCNTL_FLAGS); > > Are we sure this is true for all architectures? Yes, none of the architectures are using the least-significant bit for O_CLOEXEC or O_NONBLOCK. > > > BUILD_BUG_ON(UFFD_CLOEXEC != O_CLOEXEC); > > BUILD_BUG_ON(UFFD_NONBLOCK != O_NONBLOCK); > > > > - if (flags & ~UFFD_SHARED_FCNTL_FLAGS) > > + if (flags & ~(UFFD_SHARED_FCNTL_FLAGS | UFFD_USER_MODE_ONLY)) > > return -EINVAL; > > > > ctx = kmem_cache_alloc(userfaultfd_ctx_cachep, GFP_KERNEL); > > diff --git a/include/uapi/linux/userfaultfd.h b/include/uapi/linux/userfaultfd.h > > index e7e98bde221f..5f2d88212f7c 100644 > > --- a/include/uapi/linux/userfaultfd.h > > +++ b/include/uapi/linux/userfaultfd.h > > @@ -257,4 +257,13 @@ struct uffdio_writeprotect { > > __u64 mode; > > }; > > > > +/* > > + * Flags for the userfaultfd(2) system call itself. > > + */ > > + > > +/* > > + * Create a userfaultfd that can handle page faults only in user mode. > > + */ > > +#define UFFD_USER_MODE_ONLY 1 > > + > > #endif /* _LINUX_USERFAULTFD_H */ > > It would be nice to define this in include/linux/userfaultfd_k.h, > alongside the other flags. But I guess it has to be here because it's > part of the userspace API. ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH v6 1/2] Add UFFD_USER_MODE_ONLY 2020-11-23 19:17 ` Lokesh Gidra @ 2020-11-23 20:11 ` Andrew Morton 0 siblings, 0 replies; 5+ messages in thread From: Andrew Morton @ 2020-11-23 20:11 UTC (permalink / raw) To: Lokesh Gidra Cc: Kees Cook, Jonathan Corbet, Peter Xu, Andrea Arcangeli, Sebastian Andrzej Siewior, Alexander Viro, Stephen Smalley, Eric Biggers, Daniel Colascione, Joel Fernandes (Google), Linux FS Devel, linux-kernel, linux-doc, Kalesh Singh, Calin Juravle, Suren Baghdasaryan, Jeffrey Vander Stoep, Cc: Android Kernel, Mike Rapoport, Shaohua Li, Jerome Glisse, Mauro Carvalho Chehab, Johannes Weiner, Mel Gorman, Nitin Gupta, Vlastimil Babka, Iurii Zaikin, Luis Chamberlain, linux-mm, Daniel Colascione, open list:MEMORY MANAGEMENT On Mon, 23 Nov 2020 11:17:43 -0800 Lokesh Gidra <lokeshgidra@google.com> wrote: > > > A future patch adds a knob allowing administrators to give some > > > processes the ability to create userfaultfd file objects only if they > > > pass UFFD_USER_MODE_ONLY, reducing the likelihood that these processes > > > will exploit userfaultfd's ability to delay kernel page faults to open > > > timing windows for future exploits. > > > > Can we assume that an update to the userfaultfd(2) manpage is in the > > works? > > > Yes, I'm working on it. Can the kernel version which will have these > patches be known now so that I can mention it in the manpage? 5.11, if all proceeds smoothly. ^ permalink raw reply [flat|nested] 5+ messages in thread
[parent not found: <20201120030411.2690816-3-lokeshgidra@google.com>]
* Re: [PATCH v6 2/2] Add user-mode only option to unprivileged_userfaultfd sysctl knob [not found] ` <20201120030411.2690816-3-lokeshgidra@google.com> @ 2020-11-20 3:10 ` Lokesh Gidra 0 siblings, 0 replies; 5+ messages in thread From: Lokesh Gidra @ 2020-11-20 3:10 UTC (permalink / raw) To: Kees Cook, Jonathan Corbet, Peter Xu, Andrea Arcangeli, Sebastian Andrzej Siewior, Andrew Morton Cc: Alexander Viro, Stephen Smalley, Eric Biggers, Daniel Colascione, Joel Fernandes (Google), Linux FS Devel, linux-kernel, linux-doc, Kalesh Singh, Calin Juravle, Suren Baghdasaryan, Jeffrey Vander Stoep, Cc: Android Kernel, Mike Rapoport, Shaohua Li, Jerome Glisse, Mauro Carvalho Chehab, Johannes Weiner, Mel Gorman, Nitin Gupta, Vlastimil Babka, Iurii Zaikin, Luis Chamberlain, open list:MEMORY MANAGEMENT On Thu, Nov 19, 2020 at 7:04 PM Lokesh Gidra <lokeshgidra@google.com> wrote: > > With this change, when the knob is set to 0, it allows unprivileged > users to call userfaultfd, like when it is set to 1, but with the > restriction that page faults from only user-mode can be handled. > In this mode, an unprivileged user (without SYS_CAP_PTRACE capability) > must pass UFFD_USER_MODE_ONLY to userfaultd or the API will fail with > EPERM. > > This enables administrators to reduce the likelihood that an attacker > with access to userfaultfd can delay faulting kernel code to widen > timing windows for other exploits. > > The default value of this knob is changed to 0. This is required for > correct functioning of pipe mutex. However, this will fail postcopy > live migration, which will be unnoticeable to the VM guests. To avoid > this, set 'vm.userfault = 1' in /sys/sysctl.conf. > > The main reason this change is desirable as in the short term is that > the Android userland will behave as with the sysctl set to zero. So > without this commit, any Linux binary using userfaultfd to manage its > memory would behave differently if run within the Android userland. > For more details, refer to Andrea's reply [1]. > > [1] https://lore.kernel.org/lkml/20200904033438.GI9411@redhat.com/ > > Signed-off-by: Lokesh Gidra <lokeshgidra@google.com> > Reviewed-by: Andrea Arcangeli <aarcange@redhat.com> > --- > Documentation/admin-guide/sysctl/vm.rst | 15 ++++++++++----- > fs/userfaultfd.c | 10 ++++++++-- > 2 files changed, 18 insertions(+), 7 deletions(-) > > diff --git a/Documentation/admin-guide/sysctl/vm.rst b/Documentation/admin-guide/sysctl/vm.rst > index f455fa00c00f..d06a98b2a4e7 100644 > --- a/Documentation/admin-guide/sysctl/vm.rst > +++ b/Documentation/admin-guide/sysctl/vm.rst > @@ -873,12 +873,17 @@ file-backed pages is less than the high watermark in a zone. > unprivileged_userfaultfd > ======================== > > -This flag controls whether unprivileged users can use the userfaultfd > -system calls. Set this to 1 to allow unprivileged users to use the > -userfaultfd system calls, or set this to 0 to restrict userfaultfd to only > -privileged users (with SYS_CAP_PTRACE capability). > +This flag controls the mode in which unprivileged users can use the > +userfaultfd system calls. Set this to 0 to restrict unprivileged users > +to handle page faults in user mode only. In this case, users without > +SYS_CAP_PTRACE must pass UFFD_USER_MODE_ONLY in order for userfaultfd to > +succeed. Prohibiting use of userfaultfd for handling faults from kernel > +mode may make certain vulnerabilities more difficult to exploit. > > -The default value is 1. > +Set this to 1 to allow unprivileged users to use the userfaultfd system > +calls without any restrictions. > + > +The default value is 0. > > > user_reserve_kbytes > diff --git a/fs/userfaultfd.c b/fs/userfaultfd.c > index 605599fde015..894cc28142e7 100644 > --- a/fs/userfaultfd.c > +++ b/fs/userfaultfd.c > @@ -28,7 +28,7 @@ > #include <linux/security.h> > #include <linux/hugetlb.h> > > -int sysctl_unprivileged_userfaultfd __read_mostly = 1; > +int sysctl_unprivileged_userfaultfd __read_mostly; > > static struct kmem_cache *userfaultfd_ctx_cachep __read_mostly; > > @@ -1966,8 +1966,14 @@ SYSCALL_DEFINE1(userfaultfd, int, flags) > struct userfaultfd_ctx *ctx; > int fd; > > - if (!sysctl_unprivileged_userfaultfd && !capable(CAP_SYS_PTRACE)) > + if (!sysctl_unprivileged_userfaultfd && > + (flags & UFFD_USER_MODE_ONLY) == 0 && > + !capable(CAP_SYS_PTRACE)) { > + printk_once(KERN_WARNING "uffd: Set unprivileged_userfaultfd " > + "sysctl knob to 1 if kernel faults must be handled " > + "without obtaining CAP_SYS_PTRACE capability\n"); > return -EPERM; > + } > > BUG_ON(!current->mm); > > -- > 2.29.0.rc1.297.gfa9743e501-goog > Adding linux-mm@kvack.org list ^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2020-11-23 20:11 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
[not found] <20201120030411.2690816-1-lokeshgidra@google.com>
2020-11-20 3:08 ` [PATCH v6 0/2] Control over userfaultfd kernel-fault handling Lokesh Gidra
[not found] ` <20201120030411.2690816-2-lokeshgidra@google.com>
2020-11-20 3:09 ` [PATCH v6 1/2] Add UFFD_USER_MODE_ONLY Lokesh Gidra
[not found] ` <20201120153337.431dc36c1975507bb1e44596@linux-foundation.org>
2020-11-23 19:17 ` Lokesh Gidra
2020-11-23 20:11 ` Andrew Morton
[not found] ` <20201120030411.2690816-3-lokeshgidra@google.com>
2020-11-20 3:10 ` [PATCH v6 2/2] Add user-mode only option to unprivileged_userfaultfd sysctl knob Lokesh Gidra
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox