[英]How to set the SUID bit to grant root privileges?
我的問題是超級初學者,在我的 C 程序中。 我想在創建原始套接字之前設置 SUID 位(root 權限),然后我想在創建它之后切換回正常權限。 在我使用命令sudo./client
運行我的代碼之前,它賦予了整個可執行的 root 權限。 我只想將 root 權限授予創建套接字的位置,以便我可以簡單地使用./client
運行我的代碼。
編輯:意識到我必須為我希望可執行文件的行為設置 SUID 位而不是粘性位。
問題的原始版本將粘性位( S_ISVTX
)與 SUID 或設置 UID 位( S_ISUID
)混淆了。 它已經被更新了。
要使程序在創建原始套接字時以 root 權限運行,您可以通過正常編譯它來創建可執行文件,然后讓root
獲得可執行文件的所有權( chown root./client
)並設置權限( chmod 4555./client
)。 請注意,權限是經過仔細選擇的,不允許任何組或其他人寫入程序(修改可執行文件)。 所有者root
沒有寫入權限這一事實並不能阻止root
寫入文件——盡管root
不想經常更改它。 通常, root
會將程序復制到普通用戶無法更改的某個目錄。 這可能是/usr/local/bin
,或者它可能在其他地方。
請注意,權限是在可執行文件上設置的,而不是源代碼(請參閱問題的原始版本),並且必須在程序運行之前設置。
在程序內部,在創建原始套接字之后,您可以刪除root
權限,從而避免之后代碼中的許多安全問題,方法是執行: setuid(getuid())
。 這會將有效 UID 更改回與真實 UID 相同的狀態。 請注意, setuid()
的 POSIX 規范說:
如果進程具有適當的權限,
setuid()
應將調用進程的真實用戶 ID、有效用戶 ID 和保存的 set-user-ID 設置為uid 。
SUID 到root
的程序具有“適當的權限”; 沒有回頭路了。 使用seteuid()
(如最初建議的那樣)不如使用setuid()
安全。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.