我正在阅读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().