7

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

4

2 回答 2

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) */
于 2012-10-27T23:22:36.183 回答
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)).

于 2017-08-21T13:41:22.273 回答