為什麼當非特權使用者更改執行檔的擁有者或群組時,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().

相關內容