2012-10-27 80 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))

相關問題