Permissions

為什麼我們需要 SUID 權限?

  • September 25, 2018

請閱讀這篇長篇介紹以了解我對為什麼我們需要可執行二進製文件的 SUID 權限的擔憂。

  • Linux 中的程序使用其 EUID 來了解自身的有效使用者 ID
  • 此使用者的權限用於決定此程序如何與其他文件互動(例如,此程序是否可以寫入文件)

考慮通過更改密碼的場景/usr/bin/passwd

現實生活中的 Linux

  • 密碼儲存在/etc/shadow. 此文件root擁有權限 ( rw-------)
  • 如果 $passwd有權限rwx--x--x,這意味著只有root才能改變passwd程序的邏輯。
  • userA執行程序時,一個程序passwdRUID = EUID = userA開始

結果是:程序將執行。passwd 程序已啟動,但無法更改密碼,因為其EUIDuserAuserA無法寫入/etc/shadow.

這是需要 SUID 權限的時候。SUID允許在執行二進製文件以創建該程序時設置程序的EUID 。****EUID將設置為該二進製文件的所有者。

  • 為所有者設置SUID 權限/usr/bin/passwd使任何使用者啟動的任何程序的****EUID都採用EUIDpasswd root
  • 由於root可以寫入/etc/shadow,任何使用者都可以使用該passwd程序啟動一個可以更改的passwd 程序/etc/shadow

SUID 權限,因為在 Linux 中,程序的EUID不會硬設置為可執行二進製文件的所有者(執行時將創建該程序)

我理想中的 Linux

無需SUID 權限。如果執行檔binAuserA創建(並擁有) ,則任何可以執行binA的使用者都將創建一個EUID = userA程序

在修改密碼的場景下,這個構想的邏輯如下:

  • root是所有者,/usr/bin/passwd只有root可以更改其邏輯。
  • 裡面的邏輯/usr/bin/passwd只允許使用者更改其密碼,而不能更改其他人的密碼。
  • 其他使用者不能修改/usr/bin/passwd,只有root可以。
  • /etc/shadow只能由root

結果是:非特權使用者userA可以執行$passwd. 他會創建一個passwd 流程。此程序具有EUID = root,因此它可以寫入shadow文件。

有了這個理論,我們可以實現:每個人都可以在沒有SUID 權限的情況下更改自己的密碼(並且只能更改自己的密碼)。

您的兩個範例都說明了 setuid 的工作原理。但是,在您的“理想 Linux”中,每個執行檔都以執行檔所有者的 EUID 開頭,這將使您系統上的每個執行檔都成為 setuid 執行檔。

這顯然會導致很多問題,僅舉幾例:setuid()如果程序不應該具有任何額外權限,則每個 root 擁有的執行檔都需要進行 UID 檢查並呼叫將程序的 EUID 設置回非 root;使用者不能將執行檔提供給其他使用者,因為該程序會以錯誤的 EUID 執行;配置錯誤和不良做法會產生嚴重後果(例如chmod 777現在還允許訪問使用者擁有的任何文件)。這些還有更多。

沒有 setuid 二進製文件的正常權限需要一些其他機制來允許非特權使用者執行特權操作。Setuid 二進製文件允許這樣的特權提升和訪問控制在程序邏輯中實現。

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