私は/sbin
にいますが、shutdown
にはrwxr-xr-x
の権限があることがわかりました。これは誰でも実行できるということではないのですか?
誰でもshutdown
を実行できますが、システムのシャットダウンをトリガーするにはroot権限が必要です。ただし、shutdown
はsetuidではないため、rootのみがを正常に実行できます実行します。 shutdown
プログラムは、権限をチェックして問題があるかどうかを通知するのに十分なほど優れていますが、システムのシャットダウンを単純に試みたとしても、何も起こりません。
GLENDOWER:私は広大な深さから霊を呼ぶことができます。
HOTSPUR:なぜ、私も、あるいは誰もができるのです。しかし、あなたが彼らを呼ぶときに彼らは来るでしょうか?
(Henry IVから)
shutdown
は/bin/rm
と同じです。誰でも実行できますが、通常のユーザーは/etc
、または別のユーザーのホームディレクトリを削除できません。
具体的には、root権限(実効UID 0)で実行されているプロセスだけが init system にシステムサービスを停止し、すべてのユーザープロセスを終了し、実際に system call を発行するように指示できます。機械を停止します。 (shutdown
がsetuidだった場合、誰が呼び出したとしてもrootとして実行されますが、そうではありません。)
GUIからshutdown
を呼び出すことについてはどうでしょうか。 control-alt-del?その場合、shutdown
はinit
によって直接開始され、root権限で実行されることを理解することが重要です。そのため、コンソールに近づくと全員がシャットダウンする可能性があります。これが望ましくない場合、control-alt-deleteは実際にはshutdown -a
を実行します。 (@ some1が回答で引用したドキュメントを参照してください)。これは、現在ログインしているユーザーがその実行を許可されているかどうかを確認するようshutdown
に指示しています。しかし、このシナリオではshutdown
がrootとして実行されているため、これは関係があります。
バイナリshutdown
自体が、UIDが0かどうかをチェックします。
次のstrace出力を参照してください。
strace /sbin/shutdown -r -h now
...
...
geteuid() = 10001
setuid(10001) = 0
getuid() = 10001
write(2, "shutdown: Need to be root\n", 26shutdown: Need to be root
) = 26
exit_group(1) = ?
はい !誰でもそのコマンドを実行できます。あなたが言ったように、それを実行することはできますが、permission denied
ではなく「Need to root」メッセージが表示されます。 shutdown
コマンドは、UID
をチェックして、rootであるかどうかを確認します。