2014-09-19 75 views
0

我寫了這個功能:setuid或setgid失敗

void setugid(uid_t uid, gid_t gid) { 
    uid_t euid = geteuid(); 
    gid_t egid = getegid(); 

    if (setgid(gid) < 0 || setuid(uid) < 0) 
     assert(0); 
} 

斷言被執行死刑。在覈心轉儲我發現這個變量值:

uid = 8 

gid = 12 

euid = 0 

egid = 0 

8和12是正確的ID。當setuid後跟setgid時,我看到了這樣的問題。但不是在我的情況。問題是什麼?

我發現了這個問題。 id爲8的用戶已達到其執行進程的限制。

+4

如果系統調用失敗,您應該檢查['errno'](http://man7.org/linux/man-pages/man3/errno.3.html)以查看*失敗*。你可以使用['perror'](http://man7.org/linux/man-pages/man3/perror.3.html)來打印錯誤,或['strerror'](http://man7.org /linux/man-pages/man3/strerror.3.html)來獲取一個字符串。還請閱讀['setuid'](http://man7.org/linux/man-pages/man2/setuid.2.html)和['setgid'](http://man7.org/linux/man- pages/man2/setgid.2.html)手冊頁。 – 2014-09-19 10:15:23

回答

2

你應該真的修改你的程序來顯示系統調用返回的錯誤。

如果進程的EUID確實爲0,那麼如果程序沒有權限更改UID或GID(CAP_SETUOD和CAP_SETGID功能),或者如果您要更改的UID已達到其進程限制因此不能再有一個過程。

我建議改變你的函數調用setuid()setgid()之前打印過程的EUID,並打印errno是否有這些呼叫失敗。

0

我發現了這個問題。 id爲8的用戶已達到其執行進程的限制。