據我了解,
- 魯伊德:進程呼叫者的uid稱為真實uid。
- 歐盟用戶識別碼:有效 uid 意味著該進程允許的權限。
// setuid_file.c
#include<stdio.h>
int main(void)
{
int uid;
uid=getuid();
printf("RUID : getuid() : %d\n",uid);
uid=geteuid();
printf("EUID : geteuid() : %d\n",uid);
system("whoami");
system("cat /etc/sudoers"); //only root user can access. here we can write any command which only root user can execute.
}
gcc setuid_file.c -o euid_zero
chmod ug+s euid_zero
因此,在 root 終端機上,我為 euid_zero 執行檔設定了 suid 和 guid。現在,我嘗試使用普通用戶運行可執行文件,然後下面是輸出。
ll euid_zero
-rwsr-sr-x 1 root root 16768 Dec 30 00:59 euid_zero
whoami
kali
id
uid=1000(kali) gid=1000(kali) groups=1000(kali)
./euid_zero
RUID : getuid() : 1000
EUID : geteuid() : 0
kali
cat: /etc/sudoers: Permission denied
所以,這裡 EUID 為零,那我們也無法取得 root 權限。那麼,根據RUID,我們就擁有了存取權限,那麼如果沒有使用EUID,EUID還有什麼意義呢?
答案1
它允許該過程暫時地根據需要提高和降低權限。
例如,檔案伺服器守護程式(smbd、ftpd)以 root 身分啟動,但隨後 seteuid() 為登入使用者的 EUID。現在,它可以在大部分時間使用登入使用者的 EUID 運行,讓核心應用檔案存取檢查,但仍能夠針對某些操作將其權限提升回 EUID 0。
但請注意,當您使用時system()
,這會透過以下方式呼叫命令/bin/sh
:Bash shell 故意放棄特權每當它偵測到 UID/EUID 不匹配時。你自己的setuid進程可以事實上,打開/etc/shadow
得很好——只有透過 system() 啟動的工具才能打開。
如果您將所有 system() 呼叫替換為 fork+exec,甚至是一個簡單的open("/etc/shadow", O_RDONLY)
,您將看到 RUID=1000 但 EUID=0 允許您存取該檔案。 (此外,您還將看到id
報告兩組 UID/GID。)
答案2
一般來說,EUID 本身是按照您的預期工作,這裡的「問題」在於system(3)
它sh
的使用。請參閱手冊(man 3 system
):
system()
事實上,在版本 2/bin/sh
的系統上,具有 set-user-ID 或 set-group-ID 權限的程式將無法正常運作bash
:作為一項安全措施,bash
2 在啟動時會刪除權限。 (Debian 使用不同的 shell,dash(1)
,當作為 呼叫時,它不會執行此操作sh
。)
事實證明手冊不是最新的。如今dash
表現得像bash
。坦白說,我不知道你的作業系統使用什麼外殼sh
(你標記了烏班圖, Ubuntu 使用dash
;但kali
在你的問題中可能會建議 Kali,我不確定 Kali 使用什麼)。查了一下ls -l /bin/sh
,應該是的dash
。不管它是什麼,它很可能會放棄特權,這就是您觀察到的原因Permission denied
。
即使您sh
沒有放棄特權,system()
也不是一個好主意。已經連結的手冊明確不建議這樣做:
不要
system()
從特權程序(set-user-ID 或 set-group-ID 程序,或具有功能的程序)中使用,因為某些環境變數的奇怪值可能會被用來破壞系統完整性。