2016-08-28 37 views
2

我有以下代碼:的setuid()返回0,但沒有任何效果

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

void main(int argc, char* argv[]) { 
    printf("uid=%u euid=%u\n", getuid(), geteuid()); 
    printf("%d = setuid(euid)\n", setuid(geteuid())); 
    printf("uid=%u euid=%u\n", getuid(), geteuid()); 
} 

編譯和運行這樣:

[email protected]:/tmp $ sudo gcc foo.c 
[email protected]:/tmp $ sudo chown dev-misc:dev-misc a.out 
[email protected]:/tmp $ sudo chmod u+s a.out 
[email protected]:/tmp $ ./a.out 
uid=1000 euid=1006 
0 = setuid(euid) 
uid=1000 euid=1006 

爲什麼UID保持不變?爲什麼setuid報告成功? (根據手冊頁,0表示成功)

回答

1

setuid()設置有效的用戶標識,而不是真實的進程標識。來自manual

setuid()設置調用進程的有效用戶標識。如果主叫方的有效UID爲root(更確切地說,如果主叫方 具有CAP_SETUID功能),則也會設置真實UID和保存的用戶標識號 。

爲了能夠更改真實的用戶ID,過程必須將有效的用戶ID設置爲0.因爲在您的示例中情況並非如此,所以它不會更改。 setuid()成功,因爲您只是將其設置爲過程已有的相同有效用戶標識。

相關問題