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