我有一個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