man
のページを読んでいました。関数が正常に返されたときに、モードをクリアする必要がある理由chown
がわかりません。S_ISUID
S_ISGID
答え1
man ページからこれを指摘していると思います:
実行可能ファイルの所有者またはグループが権限のないユーザーによって変更されると、S_ISUID および S_ISGID モード ビットがクリアされます。
ではなぜ今クリアされるのでしょうか。実行可能ファイル。いずれかのビット (SUID/SGID) が設定されている場合、権限のないユーザーがファイルの新しい所有者としてファイルを実行できるため、重大なセキュリティ侵害となります。
答え2
読み間違えたと思いますman 2 chown
:あなたおよび をクリアする必要はありませんS_ISUID
。S_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().