diff --git a/kernel/ksud.c b/kernel/ksud.c index bc7a16b4..9e47ba9c 100644 --- a/kernel/ksud.c +++ b/kernel/ksud.c @@ -635,6 +635,31 @@ __maybe_unused int ksu_handle_execve_ksud(const char __user *filename_user, } #endif +#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 14, 0) +#include "objsec.h" // task_security_struct +bool is_ksu_transition(const struct task_security_struct *old_tsec, + const struct task_security_struct *new_tsec) +{ + static u32 ksu_sid; + char *secdata; + u32 seclen; + bool allowed = false; + + if (!ksu_execveat_hook) // not needed anymore once ksud ran + return false; + + if (!ksu_sid) + security_secctx_to_secid("u:r:su:s0", strlen("u:r:su:s0"), &ksu_sid); + + if (security_secid_to_secctx(old_tsec->sid, &secdata, &seclen)) + return false; + + allowed = (!strcmp("u:r:init:s0", secdata) && new_tsec->sid == ksu_sid); + security_release_secctx(secdata, seclen); + return allowed; +} +#endif + static void stop_vfs_read_hook() { #ifdef CONFIG_KSU_KPROBES_HOOK