Skip to content

Commit

Permalink
kasan: migrate copy_user_test to kunit
Browse files Browse the repository at this point in the history
Migrate the copy_user_test to the KUnit framework to verify out-of-bound
detection via KASAN reports in copy_from_user(), copy_to_user() and their
static functions.

This is the last migrated test in kasan_test_module.c, therefore delete
the file.

[[email protected]: export copy_to_kernel_nofault]
  Link: https://lkml.kernel.org/r/[email protected]
Link: https://lkml.kernel.org/r/[email protected]
Signed-off-by: Sabyrzhan Tasbolatov <[email protected]>
Signed-off-by: Arnd Bergmann <[email protected]>
Reviewed-by: Andrey Konovalov <[email protected]>
Acked-by: David Hildenbrand <[email protected]>
Cc: Alexander Potapenko <[email protected]>
Cc: Alex Shi <[email protected]>
Cc: Andrey Ryabinin <[email protected]>
Cc: Dmitry Vyukov <[email protected]>
Cc: Hu Haowen <[email protected]>
Cc: Jonathan Corbet <[email protected]>
Cc: Marco Elver <[email protected]>
Cc: Vincenzo Frascino <[email protected]>
Cc: Yanteng Si <[email protected]>

Signed-off-by: Andrew Morton <[email protected]>
  • Loading branch information
novitoll authored and akpm00 committed Nov 11, 2024
1 parent ae193dd commit ca79a00
Show file tree
Hide file tree
Showing 4 changed files with 48 additions and 83 deletions.
2 changes: 0 additions & 2 deletions mm/kasan/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,6 @@ endif

CFLAGS_kasan_test_c.o := $(CFLAGS_KASAN_TEST)
RUSTFLAGS_kasan_test_rust.o := $(RUSTFLAGS_KASAN)
CFLAGS_kasan_test_module.o := $(CFLAGS_KASAN_TEST)

obj-y := common.o report.o
obj-$(CONFIG_KASAN_GENERIC) += init.o generic.o report_generic.o shadow.o quarantine.o
Expand All @@ -59,4 +58,3 @@ ifdef CONFIG_RUST
endif

obj-$(CONFIG_KASAN_KUNIT_TEST) += kasan_test.o
obj-$(CONFIG_KASAN_MODULE_TEST) += kasan_test_module.o
47 changes: 47 additions & 0 deletions mm/kasan/kasan_test_c.c
Original file line number Diff line number Diff line change
Expand Up @@ -1963,6 +1963,52 @@ static void copy_to_kernel_nofault_oob(struct kunit *test)
kfree(ptr);
}

static void copy_user_test_oob(struct kunit *test)
{
char *kmem;
char __user *usermem;
unsigned long useraddr;
size_t size = 128 - KASAN_GRANULE_SIZE;
int __maybe_unused unused;

kmem = kunit_kmalloc(test, size, GFP_KERNEL);
KUNIT_ASSERT_NOT_ERR_OR_NULL(test, kmem);

useraddr = kunit_vm_mmap(test, NULL, 0, PAGE_SIZE,
PROT_READ | PROT_WRITE | PROT_EXEC,
MAP_ANONYMOUS | MAP_PRIVATE, 0);
KUNIT_ASSERT_NE_MSG(test, useraddr, 0,
"Could not create userspace mm");
KUNIT_ASSERT_LT_MSG(test, useraddr, (unsigned long)TASK_SIZE,
"Failed to allocate user memory");

OPTIMIZER_HIDE_VAR(size);
usermem = (char __user *)useraddr;

KUNIT_EXPECT_KASAN_FAIL(test,
unused = copy_from_user(kmem, usermem, size + 1));
KUNIT_EXPECT_KASAN_FAIL(test,
unused = copy_to_user(usermem, kmem, size + 1));
KUNIT_EXPECT_KASAN_FAIL(test,
unused = __copy_from_user(kmem, usermem, size + 1));
KUNIT_EXPECT_KASAN_FAIL(test,
unused = __copy_to_user(usermem, kmem, size + 1));
KUNIT_EXPECT_KASAN_FAIL(test,
unused = __copy_from_user_inatomic(kmem, usermem, size + 1));
KUNIT_EXPECT_KASAN_FAIL(test,
unused = __copy_to_user_inatomic(usermem, kmem, size + 1));

/*
* Prepare a long string in usermem to avoid the strncpy_from_user test
* bailing out on '\0' before it reaches out-of-bounds.
*/
memset(kmem, 'a', size);
KUNIT_EXPECT_EQ(test, copy_to_user(usermem, kmem, size), 0);

KUNIT_EXPECT_KASAN_FAIL(test,
unused = strncpy_from_user(kmem, usermem, size + 1));
}

static struct kunit_case kasan_kunit_test_cases[] = {
KUNIT_CASE(kmalloc_oob_right),
KUNIT_CASE(kmalloc_oob_left),
Expand Down Expand Up @@ -2037,6 +2083,7 @@ static struct kunit_case kasan_kunit_test_cases[] = {
KUNIT_CASE(match_all_mem_tag),
KUNIT_CASE(copy_to_kernel_nofault_oob),
KUNIT_CASE(rust_uaf),
KUNIT_CASE(copy_user_test_oob),
{}
};

Expand Down
81 changes: 0 additions & 81 deletions mm/kasan/kasan_test_module.c

This file was deleted.

1 change: 1 addition & 0 deletions mm/maccess.c
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,7 @@ long copy_to_kernel_nofault(void *dst, const void *src, size_t size)
pagefault_enable();
return -EFAULT;
}
EXPORT_SYMBOL_GPL(copy_to_kernel_nofault);

long strncpy_from_kernel_nofault(char *dst, const void *unsafe_addr, long count)
{
Expand Down

0 comments on commit ca79a00

Please sign in to comment.