2011-04-05 25 views
3

我目前正試圖弄清楚SUID位和相應的函數seteuid和geteuid是如何工作的。所以我寫了這個小程序:seteuid/geteuid:程序總是有root ID

#include <unistd.h> 
#include <stdlib.h> 
#include <stdio.h> 
#include <errno.h> 

int main(int argc, char **argv) { 

    printf("oldid %d\n", geteuid()); 
    if(seteuid(0) == -1) 
     perror("seteuid faied"); 
    printf("newid %d\n", geteuid()); 

    return 0; 

} 

編譯它,改變它的所有者爲root和s位的文件的所有者:

[[email protected] Test]$ ls -l test 
-rwsr-xr-x 1 root root 4830 Apr 5 07:56 test 

但隨後產生的輸出如下:

[[email protected] Test]$ ./test 
oldid 0 
newid 0 

而這是我不明白的。根據我所發現的,第一次調用geteuid應該返回這個程序調用者的用戶標識(即chris - 我的標識爲1000),但是程序顯示root爲有效的用戶標識。任何人都可以解釋爲什麼這種情況?

回答

7

geteuid()手冊頁在我的Mac(OS X 10.6.7):

實際用戶ID是誰已經調用該程序的用戶的。由於有效用戶ID在執行「set-user-ID」模式進程期間爲進程提供額外權限,因此使用getuid()來確定調用進程的真實用戶標識。

既然你已經設置了suid位,該程序的有效用戶ID從開始執行文件所有者(根)。

+0

好的,謝謝(該信息不在我的聯機幫助頁中)。但是這個概念似乎毫無用處?假設我的程序中有一小段代碼,我想用root權限執行。我的計劃是讓root作爲整個程序的所有者,設置SUID位,並且只改變小部分的有效用戶ID ......那麼我該如何實現呢? – Chris 2011-04-05 08:26:37

+0

@Chris:這是一個很大的話題,可能因您的操作系統而異。在Mac OS X上,一般的策略總是被用來具有一個單獨的程序,該程序需要特權並使該setuid程序成爲可能。主程序將fork和exec來運行單獨的程序。這使得setuid部分非常小,不太可能存在安全漏洞。 – JeremyP 2011-04-05 10:10:56

+0

@Chris:OS X的最佳實踐是創建一個以root用戶身份運行的啓動守護程序,並使用它來通過Unix域套接字爲請求提供服務。無論是舊方式還是新方式,您都需要在特權代碼中對用戶進行身份驗證,以確保他們有權執行操作(OS X提供了一個API來執行此操作)。 – JeremyP 2011-04-05 10:12:40