diff options
| author | Kees Cook <keescook@chromium.org> | 2016-06-07 14:05:33 -0400 |
|---|---|---|
| committer | Kees Cook <keescook@chromium.org> | 2016-07-26 17:41:47 -0400 |
| commit | f5509cc18daa7f82bcc553be70df2117c8eedc16 (patch) | |
| tree | 648605cc96e4ac412a9f5201468795574997d9bb /security | |
| parent | 0f60a8efe4005ab5e65ce000724b04d4ca04a199 (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/Kconfig | 28 |
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 | ||
| 121 | config 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 | |||
| 128 | config 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 | |||
| 136 | config 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 | |||
| 121 | source security/selinux/Kconfig | 149 | source security/selinux/Kconfig |
| 122 | source security/smack/Kconfig | 150 | source security/smack/Kconfig |
| 123 | source security/tomoyo/Kconfig | 151 | source security/tomoyo/Kconfig |
