ファイルの変更後に suid ビットが設定されない理由

ファイルの変更後に suid ビットが設定されない理由

誰でも書き込み可能な (s|g)uid ファイルがあります:

ls -lh suid_bin.sh
-rwsr-srwx 1 root root 168 mai   23 16:46 suid_bin.sh

非ルート ユーザー アカウントでログインします。vi (または別のエディター) を使用して "suid_bin.sh" を変更します。新しいコンテンツを保存すると、(s|g)uid ビットは設定解除されます。

ls -lh suid_bin.sh 
-rwxr-xrwx 1 root root 168 mai   23 16:46 suid_bin.sh

なぜですか? 変更後も (s|g)uid ビットを維持する方法はありますか?

答え1

Unix の権限では、誰かが誤って setuid ファイルにグループまたはワールド書き込み可能ビットを設定した場合にファイルへの書き込みが許可されますが、見知らぬ人がそのようなファイルの所有者 ID とグループ ID を変更することは許可されません。

したがって、変更後、カーネルはファイルから setuid/setgid ビットを削除して、ファイルに悪意のあるコードが書き込まれていないことを確認します。

もちろん、root ユーザーは setuid ビットを復元できますが、一般ユーザーは、誰かのミスで特権実行ファイルへの書き込みアクセス権を取得しても、それを悪用することはできません。

また、その領域のカーネルの一部を知っているので、カーネルのソース コードを編集して再コンパイルせずにそれを無効にできるかどうかはわかりません。

Linux の setuid スクリプトは実行後に setuid ステータスを取得しないことに注意してください。これは、実際にはカーネルがスクリプトのフルパスを最後に解析された引数として、setuid ステータスなしでスクリプト インタープリターを起動し、その後インタープリターがスクリプトを通常のファイルとして読み取るためです。ただし、これは他の Unix システムでは異なる場合があります。

関連情報