• David Windsor's avatar
    fork: Define usercopy region in thread_stack slab caches · f9d29946
    David Windsor authored
    In support of usercopy hardening, this patch defines a region in the
    thread_stack slab caches in which userspace copy operations are allowed.
    Since the entire thread_stack needs to be available to userspace, the
    entire slab contents are whitelisted. Note that the slab-based thread
    stack is only present on systems with THREAD_SIZE < PAGE_SIZE and
    !CONFIG_VMAP_STACK.
    
    cache object allocation:
        kernel/fork.c:
            alloc_thread_stack_node(...):
                return kmem_cache_alloc_node(thread_stack_cache, ...)
    
            dup_task_struct(...):
                ...
                stack = alloc_thread_stack_node(...)
                ...
                tsk->stack = stack;
    
            copy_process(...):
                ...
                dup_task_struct(...)
    
            _do_fork(...):
                ...
                copy_process(...)
    
    This region is known as the slab cache's usercopy region. Slab caches
    can now check that each dynamically sized copy operation involving
    cache-managed memory falls entirely within the slab's usercopy region.
    
    This patch is modified from Brad Spengler/PaX Team's PAX_USERCOPY
    whitelisting code in the last public patch of grsecurity/PaX based on my
    understanding of the code. Changes or omissions from the original code are
    mine and don't reflect the original grsecurity/PaX code.
    Signed-off-by: default avatarDavid Windsor <dave@nullcore.net>
    [kees: adjust commit log, split patch, provide usage trace]
    Cc: Ingo Molnar <mingo@kernel.org>
    Cc: Andrew Morton <akpm@linux-foundation.org>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: Andy Lutomirski <luto@kernel.org>
    Signed-off-by: default avatarKees Cook <keescook@chromium.org>
    Acked-by: default avatarRik van Riel <riel@redhat.com>
    f9d29946
fork.c 59.1 KB