我有一个task_struct *
,我通过致电find_task_by_vpid(get_pid())
。我想弄清楚哪个用户拥有这个进程,以便我可以在我正在编写的系统调用中进行一些权限检查,但是通过task_struct
查看源代码并没有多大帮助。唯一有用的是loginuid
,但由于某种原因,如果我试图像这样访问内核,内核将无法编译:my_task_struct->loginuid
。是否有另一种方法让用户从task_struct
中调用该进程?有没有办法找出用户拥有进程的task_struct中的进程?
7
A
回答
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
访问用户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))
。
相关问题
- 1. C++ | Windows - 有没有办法找出哪个进程拥有锁定文件的所有权?
- 2. 内核:如何从进程的task_struct中找到所有线程?
- 3. 有没有办法找到socket对等进程的pid?
- 4. 有没有办法限制进程的输出文件数量?
- 5. 有没有办法在Perl中拥有托管进程(即实际可用的线程替换)?
- 6. 有没有办法用远程工作目录启动进程?
- 7. 有没有办法修改C#中的进程DACL
- 8. 有没有办法找到进程使用的端口,给定它的进程ID,使用java?
- 9. 有没有办法与另一个进程的Clojure REPL进程交谈?
- 10. 有没有办法打印调用我的C二进制进程的PID
- 11. 有没有办法找出程序使用的winform/wpf组件?
- 12. 有没有办法让用户进入另一个应用程序的市场?
- 13. Python终止用户拥有的所有进程
- 14. 有没有办法限制运行的R进程的数量
- 15. 有没有办法找出谁在Glassfish上进行远程调试?
- 16. 有没有办法在不等待进程退出的情况下使用python子进程模块的Popen.communicate()?
- 17. 有没有办法查看特定进程的堆栈?
- 18. 有没有办法刷新正在运行的进程
- 19. 有没有办法让我的C++应用程序的进程ID?
- 20. 有没有办法使用Google文档进行协作编程?
- 21. 有没有办法用python启动/停止linux进程?
- 22. 有没有办法获得Docker守护进程REST API调用?
- 23. Android有没有办法在adb中显示进程优先级?
- 24. 有没有办法强制Firefox在新进程中启动?
- 25. 有没有办法在Visual Studio中进行Scala编程?
- 26. 在VS2008中,有没有办法自动“附加到进程”?
- 27. 有没有办法在子进程中运行节点任务?
- 28. 有没有办法在Grails Web框架中产生子进程?
- 29. 有没有办法阻止后台线程没有进程杀死Android?
- 30. 有没有办法标记我的Android应用程序进程“忙”?
看看'geteuid'的实现。不过,对于权限检查,您几乎可以肯定地希望使用现有的通用框架来处理这类事情,而不是制定与系统其他部分不一致的自己的逻辑。 – zwol
我使用'geteuid()'获取调用系统调用的用户的'euid',但我不知道如何使用它来获取'task_struct'的'uid'(或'euid')因为'pid'传入了系统调用本身。 – Mason