From 3a12bdead134c64c3be508d10f90e75ee5bc2d5d Mon Sep 17 00:00:00 2001 From: AlexLiuDev233 Date: Thu, 27 Nov 2025 21:14:01 +0800 Subject: [PATCH] kernel: Add nuke_ext4_sysfs interface (#632) Co-authored-by: weishu --- kernel/ksud.c | 4 ++-- kernel/ksud.h | 2 ++ kernel/supercalls.c | 35 ++++++++++++++++++++++++++++++++--- kernel/supercalls.h | 6 +++++- 4 files changed, 41 insertions(+), 6 deletions(-) diff --git a/kernel/ksud.c b/kernel/ksud.c index 7b9f03de..921ce6c8 100644 --- a/kernel/ksud.c +++ b/kernel/ksud.c @@ -105,10 +105,10 @@ 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) { 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; diff --git a/kernel/ksud.h b/kernel/ksud.h index d78bc969..ecdd04fc 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 b5da1bd3..9bb11d57 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" @@ -587,6 +586,36 @@ static int add_try_umount(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) { @@ -763,7 +792,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_NUKE_EXT4_SYSFS, .name = "NUKE_EXT4_SYSFS", .handler = do_nuke_ext4_sysfs, .perm_check = manager_or_root }, { .cmd = KSU_IOCTL_ADD_TRY_UMOUNT, .name = "ADD_TRY_UMOUNT", .handler = add_try_umount, .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}, diff --git a/kernel/supercalls.h b/kernel/supercalls.h index df997bea..ed513dd1 100644 --- a/kernel/supercalls.h +++ b/kernel/supercalls.h @@ -78,6 +78,10 @@ struct ksu_set_feature_cmd { __u64 value; // Input: feature value/state to set }; +struct ksu_nuke_ext4_sysfs_cmd { + __aligned_u64 arg; // Input: mnt pointer +}; + // Other command structures struct ksu_get_full_version_cmd { char version_full[KSU_FULL_VERSION_STRING]; // Output: full version string @@ -148,7 +152,7 @@ struct ksu_add_try_umount_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_WRITE, 'K', 17, 0) +#define KSU_IOCTL_NUKE_EXT4_SYSFS _IOC(_IOC_WRITE, 'K', 17, 0) #define KSU_IOCTL_ADD_TRY_UMOUNT _IOC(_IOC_WRITE, 'K', 18, 0) // Other IOCTL command definitions #define KSU_IOCTL_GET_FULL_VERSION _IOC(_IOC_READ, 'K', 100, 0)