実行ファイルの所有者またはグループが権限のないユーザーによって変更されたときに、S_ISUID および S_ISGID モード ビットがクリアされる理由

実行ファイルの所有者またはグループが権限のないユーザーによって変更されたときに、S_ISUID および S_ISGID モード ビットがクリアされる理由

manのページを読んでいました。関数が正常に返されたときに、モードをクリアする必要がある理由chownがわかりません。S_ISUIDS_ISGID

答え1

man ページからこれを指摘していると思います:

実行可能ファイルの所有者またはグループが権限のないユーザーによって変更されると、S_ISUID および S_ISGID モード ビットがクリアされます。

ではなぜ今クリアされるのでしょうか。実行可能ファイル。いずれかのビット (SUID/SGID) が設定されている場合、権限のないユーザーがファイルの新しい所有者としてファイルを実行できるため、重大なセキュリティ侵害となります。

答え2

読み間違えたと思いますman 2 chown:あなたおよび をクリアする必要はありませんS_ISUIDS_ISGID権限のないユーザーとしてその関数を使用すると、自動的にクリアされます。プログラムが として実行されている場合、root動作 (Linux の場合) はカーネルのバージョンによって異なります。

ビットを設定する必要があるときは、ビットを再度適用するだけです (ビットを設定しようとするアカウントに権限があることを前提とします)。

man ページから:

  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().

関連情報