source code repo simplefs
By execute the kernel module and use "ls" to show the list, we will get the kernel panic
check the call trace, we see that __x64_sys_readlink system call fail and trace the code
SYSCALL_DEFINE3(readlink, const char __user *, path, char __user *, buf, int, bufsiz)
it call do_readlinkat -> vfs_readlink -> readlink_copy -> copy_to_user fail,
so we have 2 ways to fix it
Fix segmentation fault about exe symbolic link and then run ls commad.
When create a symbolic link and then execute 'ls' command,
this will make the segmentation fault in user space
By checking kernel log, we can see that
"usercopy: Kernel memory exposure attempt detected from SLUB object 'simplefs_cache' (offset 0, size 5)!",
and by tracing kernel call, we also find call "readlink_copy" fail
In readlink_copy, this will copy data to user space,
and the message shows kernel memoery exposure.
By kernel document
https://docs.kernel.org/core-api/memory-allocation.html?highlight=kmem_cache_create
"kmem_cache_create() or kmem_cache_create_usercopy() before it can be used.
The second function should be used if a part of the cache might be copied to the userspace"
and readlink will copy the target name from simplefs inode link(inode->i_link) to the user space,
so we replace kmem_cache_create to kmem_cache_create_usercopy
run make check
Testing cmd: ln file hdlink…Success
Testing cmd: mkdir dir/dir…Success
Testing cmd: ln -s file symlink…Success
Testing cmd: ls -lR…Success
Testing cmd: mkdir len_of_name_of_this_dir_is_29…Success
Testing cmd: touch len_of_name_of_the_file_is_29…Success
Testing cmd: ln -s dir len_of_name_of_the_link_is_29…Success
Testing cmd: echo abc > file…Success
Testing cmd: dd if=/dev/zero of=file bs=1M count=12 status=none…dd: error writing 'file': File too large
Check if exist: drwxr-xr-x 3 dir…Success
Check if exist: -rw-r–r– 2 file…Success
Check if exist: -rw-r–r– 2 hdlink…Success
Check if exist: drwxr-xr-x 2 dir…Success
Check if exist: lrwxrwxrwx 1 symlink…Success
Close #30