1
0
Fork 0
alistair23-linux/drivers/misc/lkdtm
Kees Cook 06b32fdb03 lkdtm: Check for SMEP clearing protections
This adds an x86-specific test for pinned cr4 bits. A successful test
will validate pinning and check the ROP-style call-middle-of-function
defense, if needed. For example, in the case of native_write_cr4()
looking like this:

ffffffff8171bce0 <native_write_cr4>:
ffffffff8171bce0:       48 8b 35 79 46 f2 00    mov    0xf24679(%rip),%rsi
ffffffff8171bce7:       48 09 f7                or     %rsi,%rdi
ffffffff8171bcea:       0f 22 e7                mov    %rdi,%cr4
...
ffffffff8171bd5a:       c3                      retq

The UNSET_SMEP test will jump to ffffffff8171bcea (the mov to cr4)
instead of ffffffff8171bce0 (native_write_cr4() entry) to simulate a
direct-call bypass attempt.

Expected successful results:

  # echo UNSET_SMEP > /sys/kernel/debug/provoke-crash/DIRECT
  # dmesg
  [   79.594433] lkdtm: Performing direct entry UNSET_SMEP
  [   79.596459] lkdtm: trying to clear SMEP normally
  [   79.598406] lkdtm: ok: SMEP did not get cleared
  [   79.599981] lkdtm: trying to clear SMEP with call gadget
  [   79.601810] ------------[ cut here ]------------
  [   79.603421] Attempt to unpin cr4 bits: 100000; bypass attack?!
  ...
  [   79.650170] ---[ end trace 2452ca0f6126242e ]---
  [   79.650937] lkdtm: ok: SMEP removal was reverted

Signed-off-by: Kees Cook <keescook@chromium.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2019-06-23 07:05:56 +02:00
..
Makefile lkdtm: support llvm-objcopy 2019-05-24 20:42:50 +02:00
bugs.c lkdtm: Check for SMEP clearing protections 2019-06-23 07:05:56 +02:00
core.c lkdtm: Check for SMEP clearing protections 2019-06-23 07:05:56 +02:00
heap.c
lkdtm.h lkdtm: Check for SMEP clearing protections 2019-06-23 07:05:56 +02:00
perms.c lkdtm: Add tests for NULL pointer dereference 2019-01-09 12:00:31 -08:00
refcount.c lkdtm: Add missing SPDX-License-Identifier line 2018-03-06 19:18:55 -08:00
rodata.c
stackleak.c lkdtm: Add a test for STACKLEAK 2018-09-04 10:35:47 -07:00
usercopy.c lkdtm/usercopy: Moves the KERNEL_DS test to non-canonical 2019-04-07 10:38:31 -07:00