From: Kees Cook <keescook@chromium.org>
To: Matthew Wilcox <willy@infradead.org>
Cc: linux-mm@kvack.org, Thomas Gleixner <tglx@linutronix.de>
Subject: Re: [PATCH 2/3] mm/usercopy: Detect vmalloc overruns
Date: Tue, 5 Oct 2021 20:02:08 -0700 [thread overview]
Message-ID: <202110051958.FC5C68F6@keescook> (raw)
In-Reply-To: <YVz7UX2spBXAG2L4@casper.infradead.org>
On Wed, Oct 06, 2021 at 02:26:41AM +0100, Matthew Wilcox wrote:
> On Tue, Oct 05, 2021 at 02:25:23PM -0700, Kees Cook wrote:
> > On Mon, Oct 04, 2021 at 11:42:22PM +0100, Matthew Wilcox (Oracle) wrote:
> > > If you have a vmalloc() allocation, or an address from calling vmap(),
> > > you cannot overrun the vm_area which describes it, regardless of the
> > > size of the underlying allocation. This probably doesn't do much for
> > > security because vmalloc comes with guard pages these days, but it
> > > prevents usercopy aborts when copying to a vmap() of smaller pages.
> > >
> > > Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
> > > ---
> > > mm/usercopy.c | 9 +++++++++
> > > 1 file changed, 9 insertions(+)
> > >
> > > diff --git a/mm/usercopy.c b/mm/usercopy.c
> > > index ac95b22fbbce..7bfc4f9ed1e4 100644
> > > --- a/mm/usercopy.c
> > > +++ b/mm/usercopy.c
> > > @@ -17,6 +17,7 @@
> > > #include <linux/sched/task.h>
> > > #include <linux/sched/task_stack.h>
> > > #include <linux/thread_info.h>
> > > +#include <linux/vmalloc.h>
> > > #include <linux/atomic.h>
> > > #include <linux/jump_label.h>
> > > #include <asm/sections.h>
> > > @@ -236,6 +237,14 @@ static inline void check_heap_object(const void *ptr, unsigned long n,
> > > return;
> > > }
> > >
> > > + if (is_vmalloc_addr(ptr)) {
> > > + struct vm_struct *vm = find_vm_area(ptr);
> > > +
> > > + if (ptr + n > vm->addr + vm->size)
> > > + usercopy_abort("vmalloc", NULL, to_user, 0, n);
> >
> > This "0" is easy to make "ptr - vm->addr". With that fixed:
> >
> > Acked-by: Kees Cook <keescook@chromium.org>
>
> Looking at this again, if we do ...
>
> char *p = vmalloc(2 * PAGE_SIZE);
> copy_from_user(p + 2 * PAGE_SIZE, ...);
>
> then 'vm' can be NULL. I think. While we can't catch everything, a
> NULL pointer dereference here seems a little unfriendly? So how about
> this:
Oh right, because ptr will be in a guard page (or otherwise unallocated)
but within the vmalloc range?
>
> if (is_vmalloc_addr(ptr)) {
> struct vm_struct *vm = find_vm_area(ptr);
> unsigned long offset;
>
> if (!vm) {
> usercopy_abort("vmalloc", NULL, to_user, 0, n);
> return;
> }
>
> offset = ptr - vm->addr;
> if (offset + n > vm->size)
> usercopy_abort("vmalloc", NULL, to_user, offset, n);
> return;
> }
>
> Do we want to distinguish the two cases somehow?
I'd report the first's "details" as "unmapped" or something:
usercopy_abort("vmalloc", "unmapped", to_user, 0, n);
and the latter is fine as-is.
--
Kees Cook
next prev parent reply other threads:[~2021-10-06 3:02 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-10-04 22:42 [PATCH 0/3] Assorted improvements to usercopy Matthew Wilcox (Oracle)
2021-10-04 22:42 ` [PATCH 1/3] mm/usercopy: Check kmap addresses properly Matthew Wilcox (Oracle)
2021-10-05 21:23 ` Kees Cook
2021-10-05 21:43 ` Matthew Wilcox
2021-10-05 21:54 ` Kees Cook
2021-10-04 22:42 ` [PATCH 2/3] mm/usercopy: Detect vmalloc overruns Matthew Wilcox (Oracle)
2021-10-05 21:25 ` Kees Cook
2021-10-06 1:26 ` Matthew Wilcox
2021-10-06 3:02 ` Kees Cook [this message]
2021-10-04 22:42 ` [PATCH 3/3] mm/usercopy: Detect compound page overruns Matthew Wilcox (Oracle)
2021-10-05 21:26 ` Kees Cook
2021-10-05 22:12 ` Matthew Wilcox
2021-10-05 22:55 ` Kees Cook
2021-10-05 21:27 ` [PATCH 0/3] Assorted improvements to usercopy Kees Cook
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=202110051958.FC5C68F6@keescook \
--to=keescook@chromium.org \
--cc=linux-mm@kvack.org \
--cc=tglx@linutronix.de \
--cc=willy@infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.