diff --git a/kernel/Kconfig b/kernel/Kconfig index 804405b4..f95efb0f 100644 --- a/kernel/Kconfig +++ b/kernel/Kconfig @@ -111,16 +111,6 @@ config KSU_SUSFS_SUS_KSTAT - Allow spoofing the kstat of user-defined file/directory. - Effective only on zygote spawned user app process. -config KSU_SUSFS_SUS_OVERLAYFS - bool "Enable to automatically spoof kstat and kstatfs for overlayed files/directories" - depends on KSU_SUSFS - default n - help - - Automatically spoof the kstat and kstatfs for overlayed files/directories. - - Enable it if you are using legacy KernelSU and dont have auto hide features enabled. - - No susfs command is needed in userspace. - - Effective on all processes. - config KSU_SUSFS_TRY_UMOUNT bool "Enable to use ksu's ksu_try_umount" depends on KSU_SUSFS diff --git a/kernel/core_hook.c b/kernel/core_hook.c index d55e11ca..e10fc149 100644 --- a/kernel/core_hook.c +++ b/kernel/core_hook.c @@ -58,11 +58,11 @@ #ifdef CONFIG_KSU_SUSFS bool susfs_is_allow_su(void) { -if (ksu_is_manager()) { - // we are manager, allow! - return true; - } - return ksu_is_allow_uid(current_uid().val); + if (ksu_is_manager()) { + // we are manager, allow! + return true; + } + return ksu_is_allow_uid(current_uid().val); } extern u32 susfs_zygote_sid; @@ -75,6 +75,7 @@ extern void susfs_run_try_umount_for_current_mnt_ns(void); #endif // #ifdef CONFIG_KSU_SUSFS_TRY_UMOUNT #ifdef CONFIG_KSU_SUSFS_SUS_MOUNT static bool susfs_is_umount_for_zygote_system_process_enabled = false; +extern bool susfs_hide_sus_mnts_for_all_procs; #endif // #ifdef CONFIG_KSU_SUSFS_SUS_MOUNT #ifdef CONFIG_KSU_SUSFS_AUTO_ADD_SUS_BIND_MOUNT extern bool susfs_is_auto_add_sus_bind_mount_enabled; @@ -85,40 +86,6 @@ extern bool susfs_is_auto_add_sus_ksu_default_mount_enabled; #ifdef CONFIG_KSU_SUSFS_AUTO_ADD_TRY_UMOUNT_FOR_BIND_MOUNT extern bool susfs_is_auto_add_try_umount_for_bind_mount_enabled; #endif // #ifdef CONFIG_KSU_SUSFS_AUTO_ADD_TRY_UMOUNT_FOR_BIND_MOUNT - -static inline void susfs_on_post_fs_data(void) { - struct path path; -#ifdef CONFIG_KSU_SUSFS_SUS_MOUNT -if (!kern_path(DATA_ADB_UMOUNT_FOR_ZYGOTE_SYSTEM_PROCESS, 0, &path)) { - susfs_is_umount_for_zygote_system_process_enabled = true; - path_put(&path); -} -pr_info("susfs_is_umount_for_zygote_system_process_enabled: %d\n", susfs_is_umount_for_zygote_system_process_enabled); -#endif // #ifdef CONFIG_KSU_SUSFS_SUS_MOUNT -#ifdef CONFIG_KSU_SUSFS_AUTO_ADD_SUS_BIND_MOUNT - if (!kern_path(DATA_ADB_NO_AUTO_ADD_SUS_BIND_MOUNT, 0, &path)) { - susfs_is_auto_add_sus_bind_mount_enabled = false; - path_put(&path); -} -pr_info("susfs_is_auto_add_sus_bind_mount_enabled: %d\n", susfs_is_auto_add_sus_bind_mount_enabled); -#endif // #ifdef CONFIG_KSU_SUSFS_AUTO_ADD_SUS_BIND_MOUNT -#ifdef CONFIG_KSU_SUSFS_AUTO_ADD_SUS_KSU_DEFAULT_MOUNT - if (!kern_path(DATA_ADB_NO_AUTO_ADD_SUS_KSU_DEFAULT_MOUNT, 0, &path)) { - susfs_is_auto_add_sus_ksu_default_mount_enabled = false; - path_put(&path); -} -pr_info("susfs_is_auto_add_sus_ksu_default_mount_enabled: %d\n", susfs_is_auto_add_sus_ksu_default_mount_enabled); -#endif // #ifdef CONFIG_KSU_SUSFS_AUTO_ADD_SUS_KSU_DEFAULT_MOUNT -#ifdef CONFIG_KSU_SUSFS_AUTO_ADD_TRY_UMOUNT_FOR_BIND_MOUNT - if (!kern_path(DATA_ADB_NO_AUTO_ADD_TRY_UMOUNT_FOR_BIND_MOUNT, 0, &path)) { - susfs_is_auto_add_try_umount_for_bind_mount_enabled = false; - path_put(&path); -} -pr_info("susfs_is_auto_add_try_umount_for_bind_mount_enabled: %d\n", susfs_is_auto_add_try_umount_for_bind_mount_enabled); -#endif // #ifdef CONFIG_KSU_SUSFS_AUTO_ADD_TRY_UMOUNT_FOR_BIND_MOUNT -} -#endif // #ifdef CONFIG_KSU_SUSFS - #ifdef CONFIG_KSU_SUSFS_SUS_SU extern bool susfs_is_sus_su_ready; extern int susfs_sus_su_working_mode; @@ -126,6 +93,39 @@ extern bool susfs_is_sus_su_hooks_enabled __read_mostly; extern bool ksu_devpts_hook; #endif // #ifdef CONFIG_KSU_SUSFS_SUS_SU +static inline void susfs_on_post_fs_data(void) { + struct path path; +#ifdef CONFIG_KSU_SUSFS_SUS_MOUNT + if (!kern_path(DATA_ADB_UMOUNT_FOR_ZYGOTE_SYSTEM_PROCESS, 0, &path)) { + susfs_is_umount_for_zygote_system_process_enabled = true; + path_put(&path); + } + pr_info("susfs_is_umount_for_zygote_system_process_enabled: %d\n", susfs_is_umount_for_zygote_system_process_enabled); +#endif // #ifdef CONFIG_KSU_SUSFS_SUS_MOUNT +#ifdef CONFIG_KSU_SUSFS_AUTO_ADD_SUS_BIND_MOUNT + if (!kern_path(DATA_ADB_NO_AUTO_ADD_SUS_BIND_MOUNT, 0, &path)) { + susfs_is_auto_add_sus_bind_mount_enabled = false; + path_put(&path); + } + pr_info("susfs_is_auto_add_sus_bind_mount_enabled: %d\n", susfs_is_auto_add_sus_bind_mount_enabled); +#endif // #ifdef CONFIG_KSU_SUSFS_AUTO_ADD_SUS_BIND_MOUNT +#ifdef CONFIG_KSU_SUSFS_AUTO_ADD_SUS_KSU_DEFAULT_MOUNT + if (!kern_path(DATA_ADB_NO_AUTO_ADD_SUS_KSU_DEFAULT_MOUNT, 0, &path)) { + susfs_is_auto_add_sus_ksu_default_mount_enabled = false; + path_put(&path); + } + pr_info("susfs_is_auto_add_sus_ksu_default_mount_enabled: %d\n", susfs_is_auto_add_sus_ksu_default_mount_enabled); +#endif // #ifdef CONFIG_KSU_SUSFS_AUTO_ADD_SUS_KSU_DEFAULT_MOUNT +#ifdef CONFIG_KSU_SUSFS_AUTO_ADD_TRY_UMOUNT_FOR_BIND_MOUNT + if (!kern_path(DATA_ADB_NO_AUTO_ADD_TRY_UMOUNT_FOR_BIND_MOUNT, 0, &path)) { + susfs_is_auto_add_try_umount_for_bind_mount_enabled = false; + path_put(&path); + } + pr_info("susfs_is_auto_add_try_umount_for_bind_mount_enabled: %d\n", susfs_is_auto_add_try_umount_for_bind_mount_enabled); +#endif // #ifdef CONFIG_KSU_SUSFS_AUTO_ADD_TRY_UMOUNT_FOR_BIND_MOUNT +} +#endif // #ifdef CONFIG_KSU_SUSFS + static bool ksu_module_mounted = false; extern int ksu_handle_sepolicy(unsigned long arg3, void __user *arg4); @@ -548,6 +548,38 @@ int ksu_handle_prctl(int option, unsigned long arg2, unsigned long arg3, pr_info("susfs: copy_to_user() failed\n"); return 0; } + if (arg2 == CMD_SUSFS_SET_ANDROID_DATA_ROOT_PATH) { + int error = 0; + if (!ksu_access_ok((void __user*)arg3, SUSFS_MAX_LEN_PATHNAME)) { + pr_err("susfs: CMD_SUSFS_SET_ANDROID_DATA_ROOT_PATH -> arg3 is not accessible\n"); + return 0; + } + if (!ksu_access_ok((void __user*)arg5, sizeof(error))) { + pr_err("susfs: CMD_SUSFS_SET_ANDROID_DATA_ROOT_PATH -> arg5 is not accessible\n"); + return 0; + } + error = susfs_set_i_state_on_external_dir((char __user*)arg3, CMD_SUSFS_SET_ANDROID_DATA_ROOT_PATH); + pr_info("susfs: CMD_SUSFS_SET_ANDROID_DATA_ROOT_PATH -> ret: %d\n", error); + if (copy_to_user((void __user*)arg5, &error, sizeof(error))) + pr_info("susfs: copy_to_user() failed\n"); + return 0; + } + if (arg2 == CMD_SUSFS_SET_SDCARD_ROOT_PATH) { + int error = 0; + if (!ksu_access_ok((void __user*)arg3, SUSFS_MAX_LEN_PATHNAME)) { + pr_err("susfs: CMD_SUSFS_SET_SDCARD_ROOT_PATH -> arg3 is not accessible\n"); + return 0; + } + if (!ksu_access_ok((void __user*)arg5, sizeof(error))) { + pr_err("susfs: CMD_SUSFS_SET_SDCARD_ROOT_PATH -> arg5 is not accessible\n"); + return 0; + } + error = susfs_set_i_state_on_external_dir((char __user*)arg3, CMD_SUSFS_SET_SDCARD_ROOT_PATH); + pr_info("susfs: CMD_SUSFS_SET_SDCARD_ROOT_PATH -> ret: %d\n", error); + if (copy_to_user((void __user*)arg5, &error, sizeof(error))) + pr_info("susfs: copy_to_user() failed\n"); + return 0; + } #endif //#ifdef CONFIG_KSU_SUSFS_SUS_PATH #ifdef CONFIG_KSU_SUSFS_SUS_MOUNT if (arg2 == CMD_SUSFS_ADD_SUS_MOUNT) { @@ -566,6 +598,18 @@ int ksu_handle_prctl(int option, unsigned long arg2, unsigned long arg3, pr_info("susfs: copy_to_user() failed\n"); return 0; } + if (arg2 == CMD_SUSFS_HIDE_SUS_MNTS_FOR_ALL_PROCS) { + int error = 0; + if (arg3 != 0 && arg3 != 1) { + pr_err("susfs: CMD_SUSFS_HIDE_SUS_MNTS_FOR_ALL_PROCS -> arg3 can only be 0 or 1\n"); + return 0; + } + susfs_hide_sus_mnts_for_all_procs = arg3; + pr_info("susfs: CMD_SUSFS_HIDE_SUS_MNTS_FOR_ALL_PROCS -> susfs_hide_sus_mnts_for_all_procs: %lu\n", arg3); + if (copy_to_user((void __user*)arg5, &error, sizeof(error))) + pr_info("susfs: copy_to_user() failed\n"); + return 0; + } #endif //#ifdef CONFIG_KSU_SUSFS_SUS_MOUNT #ifdef CONFIG_KSU_SUSFS_SUS_KSTAT if (arg2 == CMD_SUSFS_ADD_SUS_KSTAT) { @@ -769,35 +813,32 @@ int ksu_handle_prctl(int option, unsigned long arg2, unsigned long arg3, #ifdef CONFIG_KSU_SUSFS_SUS_KSTAT enabled_features |= (1 << 4); #endif -#ifdef CONFIG_KSU_SUSFS_SUS_OVERLAYFS +#ifdef CONFIG_KSU_SUSFS_TRY_UMOUNT enabled_features |= (1 << 5); #endif -#ifdef CONFIG_KSU_SUSFS_TRY_UMOUNT +#ifdef CONFIG_KSU_SUSFS_AUTO_ADD_TRY_UMOUNT_FOR_BIND_MOUNT enabled_features |= (1 << 6); #endif -#ifdef CONFIG_KSU_SUSFS_AUTO_ADD_TRY_UMOUNT_FOR_BIND_MOUNT +#ifdef CONFIG_KSU_SUSFS_SPOOF_UNAME enabled_features |= (1 << 7); #endif -#ifdef CONFIG_KSU_SUSFS_SPOOF_UNAME +#ifdef CONFIG_KSU_SUSFS_ENABLE_LOG enabled_features |= (1 << 8); #endif -#ifdef CONFIG_KSU_SUSFS_ENABLE_LOG +#ifdef CONFIG_KSU_SUSFS_HIDE_KSU_SUSFS_SYMBOLS enabled_features |= (1 << 9); #endif -#ifdef CONFIG_KSU_SUSFS_HIDE_KSU_SUSFS_SYMBOLS +#ifdef CONFIG_KSU_SUSFS_SPOOF_CMDLINE_OR_BOOTCONFIG enabled_features |= (1 << 10); #endif -#ifdef CONFIG_KSU_SUSFS_SPOOF_CMDLINE_OR_BOOTCONFIG +#ifdef CONFIG_KSU_SUSFS_OPEN_REDIRECT enabled_features |= (1 << 11); #endif -#ifdef CONFIG_KSU_SUSFS_OPEN_REDIRECT +#ifdef CONFIG_KSU_SUSFS_SUS_SU enabled_features |= (1 << 12); #endif -#ifdef CONFIG_KSU_SUSFS_SUS_SU - enabled_features |= (1 << 13); -#endif #ifdef CONFIG_KSU_SUSFS_HAS_MAGIC_MOUNT - enabled_features |= (1 << 14); + enabled_features |= (1 << 13); #endif error = copy_to_user((void __user*)arg3, (void*)&enabled_features, sizeof(enabled_features)); pr_info("susfs: CMD_SUSFS_SHOW_ENABLED_FEATURES -> ret: %d\n", error); diff --git a/kernel/sucompat.c b/kernel/sucompat.c index 974d0467..ad74bf97 100644 --- a/kernel/sucompat.c +++ b/kernel/sucompat.c @@ -30,9 +30,13 @@ extern void ksu_escape_to_root(); +static const char sh_path[] = "/system/bin/sh"; +static const char ksud_path[] = KSUD_PATH; +static const char su[] = SU_PATH; + bool ksu_sucompat_hook_state __read_mostly = true; -static void __user *userspace_stack_buffer(const void *d, size_t len) +static inline void __user *userspace_stack_buffer(const void *d, size_t len) { /* To avoid having to mmap a page in userspace, just write below the stack * pointer. */ @@ -41,17 +45,13 @@ static void __user *userspace_stack_buffer(const void *d, size_t len) return copy_to_user(p, d, len) ? NULL : p; } -static char __user *sh_user_path(void) +static inline char __user *sh_user_path(void) { - static const char sh_path[] = "/system/bin/sh"; - return userspace_stack_buffer(sh_path, sizeof(sh_path)); } -static char __user *ksud_user_path(void) +static inline char __user *ksud_user_path(void) { - static const char ksud_path[] = KSUD_PATH; - return userspace_stack_buffer(ksud_path, sizeof(ksud_path)); } @@ -59,8 +59,6 @@ int ksu_handle_faccessat(int *dfd, const char __user **filename_user, int *mode, int *__unused_flags) { - const char su[] = SU_PATH; - #ifndef CONFIG_KSU_KPROBES_HOOK if (!ksu_sucompat_hook_state) { return 0; @@ -85,8 +83,6 @@ int ksu_handle_faccessat(int *dfd, const char __user **filename_user, int *mode, #if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0) && defined(CONFIG_KSU_SUSFS_SUS_SU) struct filename* susfs_ksu_handle_stat(int *dfd, const char __user **filename_user, int *flags) { - // const char sh[] = SH_PATH; - const char su[] = SU_PATH; struct filename *name = getname_flags(*filename_user, getname_statx_lookup_flags(*flags), NULL); if (unlikely(IS_ERR(name) || name->name == NULL)) { @@ -110,8 +106,6 @@ struct filename* susfs_ksu_handle_stat(int *dfd, const char __user **filename_us int ksu_handle_stat(int *dfd, const char __user **filename_user, int *flags) { - // const char sh[] = SH_PATH; - const char su[] = SU_PATH; #ifndef CONFIG_KSU_KPROBES_HOOK if (!ksu_sucompat_hook_state) { @@ -160,8 +154,6 @@ int ksu_handle_execveat_sucompat(int *fd, struct filename **filename_ptr, int *__never_use_flags) { struct filename *filename; - const char sh[] = KSUD_PATH; - const char su[] = SU_PATH; #ifndef CONFIG_KSU_KPROBES_HOOK if (!ksu_sucompat_hook_state) { @@ -184,7 +176,7 @@ int ksu_handle_execveat_sucompat(int *fd, struct filename **filename_ptr, return 0; pr_info("do_execveat_common su found\n"); - memcpy((void *)filename->name, sh, sizeof(sh)); + memcpy((void *)filename->name, ksud_path, sizeof(ksud_path)); ksu_escape_to_root(); @@ -195,7 +187,7 @@ int ksu_handle_execve_sucompat(int *fd, const char __user **filename_user, void *__never_use_argv, void *__never_use_envp, int *__never_use_flags) { - const char su[] = SU_PATH; + // const char su[] = SU_PATH; char path[sizeof(su) + 1]; #ifndef CONFIG_KSU_KPROBES_HOOK