有没有办法从流程的task_struct中找出用户拥有流程的内容?

时间:2012-10-27 22:41:14

标签: multithreading process permissions linux-kernel pid

我通过拨打task_struct *得到find_task_by_vpid(get_pid())。我想弄清楚用户拥有该进程的内容,以便我可以在我正在编写的系统调用中进行一些权限检查,但查看task_struct源代码并没有多大帮助。唯一看起来有用的是loginuid,但由于某种原因,如果我尝试像这样访问它,内核将无法编译:{{1​​}}。是否有其他方法可以让从my_task_struct->loginuid

调用流程的用户

2 个答案:

答案 0 :(得分:7)

不幸的是,用户/组ID不再存储在任务结构中,而是存储在一个单独的权限结构中,该结构在具有相同ID的所有任务之间动态分配和共享。这反过来会造成setuid由于资源耗尽而失败的情况,setuid对权限的失败是臭名昭着的漏洞来源......

无论如何,它出现在task_struct

的这些成员中
    const struct cred __rcu *real_cred; /* objective and real subjective task
                                     * credentials (COW) */
    const struct cred __rcu *cred;  /* effective (overridable) subjective task
                                     * credentials (COW) */

答案 1 :(得分:0)

要访问内核空间中的用户ID(UID),您可以执行以下操作(从Linux 4.9.13开始):

struct task_struct *task;
for_each_process(task) {
    uid_t uid = __kuid_val(task_uid(task));
}

task_uid会返回一个名为kuid_t的结构,要访问实际值,您必须调用__kuid_val或直接访问它(task_uid(task).val)。

或者,您可以使用from_kuid(&init_user_ns, task_uid(task))