| From 2b780a2360c96937901bd14184924fda95a25b31 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Fri, 8 Jul 2022 11:34:51 +0200 |
| Subject: userfaultfd: open userfaultfds with O_RDONLY |
| |
| From: Ondrej Mosnacek <omosnace@redhat.com> |
| |
| [ Upstream commit abec3d015fdfb7c63105c7e1c956188bf381aa55 ] |
| |
| Since userfaultfd doesn't implement a write operation, it is more |
| appropriate to open it read-only. |
| |
| When userfaultfds are opened read-write like it is now, and such fd is |
| passed from one process to another, SELinux will check both read and |
| write permissions for the target process, even though it can't actually |
| do any write operation on the fd later. |
| |
| Inspired by the following bug report, which has hit the SELinux scenario |
| described above: |
| https://bugzilla.redhat.com/show_bug.cgi?id=1974559 |
| |
| Reported-by: Robert O'Callahan <roc@ocallahan.org> |
| Fixes: 86039bd3b4e6 ("userfaultfd: add new syscall to provide memory externalization") |
| Signed-off-by: Ondrej Mosnacek <omosnace@redhat.com> |
| Acked-by: Peter Xu <peterx@redhat.com> |
| Acked-by: Christian Brauner (Microsoft) <brauner@kernel.org> |
| Signed-off-by: Paul Moore <paul@paul-moore.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| fs/userfaultfd.c | 4 ++-- |
| 1 file changed, 2 insertions(+), 2 deletions(-) |
| |
| diff --git a/fs/userfaultfd.c b/fs/userfaultfd.c |
| index ec57bbb6bb05..740853465356 100644 |
| --- a/fs/userfaultfd.c |
| +++ b/fs/userfaultfd.c |
| @@ -1018,7 +1018,7 @@ static int resolve_userfault_fork(struct userfaultfd_ctx *ctx, |
| int fd; |
| |
| fd = anon_inode_getfd("[userfaultfd]", &userfaultfd_fops, new, |
| - O_RDWR | (new->flags & UFFD_SHARED_FCNTL_FLAGS)); |
| + O_RDONLY | (new->flags & UFFD_SHARED_FCNTL_FLAGS)); |
| if (fd < 0) |
| return fd; |
| |
| @@ -1969,7 +1969,7 @@ SYSCALL_DEFINE1(userfaultfd, int, flags) |
| mmgrab(ctx->mm); |
| |
| fd = anon_inode_getfd("[userfaultfd]", &userfaultfd_fops, ctx, |
| - O_RDWR | (flags & UFFD_SHARED_FCNTL_FLAGS)); |
| + O_RDONLY | (flags & UFFD_SHARED_FCNTL_FLAGS)); |
| if (fd < 0) { |
| mmdrop(ctx->mm); |
| kmem_cache_free(userfaultfd_ctx_cachep, ctx); |
| -- |
| 2.35.1 |
| |