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 0144a888da
commit e4285fcb25

View File

@@ -141,18 +141,23 @@ void escape_to_root(void)
{
struct cred *cred;
if (current_euid().val == 0) {
pr_warn("Already root, don't escape!\n");
return;
}
rcu_read_lock();
do {
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));
if (cred->euid.val == 0) {
pr_warn("Already root, don't escape!\n");
rcu_read_unlock();
return;
}
rcu_read_unlock();
struct root_profile *profile = ksu_get_root_profile(cred->uid.val);
@@ -184,7 +189,7 @@ void escape_to_root(void)
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
// When disabling Seccomp, ensure that current->sighand->siglock is held during the operation.
@@ -563,7 +568,7 @@ static void ksu_sys_umount(const char *mnt, int flags)
char __user *usermnt = (char __user *)mnt;
mm_segment_t old_fs;
int ret; // although asmlinkage long
old_fs = get_fs();
set_fs(KERNEL_DS);
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 17, 0)