権限のないユーザーが実行可能ファイルの所有者またはグループを変更したときに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_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().

関連情報