Skip to content

Commit f9d2994

Browse files
dwindsorkees
authored andcommitted
fork: Define usercopy region in thread_stack slab caches
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: David 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: Kees Cook <keescook@chromium.org> Acked-by: Rik van Riel <riel@redhat.com>
1 parent 07dcd7f commit f9d2994

File tree

1 file changed

+3
-2
lines changed

1 file changed

+3
-2
lines changed

kernel/fork.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -282,8 +282,9 @@ static void free_thread_stack(struct task_struct *tsk)
282282

283283
void thread_stack_cache_init(void)
284284
{
285-
thread_stack_cache = kmem_cache_create("thread_stack", THREAD_SIZE,
286-
THREAD_SIZE, 0, NULL);
285+
thread_stack_cache = kmem_cache_create_usercopy("thread_stack",
286+
THREAD_SIZE, THREAD_SIZE, 0, 0,
287+
THREAD_SIZE, NULL);
287288
BUG_ON(thread_stack_cache == NULL);
288289
}
289290
# endif

0 commit comments

Comments
 (0)