![setuid 位似乎對 bash 沒有影響](https://rvso.com/image/31653/setuid%20%E4%BD%8D%E4%BC%BC%E4%B9%8E%E5%B0%8D%20bash%20%E6%B2%92%E6%9C%89%E5%BD%B1%E9%9F%BF.png)
我做了一些實驗,發現了一些奇怪的事情:在位於 的 bash 副本上設定 setuid 位元/usr/bin/bash-test
似乎沒有效果。當我運行 的實例時bash-test
,我的主目錄未設定為,並且當我從/root
運行命令時,我的用戶名未報告為,這表示它沒有以 root 身份運行。但是,如果我將 setuid 位元設為 on ,正如預期的那樣,我會被報告為任何 shell 中的 root。whoami
bash-test
root
bash-test
whoami
/usr/bin/bash
我也嘗試設定 setuid 位元並觀察到相同的行為。
當我設定 setuid 位元時,為什麼 bash 不能以 root 身分執行? selinux 可能與此有關嗎?
答案1
這個解釋有點煩人:bash 本身就是原因。strace
是我們的朋友(必須是 SUID root 才能正常工作):
getuid() = 1000
getgid() = 1001
geteuid() = 0
getegid() = 1001
setuid(1000) = 0
setgid(1001) = 0
bash 偵測到它已啟動 SUID root (UID!=EUID) 並使用其 root 權限丟棄此權限,將 EUID 重設為 UID。後來甚至還有 FSUID,只是為了確定......:
getuid() = 1000
setfsuid(1000) = 1000
getgid() = 1001
setfsgid(1001) = 1001
最後:沒有機會。您必須使用 UID root(即 sudo)啟動 bash。
編輯1
手冊頁是這樣說的:
如果 shell 以不等於真實使用者(群組)id 的有效使用者(群組)id 啟動,且未提供 -p 選項,則不會讀取啟動文件,shell 函數不會從環境繼承,SHELLOPTS 、BASHOPTS、CDPATH 和GLOBIGNORE變數如果出現在環境中,將被忽略,並且有效使用者ID 將設定為真實使用者ID。如果在呼叫時提供 -p 選項,則啟動行為是相同的,但不會重置有效使用者 ID。
但這對我不起作用。-p
啟動選項中甚至沒有提到。我也嘗試過--posix
;也沒有用。
答案2
無論如何,SUID root 程序才不是以 root 的環境運行($HOME
,shell 的配置,等等),它以 root 運行權力(即,它可以刪除任何文件,更改任何權限等)。