Commit 55588aeb authored by Christophe Leroy's avatar Christophe Leroy Committed by Greg Kroah-Hartman

lkdtm: Print real addresses

[ Upstream commit 4c411157 ]

Today, when doing a lkdtm test before the readiness of the
random generator, (ptrval) is printed instead of the address
at which it perform the fault:

[ 1597.337030] lkdtm: Performing direct entry EXEC_USERSPACE
[ 1597.337142] lkdtm: attempting ok execution at (ptrval)
[ 1597.337398] lkdtm: attempting bad execution at (ptrval)
[ 1597.337460] kernel tried to execute user page (77858000) -exploit attempt? (uid: 0)
[ 1597.344769] Unable to handle kernel paging request for instruction fetch
[ 1597.351392] Faulting instruction address: 0x77858000
[ 1597.356312] Oops: Kernel access of bad area, sig: 11 [#1]

If the lkdtm test is done later on, it prints an hashed address.

In both cases this is pointless. The purpose of the test is to
ensure the kernel generates an Oops at the expected address,
so real addresses needs to be printed. This patch fixes that.
Signed-off-by: default avatarChristophe Leroy <christophe.leroy@c-s.fr>
Signed-off-by: default avatarKees Cook <keescook@chromium.org>
Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
parent 8387c145
...@@ -47,7 +47,7 @@ static noinline void execute_location(void *dst, bool write) ...@@ -47,7 +47,7 @@ static noinline void execute_location(void *dst, bool write)
{ {
void (*func)(void) = dst; void (*func)(void) = dst;
pr_info("attempting ok execution at %p\n", do_nothing); pr_info("attempting ok execution at %px\n", do_nothing);
do_nothing(); do_nothing();
if (write == CODE_WRITE) { if (write == CODE_WRITE) {
...@@ -55,7 +55,7 @@ static noinline void execute_location(void *dst, bool write) ...@@ -55,7 +55,7 @@ static noinline void execute_location(void *dst, bool write)
flush_icache_range((unsigned long)dst, flush_icache_range((unsigned long)dst,
(unsigned long)dst + EXEC_SIZE); (unsigned long)dst + EXEC_SIZE);
} }
pr_info("attempting bad execution at %p\n", func); pr_info("attempting bad execution at %px\n", func);
func(); func();
} }
...@@ -66,14 +66,14 @@ static void execute_user_location(void *dst) ...@@ -66,14 +66,14 @@ 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); pr_info("attempting ok execution at %px\n", do_nothing);
do_nothing(); do_nothing();
copied = access_process_vm(current, (unsigned long)dst, do_nothing, copied = access_process_vm(current, (unsigned long)dst, do_nothing,
EXEC_SIZE, FOLL_WRITE); EXEC_SIZE, FOLL_WRITE);
if (copied < EXEC_SIZE) if (copied < EXEC_SIZE)
return; return;
pr_info("attempting bad execution at %p\n", func); pr_info("attempting bad execution at %px\n", func);
func(); func();
} }
...@@ -82,7 +82,7 @@ void lkdtm_WRITE_RO(void) ...@@ -82,7 +82,7 @@ void lkdtm_WRITE_RO(void)
/* Explicitly cast away "const" for the test. */ /* Explicitly cast away "const" for the test. */
unsigned long *ptr = (unsigned long *)&rodata; unsigned long *ptr = (unsigned long *)&rodata;
pr_info("attempting bad rodata write at %p\n", ptr); pr_info("attempting bad rodata write at %px\n", ptr);
*ptr ^= 0xabcd1234; *ptr ^= 0xabcd1234;
} }
...@@ -100,7 +100,7 @@ void lkdtm_WRITE_RO_AFTER_INIT(void) ...@@ -100,7 +100,7 @@ void lkdtm_WRITE_RO_AFTER_INIT(void)
return; return;
} }
pr_info("attempting bad ro_after_init write at %p\n", ptr); pr_info("attempting bad ro_after_init write at %px\n", ptr);
*ptr ^= 0xabcd1234; *ptr ^= 0xabcd1234;
} }
...@@ -112,7 +112,7 @@ void lkdtm_WRITE_KERN(void) ...@@ -112,7 +112,7 @@ void lkdtm_WRITE_KERN(void)
size = (unsigned long)do_overwritten - (unsigned long)do_nothing; size = (unsigned long)do_overwritten - (unsigned long)do_nothing;
ptr = (unsigned char *)do_overwritten; ptr = (unsigned char *)do_overwritten;
pr_info("attempting bad %zu byte write at %p\n", size, ptr); pr_info("attempting bad %zu byte write at %px\n", size, ptr);
memcpy(ptr, (unsigned char *)do_nothing, size); memcpy(ptr, (unsigned char *)do_nothing, size);
flush_icache_range((unsigned long)ptr, (unsigned long)(ptr + size)); flush_icache_range((unsigned long)ptr, (unsigned long)(ptr + size));
...@@ -185,11 +185,11 @@ void lkdtm_ACCESS_USERSPACE(void) ...@@ -185,11 +185,11 @@ void lkdtm_ACCESS_USERSPACE(void)
ptr = (unsigned long *)user_addr; ptr = (unsigned long *)user_addr;
pr_info("attempting bad read at %p\n", ptr); pr_info("attempting bad read at %px\n", ptr);
tmp = *ptr; tmp = *ptr;
tmp += 0xc0dec0de; tmp += 0xc0dec0de;
pr_info("attempting bad write at %p\n", ptr); pr_info("attempting bad write at %px\n", ptr);
*ptr = tmp; *ptr = tmp;
vm_munmap(user_addr, PAGE_SIZE); vm_munmap(user_addr, PAGE_SIZE);
......
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