diff --git a/kernel/ksud.c b/kernel/ksud.c index f494e7fe..4b1ff2c2 100644 --- a/kernel/ksud.c +++ b/kernel/ksud.c @@ -103,14 +103,14 @@ void on_post_fs_data(void) } extern void ext4_unregister_sysfs(struct super_block *sb); -static void nuke_ext4_sysfs(void) +int nuke_ext4_sysfs(const char* mnt) { #ifdef CONFIG_EXT4_FS struct path path; - int err = kern_path("/data/adb/modules", 0, &path); + int err = kern_path(mnt, 0, &path); if (err) { pr_err("nuke path err: %d\n", err); - return; + return err; } struct super_block *sb = path.dentry->d_inode->i_sb; @@ -118,18 +118,19 @@ static void nuke_ext4_sysfs(void) if (strcmp(name, "ext4") != 0) { pr_info("nuke but module aren't mounted\n"); path_put(&path); - return; + return -EINVAL; } ext4_unregister_sysfs(sb); path_put(&path); + + return 0; #endif } void on_module_mounted(void){ pr_info("on_module_mounted!\n"); ksu_module_mounted = true; - nuke_ext4_sysfs(); } void on_boot_completed(void){ diff --git a/kernel/ksud.h b/kernel/ksud.h index 5eb7296a..14a43592 100644 --- a/kernel/ksud.h +++ b/kernel/ksud.h @@ -14,6 +14,8 @@ void on_boot_completed(void); bool ksu_is_safe_mode(void); +int nuke_ext4_sysfs(const char* mnt); + extern u32 ksu_file_sid; extern bool ksu_module_mounted; extern bool ksu_boot_completed; diff --git a/kernel/supercalls.c b/kernel/supercalls.c index 32b48d04..542b7cd9 100644 --- a/kernel/supercalls.c +++ b/kernel/supercalls.c @@ -1,5 +1,3 @@ -#include "supercalls.h" - #include #include #include @@ -14,6 +12,7 @@ #include #include +#include "supercalls.h" #include "arch.h" #include "allowlist.h" #include "feature.h" @@ -564,6 +563,36 @@ static int do_manage_mark(void __user *arg) return 0; } +static int do_nuke_ext4_sysfs(void __user *arg) +{ + struct ksu_nuke_ext4_sysfs_cmd cmd; + char mnt[256]; + long ret; + + if (copy_from_user(&cmd, arg, sizeof(cmd))) + return -EFAULT; + + if (!cmd.arg) + return -EINVAL; + + memset(mnt, 0, sizeof(mnt)); + + ret = strncpy_from_user(mnt, cmd.arg, sizeof(mnt)); + if (ret < 0) { + pr_err("nuke ext4 copy mnt failed: %ld\\n", ret); + return -EFAULT; // 或者 return ret; + } + + if (ret == sizeof(mnt)) { + pr_err("nuke ext4 mnt path too long\\n"); + return -ENAMETOOLONG; + } + + pr_info("do_nuke_ext4_sysfs: %s\n", mnt); + + return nuke_ext4_sysfs(mnt); +} + // 100. GET_FULL_VERSION - Get full version string static int do_get_full_version(void __user *arg) { @@ -784,6 +813,7 @@ static const struct ksu_ioctl_cmd_map ksu_ioctl_handlers[] = { { .cmd = KSU_IOCTL_SET_FEATURE, .name = "SET_FEATURE", .handler = do_set_feature, .perm_check = manager_or_root }, { .cmd = KSU_IOCTL_GET_WRAPPER_FD, .name = "GET_WRAPPER_FD", .handler = do_get_wrapper_fd, .perm_check = manager_or_root }, { .cmd = KSU_IOCTL_MANAGE_MARK, .name = "MANAGE_MARK", .handler = do_manage_mark, .perm_check = manager_or_root }, + { .cmd = KSU_IOCTL_NUKE_EXT4_SYSFS, .name = "NUKE_EXT4_SYSFS", .handler = do_nuke_ext4_sysfs, .perm_check = manager_or_root }, { .cmd = KSU_IOCTL_GET_FULL_VERSION,.name = "GET_FULL_VERSION", .handler = do_get_full_version, .perm_check = always_allow}, { .cmd = KSU_IOCTL_HOOK_TYPE,.name = "GET_HOOK_TYPE", .handler = do_get_hook_type, .perm_check = manager_or_root}, { .cmd = KSU_IOCTL_ENABLE_KPM, .name = "GET_ENABLE_KPM", .handler = do_enable_kpm, .perm_check = manager_or_root}, diff --git a/kernel/supercalls.h b/kernel/supercalls.h index 568d05b5..57a0b833 100644 --- a/kernel/supercalls.h +++ b/kernel/supercalls.h @@ -89,6 +89,10 @@ struct ksu_manage_mark_cmd { __u32 result; // Output: for get operation - mark status or reg_count }; +struct ksu_nuke_ext4_sysfs_cmd { + __aligned_u64 arg; // Input: mnt pointer +}; + #define KSU_MARK_GET 1 #define KSU_MARK_MARK 2 #define KSU_MARK_UNMARK 3 @@ -147,6 +151,7 @@ struct ksu_manual_su_cmd { #define KSU_IOCTL_SET_FEATURE _IOC(_IOC_WRITE, 'K', 14, 0) #define KSU_IOCTL_GET_WRAPPER_FD _IOC(_IOC_WRITE, 'K', 15, 0) #define KSU_IOCTL_MANAGE_MARK _IOC(_IOC_READ|_IOC_WRITE, 'K', 16, 0) +#define KSU_IOCTL_NUKE_EXT4_SYSFS _IOC(_IOC_READ|_IOC_WRITE, 'K', 17, 0) // Other IOCTL command definitions #define KSU_IOCTL_GET_FULL_VERSION _IOC(_IOC_READ, 'K', 100, 0) #define KSU_IOCTL_HOOK_TYPE _IOC(_IOC_READ, 'K', 101, 0)