diff --git a/kernel/Kconfig b/kernel/Kconfig index 8137651b..42dc5210 100644 --- a/kernel/Kconfig +++ b/kernel/Kconfig @@ -64,7 +64,7 @@ config KSU_SUSFS Patch and Enable SUSFS to kernel with KernelSU. config KSU_SUSFS_HAS_MAGIC_MOUNT - bool "Say yes if the current KernelSU repo has magic mount implemented (default n)" + bool "Say yes if the current KernelSU repo has magic mount implemented (default y)" depends on KSU default y help diff --git a/kernel/core_hook.c b/kernel/core_hook.c index e1db5d3f..20b87474 100644 --- a/kernel/core_hook.c +++ b/kernel/core_hook.c @@ -82,6 +82,12 @@ 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 +#ifdef CONFIG_KSU_SUSFS_SUS_SU +extern bool susfs_is_sus_su_ready; +extern int susfs_sus_su_working_mode; +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; @@ -116,15 +122,11 @@ pr_info("susfs_is_auto_add_try_umount_for_bind_mount_enabled: %d\n", susfs_is_au } #endif // #ifdef CONFIG_KSU_SUSFS -#ifdef CONFIG_KSU_SUSFS_SUS_SU -extern bool susfs_is_sus_su_ready; -#endif // #ifdef CONFIG_KSU_SUSFS_SUS_SU - static bool ksu_module_mounted = false; extern int ksu_handle_sepolicy(unsigned long arg3, void __user *arg4); -static bool ksu_su_compat_enabled = true; +bool ksu_su_compat_enabled = true; extern void ksu_sucompat_init(); extern void ksu_sucompat_exit(); @@ -920,6 +922,12 @@ int ksu_handle_prctl(int option, unsigned long arg2, unsigned long arg3, } if (enabled) { +#ifdef CONFIG_KSU_SUSFS_SUS_SU + // We disable all sus_su hook whenever user toggle on su_kps + susfs_is_sus_su_hooks_enabled = false; + ksu_devpts_hook = false; + susfs_sus_su_working_mode = SUS_SU_DISABLED; +#endif ksu_sucompat_init(); } else { ksu_sucompat_exit(); @@ -1110,11 +1118,7 @@ out_ksu_try_umount: current->pid); return 0; } -#ifdef CONFIG_KSU_DEBUG - // umount the target mnt - pr_info("handle umount for uid: %d, pid: %d\n", new_uid.val, - current->pid); -#endif + #ifdef CONFIG_KSU_SUSFS_TRY_UMOUNT // susfs come first, and lastly umount by ksu, make sure umount in reversed order @@ -1132,7 +1136,6 @@ out_ksu_try_umount: // try umount ksu temp path ksu_try_umount("/debug_ramdisk", false, MNT_DETACH); - ksu_try_umount("/sbin", false, MNT_DETACH); // try umount hosts file ksu_try_umount("/system/etc/hosts", false, MNT_DETACH); diff --git a/kernel/ksud.c b/kernel/ksud.c index 5048ee85..dc94ad11 100644 --- a/kernel/ksud.c +++ b/kernel/ksud.c @@ -60,7 +60,6 @@ bool ksu_input_hook __read_mostly = true; #endif #ifdef CONFIG_KSU_SUSFS_SUS_SU -bool ksu_devpts_hook = false; bool susfs_is_sus_su_ready = false; #endif // #ifdef CONFIG_KSU_SUSFS_SUS_SU diff --git a/kernel/sucompat.c b/kernel/sucompat.c index b52cc730..91f3a3e0 100644 --- a/kernel/sucompat.c +++ b/kernel/sucompat.c @@ -10,6 +10,9 @@ #include #if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 11, 0) #include +#ifdef CONFIG_KSU_SUSFS_SUS_SU +#include +#endif #else #include #endif @@ -421,21 +424,38 @@ void ksu_sucompat_exit() } #ifdef CONFIG_KSU_SUSFS_SUS_SU -extern bool ksu_devpts_hook; +extern bool ksu_su_compat_enabled; +bool ksu_devpts_hook = false; +bool susfs_is_sus_su_hooks_enabled __read_mostly = false; +int susfs_sus_su_working_mode = 0; + +static bool ksu_is_su_kps_enabled(void) { + for (int i = 0; i < ARRAY_SIZE(su_kps); i++) { + if (su_kps[i]) { + return true; + } + } + return false; +} void ksu_susfs_disable_sus_su(void) { - enable_kprobe(&execve_kp); - enable_kprobe(&newfstatat_kp); - enable_kprobe(&faccessat_kp); - enable_kprobe(&pts_unix98_lookup_kp); + susfs_is_sus_su_hooks_enabled = false; ksu_devpts_hook = false; + susfs_sus_su_working_mode = SUS_SU_DISABLED; + // Re-enable the su_kps for user, users need to toggle off the kprobe hooks again in ksu manager if they want it disabled. + if (!ksu_is_su_kps_enabled()) { + ksu_sucompat_init(); + ksu_su_compat_enabled = true; + } } void ksu_susfs_enable_sus_su(void) { - disable_kprobe(&execve_kp); - disable_kprobe(&newfstatat_kp); - disable_kprobe(&faccessat_kp); - disable_kprobe(&pts_unix98_lookup_kp); + if (ksu_is_su_kps_enabled()) { + ksu_sucompat_exit(); + ksu_su_compat_enabled = false; + } + susfs_is_sus_su_hooks_enabled = true; ksu_devpts_hook = true; + susfs_sus_su_working_mode = SUS_SU_WITH_HOOKS; } #endif // CONFIG_KSU_SUSFS_SUS_SU