使用 EUID 是什麼意思?

使用 EUID 是什麼意思?

據我了解,

  • 魯伊德:進程呼叫者的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/shBash 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:作為一項安全措施,bash2 在啟動時會刪除權限。 (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 程序,或具有功能的程序)中使用,因為某些環境變數的奇怪值可能會被用來破壞系統完整性。

相關內容