Re: + usercopy-no-check-page-span-for-stack-objects.patch added to -mm tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Wed, Jan 2, 2019 at 12:41 PM <akpm@xxxxxxxxxxxxxxxxxxxx> wrote:
>
>
> The patch titled
>      Subject: mm/usercopy.c: no check page span for stack objects
> has been added to the -mm tree.  Its filename is
>      usercopy-no-check-page-span-for-stack-objects.patch
>
> This patch should soon appear at
>     http://ozlabs.org/~akpm/mmots/broken-out/usercopy-no-check-page-span-for-stack-objects.patch
> and later at
>     http://ozlabs.org/~akpm/mmotm/broken-out/usercopy-no-check-page-span-for-stack-objects.patch
>
> Before you just go and hit "reply", please:
>    a) Consider who else should be cc'ed
>    b) Prefer to cc a suitable mailing list as well
>    c) Ideally: find the original patch on the mailing list and do a
>       reply-to-all to that, adding suitable additional cc's
>
> *** Remember to use Documentation/process/submit-checklist.rst when testing your code ***
>
> The -mm tree is included into linux-next and is updated
> there every 3-4 working days
>
> ------------------------------------------------------
> From: Qian Cai <cai@xxxxxx>
> Subject: mm/usercopy.c: no check page span for stack objects
>
> It is easy to trigger this with CONFIG_HARDENED_USERCOPY_PAGESPAN=y,
>
> usercopy: Kernel memory overwrite attempt detected to spans multiple
> pages (offset 0, size 23)!
> kernel BUG at mm/usercopy.c:102!
>
> For example,
>
> print_worker_info
> char name[WQ_NAME_LEN] = { };
> char desc[WORKER_DESC_LEN] = { };
>   probe_kernel_read(name, wq->name, sizeof(name) - 1);
>   probe_kernel_read(desc, worker->desc, sizeof(desc) - 1);
>     __copy_from_user_inatomic
>       check_object_size
>         check_heap_object
>           check_page_span
>
> This is because on-stack variables could cross PAGE_SIZE boundary, and
> failed this check,
>
> if (likely(((unsigned long)ptr & (unsigned long)PAGE_MASK) ==
>            ((unsigned long)end & (unsigned long)PAGE_MASK)))
>
> ptr = FFFF889007D7EFF8
> end = FFFF889007D7F00E
>
> Hence, fix it by checking if it is a stack object first.
>
> Link: http://lkml.kernel.org/r/20181231030254.99441-1-cai@xxxxxx
> Signed-off-by: Qian Cai <cai@xxxxxx>
> Cc: Kees Cook <keescook@xxxxxxxxxxxx>
> Cc: <stable@xxxxxxxxxxxxxxx>
> Signed-off-by: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx>

Acked-by: Kees Cook <keescook@xxxxxxxxxxxx>

I was planning on doing this already, so yes please. :) I do want to
include a comment update as well. I'll send that as a fix.

-Kees

> ---
>
>  mm/usercopy.c |    6 +++---
>  1 file changed, 3 insertions(+), 3 deletions(-)
>
> --- a/mm/usercopy.c~usercopy-no-check-page-span-for-stack-objects
> +++ a/mm/usercopy.c
> @@ -262,9 +262,6 @@ void __check_object_size(const void *ptr
>         /* Check for invalid addresses. */
>         check_bogus_address((const unsigned long)ptr, n, to_user);
>
> -       /* Check for bad heap object. */
> -       check_heap_object(ptr, n, to_user);
> -
>         /* Check for bad stack object. */
>         switch (check_stack_object(ptr, n)) {
>         case NOT_STACK:
> @@ -282,6 +279,9 @@ void __check_object_size(const void *ptr
>                 usercopy_abort("process stack", NULL, to_user, 0, n);
>         }
>
> +       /* Check for bad heap object. */
> +       check_heap_object(ptr, n, to_user);
> +
>         /* Check for object in kernel to avoid text exposure. */
>         check_kernel_text_object((const unsigned long)ptr, n, to_user);
>  }
> _
>
> Patches currently in -mm which might be from cai@xxxxxx are
>
> mm-page_owner-fix-for-deferred-struct-page-init.patch
> usercopy-no-check-page-span-for-stack-objects.patch
>


-- 
Kees Cook



[Index of Archives]     [Linux Kernel]     [Kernel Development Newbies]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite Hiking]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux