我正在閱讀man
的頁面chown
。我不明白為什麼當函數成功返回時應該清除模式S_ISUID
。S_ISGID
答案1
我認為您從手冊頁中指出了這一點:
當非特權使用者變更可執行檔的擁有者或群組時,S_ISUID 和 S_ISGID 模式位元將會被清除。
那為什麼現在他們被清除了呢?您會發現它們僅在發生以下情況時才會被清除執行檔文件。因為當其中一位(SUID/SGID)被設定時,非特權使用者可以作為檔案的新擁有者執行該檔案。這將是一個巨大的安全漏洞。
答案2
我認為你誤讀了man 2 chown
:你不必清除S_ISUID
和S_ISGID
,當您作為非特權使用者使用該功能時,它們會自動清除。如果您的程式正在運行,則root
其行為(在 Linux 上)取決於核心版本。
如果您需要設定這些位,只需重新套用它們(假設嘗試設定它們的帳戶具有這樣做的權限)。
從手冊頁:
When the owner or group of an executable file are changed by an
unprivileged user the S_ISUID and S_ISGID mode bits are cleared.
POSIX does not specify whether this also should happen when root does
the chown(); the Linux behavior depends on the kernel version. In
case of a non-group-executable file (i.e., one for which the S_IXGRP
bit is not set) the S_ISGID bit indicates mandatory locking, and is
not cleared by a chown().