aboutsummaryrefslogtreecommitdiffstats
path: root/security
diff options
context:
space:
mode:
authorKees Cook <keescook@chromium.org>2016-06-07 14:05:33 -0400
committerKees Cook <keescook@chromium.org>2016-07-26 17:41:47 -0400
commitf5509cc18daa7f82bcc553be70df2117c8eedc16 (patch)
tree648605cc96e4ac412a9f5201468795574997d9bb /security
parent0f60a8efe4005ab5e65ce000724b04d4ca04a199 (diff)
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>
Diffstat (limited to 'security')
-rw-r--r--security/Kconfig28
1 files changed, 28 insertions, 0 deletions
diff --git a/security/Kconfig b/security/Kconfig
index 176758cdfa57..df28f2b6f3e1 100644
--- a/security/Kconfig
+++ b/security/Kconfig
@@ -118,6 +118,34 @@ config LSM_MMAP_MIN_ADDR
118 this low address space will need the permission specific to the 118 this low address space will need the permission specific to the
119 systems running LSM. 119 systems running LSM.
120 120
121config HAVE_HARDENED_USERCOPY_ALLOCATOR
122 bool
123 help
124 The heap allocator implements __check_heap_object() for
125 validating memory ranges against heap object sizes in
126 support of CONFIG_HARDENED_USERCOPY.
127
128config HAVE_ARCH_HARDENED_USERCOPY
129 bool
130 help
131 The architecture supports CONFIG_HARDENED_USERCOPY by
132 calling check_object_size() just before performing the
133 userspace copies in the low level implementation of
134 copy_to_user() and copy_from_user().
135
136config HARDENED_USERCOPY
137 bool "Harden memory copies between kernel and userspace"
138 depends on HAVE_ARCH_HARDENED_USERCOPY
139 select BUG
140 help
141 This option checks for obviously wrong memory regions when
142 copying memory to/from the kernel (via copy_to_user() and
143 copy_from_user() functions) by rejecting memory ranges that
144 are larger than the specified heap object, span multiple
145 separately allocates pages, are not on the process stack,
146 or are part of the kernel text. This kills entire classes
147 of heap overflow exploits and similar kernel memory exposures.
148
121source security/selinux/Kconfig 149source security/selinux/Kconfig
122source security/smack/Kconfig 150source security/smack/Kconfig
123source security/tomoyo/Kconfig 151source security/tomoyo/Kconfig