kernel: core_hook: refactor escape_to_root

- Remove BUG_ON, bail out when failed
- Add put_cred

Signed-off-by: rsuntk <rissu.ntk@gmail.com>
This commit is contained in:
backslashxx
2025-06-10 07:43:45 +07:00
committed by ShirkNeko
parent 0a5a024dc8
commit 1726d0da58

View File

@@ -217,18 +217,23 @@ void ksu_escape_to_root(void)
{ {
struct cred *cred; struct cred *cred;
if (current_euid().val == 0) {
pr_warn("Already root, don't escape!\n");
return;
}
rcu_read_lock(); rcu_read_lock();
do { do {
cred = (struct cred *)__task_cred((current)); cred = (struct cred *)__task_cred((current));
BUG_ON(!cred); if (!cred) {
pr_err("%s: cred is NULL! bailing out..\n", __func__);
rcu_read_unlock();
return;
}
} while (!get_cred_rcu(cred)); } while (!get_cred_rcu(cred));
if (cred->euid.val == 0) { rcu_read_unlock();
pr_warn("Already root, don't escape!\n");
rcu_read_unlock();
return;
}
struct root_profile *profile = ksu_get_root_profile(cred->uid.val); struct root_profile *profile = ksu_get_root_profile(cred->uid.val);
@@ -259,8 +264,8 @@ void ksu_escape_to_root(void)
sizeof(cred->cap_bset)); sizeof(cred->cap_bset));
setup_groups(profile, cred); setup_groups(profile, cred);
rcu_read_unlock(); put_cred(cred); // - release here - include/linux/cred.h
// Refer to kernel/seccomp.c: seccomp_set_mode_strict // Refer to kernel/seccomp.c: seccomp_set_mode_strict
// When disabling Seccomp, ensure that current->sighand->siglock is held during the operation. // When disabling Seccomp, ensure that current->sighand->siglock is held during the operation.
@@ -989,7 +994,7 @@ static void ksu_sys_umount(const char *mnt, int flags)
char __user *usermnt = (char __user *)mnt; char __user *usermnt = (char __user *)mnt;
mm_segment_t old_fs; mm_segment_t old_fs;
int ret; // although asmlinkage long int ret; // although asmlinkage long
old_fs = get_fs(); old_fs = get_fs();
set_fs(KERNEL_DS); set_fs(KERNEL_DS);
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 17, 0) #if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 17, 0)