簡體   English   中英

如何設置 SUID 位以授予 root 權限?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM