Linux

bash 可以使用 uid 0 和不同的 euid 執行嗎?

  • June 11, 2020

我正在編寫一些bash程式碼,我想檢查腳本是否具有 root 權限。我從其他人那裡看到的所有程式碼都只檢查$EUID == 0. 完全有可能讓其他程序以 UID = 0 和 EUID > 0 執行。我的程式碼不應該同時檢查兩者嗎?或者 bash 有什麼東西可以防止這種(奇怪的)情況發生嗎?

對於那些想看到這種情況的人,這裡有一個概念證明:

[root@new-host bennett]# cp /bin/sleep .
[root@new-host bennett]# chown bennett sleep
[root@new-host bennett]# chmod 4755 sleep
[root@new-host bennett]# ll sleep 
-rwsr-xr-x. 1 bennett root 32188 Sep  9 02:38 sleep
[root@new-host bennett]# ./sleep 1000 &
[root@new-host bennett]# ps -e -o user= -o ruser= -o comm= | awk '$1 != $2'
bennett  root     sleep

概括一下這個問題:在任何情況下都可能bash遇到(( $UID == 0 && $EUID > 0 ))什麼情況?其他程序可以。

是的:

$ env UID=0 EUID=90 bash -c 'echo $UID $EUID'
0 90

請注意,上面只是改變了變數的值。實際的UID 和 EUID 不受影響。

你應該id改用。參見問題How to stop a script from running if it’s not root (and echo “Not running as root! Exiting…”)

如果腳本設置了 set-uid 位,則有效使用者 ID 也將與真實 ID 不同(並且在您的 Unix 上執行此類腳本 set-uid 是一件事情)。在這種情況下,UID 將是呼叫腳本的使用者的 UID,而 EUID 將是腳本所有者的 UID。

相關:在 shell 腳本上允許 setuid

引用自:https://unix.stackexchange.com/questions/391265