为什么当非特权用户更改可执行文件的所有者或组时,S_ISUID 和 S_ISGID 模式位被清除

为什么当非特权用户更改可执行文件的所有者或组时,S_ISUID 和 S_ISGID 模式位被清除

我正在阅读man的页面chown。我不明白为什么当函数成功返回时应该清除模式S_ISUIDS_ISGID

答案1

我认为您是从手册页中指出这一点的:

当非特权用户更改可执行文件的所有者或组时,S_ISUID 和 S_ISGID 模式位将被清除。

那么为什么现在他们被清除了。您会发现它们仅在发生以下情况时才会被清除可执行文件文件。因为当设置其中一位(SUID/SGID)时,非特权用户可以作为文件的新所有者执行该文件。这将是一个巨大的安全漏洞。

答案2

我认为你误读了man 2 chown不必清除S_ISUIDS_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().

相关内容