2012-10-27 42 views
7

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

+1

看看'geteuid'的实现。不过,对于权限检查,您几乎可以肯定地希望使用现有的通用框架来处理这类事情,而不是制定与系统其他部分不一致的自己的逻辑。 – zwol

+0

我使用'geteuid()'获取调用系统调用的用户的'euid',但我不知道如何使用它来获取'task_struct'的'uid'(或'euid')因为'pid'传入了系统调用本身。 – Mason

回答

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) */ 
+0

谢谢,这真的很有帮助。你知道如何初始化初始化user_struct吗? – saman

+0

@saman:不是正确的,但要去查找'setuid()'的代码等等,你应该看到它的一些例子。 –

+0

@R ..我只能在unistd.h中找到setuid系统调用的声明,但我找不到这个系统调用的实现[here](http://stackoverflow.com/questions/27594865/add-other字段到用户结构)是我的问题,你能回答它吗? – saman

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))

相关问题