OSDN Git Service

BACKPORT: mm: Hardened usercopy
authorKees Cook <keescook@chromium.org>
Tue, 7 Jun 2016 18:05:33 +0000 (11:05 -0700)
committerSami Tolvanen <samitolvanen@google.com>
Tue, 6 Sep 2016 15:53:36 +0000 (15:53 +0000)
commitd677b3104d3c8e927211f20083a6c2e97e003b87
tree71c92b3b1f79d7f6d2a46b5c19d35a547b29b24c
parentc30d7340ee0b167a45cd8d6d5c48add8f62db9a5
BACKPORT: mm: Hardened usercopy

This is the start of porting PAX_USERCOPY into the mainline kernel. This
is the first set of features, controlled by CONFIG_HARDENED_USERCOPY. The
work is based on code by PaX Team and Brad Spengler, and an earlier port
from Casey Schaufler. Additional non-slab page tests are from Rik van Riel.

This patch contains the logic for validating several conditions when
performing copy_to_user() and copy_from_user() on the kernel object
being copied to/from:
- address range doesn't wrap around
- address range isn't NULL or zero-allocated (with a non-zero copy size)
- if on the slab allocator:
  - object size must be less than or equal to copy size (when check is
    implemented in the allocator, which appear in subsequent patches)
- otherwise, object must not span page allocations (excepting Reserved
  and CMA ranges)
- if on the stack
  - object must not extend before/after the current process stack
  - object must be contained by a valid stack frame (when there is
    arch/build support for identifying stack frames)
- object must not overlap with kernel text

Signed-off-by: Kees Cook <keescook@chromium.org>
Tested-by: Valdis Kletnieks <valdis.kletnieks@vt.edu>
Tested-by: Michael Ellerman <mpe@ellerman.id.au>
Change-Id: Iff3b5f1ddb04acd99ccf9a9046c7797363962b2a
(cherry picked from commit f5509cc18daa7f82bcc553be70df2117c8eedc16)
Signed-off-by: Sami Tolvanen <samitolvanen@google.com>
include/linux/slab.h
include/linux/thread_info.h
mm/Makefile
mm/usercopy.c [new file with mode: 0644]
security/Kconfig