Linux

為什麼 setuid 不起作用?

  • February 7, 2021

我想確保我的程序只能由xyz使用 root 權限的使用者執行。為此,我將 setuid 位設置為:

chmod u+s program1.sh
ls -l program1.sh
rwsr-x--- 1 root house 1299 May 15 23:54 program1.sh

另外,我將使用者添加xyzhouse組中,以便只有xyzroot 可以執行 program1.sh。

在 program1.sh 中有

id -u

這樣它就可以向我顯示有效的ID。

以 root 身份執行program1.sh,它顯示root. 但是使用該xyz帳戶執行,它顯示**xyz**. 它似乎沒有以root權限執行。我不知道這裡有什麼問題。

在執行具有 setuid 位的 shell 腳本時(例如,rwsr-xr-x 的權限),腳本以執行它們的使用者身份執行,而不是以擁有它們的使用者身份執行。這與對二進製文件(例如 /usr/bin/passwd)的 setuid 處理方式相反,二進製文件以擁有它們的使用者身份執行,而不管哪個使用者執行它們。

檢查此頁面:https://access.redhat.com/site/solutions/124693 這是作業系統採取的安全措施。您應該將腳本與sudo一起使用。

如果您真的需要在腳本中使用 setuid,您可以創建一個可執行的二進製文件。創建一個新文件“program.c”並複制以下程式碼:

  #include <stdio.h>
  #include <stdlib.h>
  #include <sys/types.h>
  #include <unistd.h>
    
  int main()
  {
    setuid(0);
    system("./program.sh"); #This line is dangerous: It allows an attacker to execute arbitrary code on your machine (even by accident).
    return 0;
  }

使用以下命令編譯並執行程式碼:

$ gcc program.c -o program
$ sudo chown root.root program
$ sudo chmod 4755 program
$ ./program

這樣它就會起作用。setuid 適用於編譯後的文件,該文件可以以 root 身份執行其他文件。

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