鍍金池/ 問答/C  Linux/ exec執(zhí)行的程序權(quán)限問題

exec執(zhí)行的程序權(quán)限問題

我用c語言封裝了一條cat /etc/shadow的命令,設(shè)置程序的的suid位并把它的屬主設(shè)為root,為什么以普通用戶執(zhí)行時,還是不能訪問/etc/shadow?難道是exec執(zhí)行新程序時不繼承suid屬性嗎?

// encapsulation.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>

int main(){
    printf("uid is %d\n", getuid());
    printf("euid is %d\n", geteuid());
    execlp("/bin/sh", "sh", "-c","echo $UID $EUID;/bin/cat /etc/shadow", (char*)NULL);
    return 0;
}


?  test gcc encapsulation.c -o encapsulation 
?  test ./encapsulation 
uid is 1000
euid is 1000

/bin/cat: /etc/shadow: Permission denied
?  test sudo chown root:root encapsulation
[sudo] password for inovker: 
?  test ./encapsulation 
uid is 1000
euid is 1000

/bin/cat: /etc/shadow: Permission denied
?  test sudo chmod u+s encapsulation
?  test ./encapsulation 
uid is 1000
euid is 0

/bin/cat: /etc/shadow: Permission denied
?  test sudo ./encapsulation 
uid is 0
euid is 0

root:!:17655:0:99999:7:::
daemon:*:17647:0:99999:7:::
bin:*:17647:0:99999:7:::
sys:*:17647:0:99999:7:::
sync:*:17647:0:99999:7:::
games:*:17647:0:99999:7:::
man:*:17647:0:99999:7:::
...
回答
編輯回答
夢囈

suid只對二進(jìn)制可執(zhí)行程序有效,如果你把編譯過后的encapsulation設(shè)置了4755權(quán)限,那么應(yīng)該是直接./encapsulation執(zhí)行有效

2017年9月4日 16:36
編輯回答
念舊

出于安全原因,bash是會檢查euid和uid的,發(fā)現(xiàn)不一樣就會切換回去,所以會出現(xiàn)Permission denied。

具體實(shí)現(xiàn)可以看bash代碼里的uidgetdisable_priv_mode。

解決方法是用bash的-p,打開特權(quán)模式。

execlp("/bin/sh", "sh", "-p", "-c","echo $UID $EUID;/bin/cat /etc/shadow", (char*)NULL);

或者直接不用bash,直接調(diào)用cat。

2017年8月27日 09:33