kernel: Add nuke_ext4_sysfs interface

This commit is contained in:
weishu
2025-11-17 13:24:30 +00:00
committed by ShirkNeko
parent 99d58c8cfd
commit 1d1ce396d3
4 changed files with 45 additions and 7 deletions

View File

@@ -92,14 +92,14 @@ void on_post_fs_data(void)
} }
extern void ext4_unregister_sysfs(struct super_block *sb); 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 #ifdef CONFIG_EXT4_FS
struct path path; struct path path;
int err = kern_path("/data/adb/modules", 0, &path); int err = kern_path(mnt, 0, &path);
if (err) { if (err) {
pr_err("nuke path err: %d\n", err); pr_err("nuke path err: %d\n", err);
return; return err;
} }
struct super_block *sb = path.dentry->d_inode->i_sb; struct super_block *sb = path.dentry->d_inode->i_sb;
@@ -107,18 +107,19 @@ static void nuke_ext4_sysfs(void)
if (strcmp(name, "ext4") != 0) { if (strcmp(name, "ext4") != 0) {
pr_info("nuke but module aren't mounted\n"); pr_info("nuke but module aren't mounted\n");
path_put(&path); path_put(&path);
return; return -EINVAL;
} }
ext4_unregister_sysfs(sb); ext4_unregister_sysfs(sb);
path_put(&path); path_put(&path);
return 0;
#endif #endif
} }
void on_module_mounted(void){ void on_module_mounted(void){
pr_info("on_module_mounted!\n"); pr_info("on_module_mounted!\n");
ksu_module_mounted = true; ksu_module_mounted = true;
nuke_ext4_sysfs();
} }
void on_boot_completed(void){ void on_boot_completed(void){

View File

@@ -12,6 +12,8 @@ void on_boot_completed(void);
bool ksu_is_safe_mode(void); bool ksu_is_safe_mode(void);
int nuke_ext4_sysfs(const char* mnt);
extern u32 ksu_file_sid; extern u32 ksu_file_sid;
extern bool ksu_module_mounted; extern bool ksu_module_mounted;
extern bool ksu_boot_completed; extern bool ksu_boot_completed;

View File

@@ -1,5 +1,3 @@
#include "supercalls.h"
#include <linux/anon_inodes.h> #include <linux/anon_inodes.h>
#include <linux/capability.h> #include <linux/capability.h>
#include <linux/cred.h> #include <linux/cred.h>
@@ -14,6 +12,7 @@
#include <linux/uaccess.h> #include <linux/uaccess.h>
#include <linux/version.h> #include <linux/version.h>
#include "supercalls.h"
#include "arch.h" #include "arch.h"
#include "allowlist.h" #include "allowlist.h"
#include "feature.h" #include "feature.h"
@@ -481,6 +480,36 @@ static int do_manage_mark(void __user *arg)
return 0; 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 // 100. GET_FULL_VERSION - Get full version string
static int do_get_full_version(void __user *arg) static int do_get_full_version(void __user *arg)
{ {
@@ -728,6 +757,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_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_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_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_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_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}, { .cmd = KSU_IOCTL_ENABLE_KPM, .name = "GET_ENABLE_KPM", .handler = do_enable_kpm, .perm_check = manager_or_root},

View File

@@ -89,6 +89,10 @@ struct ksu_manage_mark_cmd {
__u32 result; // Output: for get operation - mark status or reg_count __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_GET 1
#define KSU_MARK_MARK 2 #define KSU_MARK_MARK 2
#define KSU_MARK_UNMARK 3 #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_SET_FEATURE _IOC(_IOC_WRITE, 'K', 14, 0)
#define KSU_IOCTL_GET_WRAPPER_FD _IOC(_IOC_WRITE, 'K', 15, 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_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 // Other IOCTL command definitions
#define KSU_IOCTL_GET_FULL_VERSION _IOC(_IOC_READ, 'K', 100, 0) #define KSU_IOCTL_GET_FULL_VERSION _IOC(_IOC_READ, 'K', 100, 0)
#define KSU_IOCTL_HOOK_TYPE _IOC(_IOC_READ, 'K', 101, 0) #define KSU_IOCTL_HOOK_TYPE _IOC(_IOC_READ, 'K', 101, 0)