Commit aac416fc authored by Kees Cook's avatar Kees Cook Committed by Greg Kroah-Hartman

lkdtm: flush icache and report actions

Some CPUs explicitly need to have their icache flushed after making
executable code copies for the memory region execution tests.
Additionally, report the specific address targets being used so that
debugging non-crash failures is easier.
Signed-off-by: default avatarKees Cook <keescook@chromium.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent feac6e21
...@@ -329,7 +329,12 @@ static void execute_location(void *dst) ...@@ -329,7 +329,12 @@ static void execute_location(void *dst)
{ {
void (*func)(void) = dst; void (*func)(void) = dst;
pr_info("attempting ok execution at %p\n", do_nothing);
do_nothing();
memcpy(dst, do_nothing, EXEC_SIZE); memcpy(dst, do_nothing, EXEC_SIZE);
flush_icache_range((unsigned long)dst, (unsigned long)dst + EXEC_SIZE);
pr_info("attempting bad execution at %p\n", func);
func(); func();
} }
...@@ -338,8 +343,13 @@ static void execute_user_location(void *dst) ...@@ -338,8 +343,13 @@ static void execute_user_location(void *dst)
/* Intentionally crossing kernel/user memory boundary. */ /* Intentionally crossing kernel/user memory boundary. */
void (*func)(void) = dst; void (*func)(void) = dst;
pr_info("attempting ok execution at %p\n", do_nothing);
do_nothing();
if (copy_to_user((void __user *)dst, do_nothing, EXEC_SIZE)) if (copy_to_user((void __user *)dst, do_nothing, EXEC_SIZE))
return; return;
flush_icache_range((unsigned long)dst, (unsigned long)dst + EXEC_SIZE);
pr_info("attempting bad execution at %p\n", func);
func(); func();
} }
...@@ -464,8 +474,12 @@ static void lkdtm_do_action(enum ctype which) ...@@ -464,8 +474,12 @@ static void lkdtm_do_action(enum ctype which)
} }
ptr = (unsigned long *)user_addr; ptr = (unsigned long *)user_addr;
pr_info("attempting bad read at %p\n", ptr);
tmp = *ptr; tmp = *ptr;
tmp += 0xc0dec0de; tmp += 0xc0dec0de;
pr_info("attempting bad write at %p\n", ptr);
*ptr = tmp; *ptr = tmp;
vm_munmap(user_addr, PAGE_SIZE); vm_munmap(user_addr, PAGE_SIZE);
...@@ -476,6 +490,8 @@ static void lkdtm_do_action(enum ctype which) ...@@ -476,6 +490,8 @@ static void lkdtm_do_action(enum ctype which)
unsigned long *ptr; unsigned long *ptr;
ptr = (unsigned long *)&rodata; ptr = (unsigned long *)&rodata;
pr_info("attempting bad write at %p\n", ptr);
*ptr ^= 0xabcd1234; *ptr ^= 0xabcd1234;
break; break;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment